一、实验目的
(1)了解抽象数据类型(ADT)的基本概念和及描述方法
(2)熟悉文件的读写操作
(3)熟悉C/C++语言语法及程序设计,为以后章节的学习打下基础
二、实验相关知识
(1)C/C++语言程序设计基础
(2)结构体类型定义
三、实验题目
(1)编写算法,从文件(in.txt)中读取整数n(1<=n<=1000),x(1<=x<=1000)和ai(i=0,1,2,3,…n)的值,求一元多项式的值,并将该值输出。(假设多项式每一项的值以及和均不超过int型的范围)
测试用例:
输入 |
2 1 2 3 4 |
3 2 -1 -2 0 5 |
4 2 2 1 0 0 0 |
输出 |
9 |
35 |
4 |
【实现要求】算法中不能使用求幂函数。
#include<stdio.h>
#include<stdlib.h>
#define SOURCEFILE "in.txt"
int Getdata(int &n, int &x, int *a);
int Pow(int x, int n);
int main()
{
int a[10];
int n;
int x;
int result = 0;
Getdata(n, x, a);
printf("%d %d", n, x);
for (int i = 0; i <= n; i++)
{
printf(" %d", a[i]);
}
printf("\n");
for (int i = 0; i <= n; i++)
{
result += a[i] * Pow(x, i);
}
printf("%d\n",result);
}
int Getdata(int &n, int &x, int *a)
{
FILE *fp;
if ((fp = fopen(SOURCEFILE, "r")) == NULL)
{
printf("读取失败!\n");
return 0;
}
int i = 0;
fscanf_s(fp, "%3d", &n);
fscanf_s(fp, "%3d", &x);
while (!feof(fp) && i <= n)
{
fscanf_s(fp, "%d", &a[i]);
i++;
}
fclose(fp);
return 1;
}
int Pow(int x, int n)
{
int result = x;
if (n == 0)
return 1;
else if (n == 1)
return x;
else
{
for (int i = 2; i <= n; i++)
{
result *= x;
}
return result;
}
}
(2)编写算法,按字节读取图像文件,并统计各字节出现的频度(即次数)。
可参考使用下面的结构体来保存字节的信息
struct colorinfo
{
unsigned char color; //对应的字节,其中unsigned char无符号字符,一个字节
long count; //对应出现的次数,注意类型,切不可用int
};
如:白色 #FFFFFF
可参考使用以下函数:
l fopen:以字节流只读的方式打开,参考格式FILE *fp=fopen(filename,”rb”)
l fread:读取二进制文件,包含在头文件 stdio.h,参考格式fread ( void *buffer, size_t size, size_t count, FILE *stream) ,其中参数:buffer 为接收数据的地址,size 为一个单元的大小,count 为单元个数,stream为文件流
l feof:既可用以判断二进制文件又可用以判断文本文件是否结束,包含在 stdio.h。函数原型:int feof(FILE *stream),其中参数:FILE 结构的指针。(注意最后一个元素会被多读一次)
测试用例:
graystart.bmp |
yellowstart.bmp |
|
C版:
#include<stdio.h>
#include<stdlib.h>
struct colorinfo
{
unsigned char color; //对应的字节,其中unsigned char无符号字符,一个字节
long count; //对应出现的次数,注意类型,切不可用int
}data[256];
void main()
{
FILE *fp=fopen("cod1.bmp","rb");
while (feof(fp) == 0)
{
int cTemp = fgetc(fp); //也可以fread(&c, 1, 1, fp),其中c是unsigned char类型
data[(int)cTemp].color = cTemp;
data[(int)cTemp].count++;
}
printf("字节下标\t字节值\t出现次数\t\n")
for (int i = 0; i < 256; i++)
{
if (data[i].count == 0)
{
continue;
}
else
{
printf("%d\t\t%02x\t %d\n", i, data[i].color, data[i].count);
}
}
}
C++版
#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
void main()
{
unsigned char a;
int count[256]={0};
ifstream in( "graystar.bmp", ios::binary);
in.seekg(0,in.beg);
while(!in.eof())
{
in.read((char*)(&a), sizeof(a));
count[a] ++;
}
in.close();
cout << "\t字节下标" << "\t字节值"<< "\t\t出现次数\n" ;
for (int i = 0; i < 256; i++)
{
if (count[i] != 0){
cout << "\t" << i << "\t\t";
cout << setw(2) << setfill('0') << hex <<i;
cout << "\t\t" << dec << count[i] << endl;
}
}
}