数据结构抽象数据类型ADT(二)求多项式的和、求图像字节频率

一、实验目的

1)了解抽象数据类型ADT)的基本概念和及描述方法

2)熟悉文件的读写操作

3熟悉C/C++语言语法及程序设计,为以后章节的学习打下基础

二、实验相关知识

1C/C++语言程序设计基础

2)结构体类型定义

三、实验题目

1)编写算法,从文件(in.txt)中读取整数n(1<=n<=1000)x(1<=x<=1000)aii=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;
			}
		} 
}  

猜你喜欢

转载自blog.csdn.net/weixin_42442713/article/details/80959436