算法与编程实习报告 下载本文

printf(\对26个字母一次统计并打印 printf(\ } } else {

read(); } }

运行结果:

六、实验心得

通过这次“统计字母使用的频率”算法编程的实习,我学习并掌握了函数的调用、

形参为指针或数组的传递方法以及读取文件数据的方法。同时,在编程过程中,也遇到了许多问题:

1.在文件调用的过程中,使用课本上的“while(ch!=EOF)”不能实现对文件结尾的判断,造成函数进入死循环,不能及时退出。 心得:当自己的程序出现逻辑错误且自己不知道错误的地点时,用调试的方法一步步观察程序的运行方式,就可以发现错误的原因并加以改正。 2.在输出字母及其使用频率的过成中,曾因为不知道运用转义字符而重新定义了一个数组用来存放a~z的英文字母,在一次翻书的过程中突然看见了转义字符的使用方法,从而使自己的程序大幅度的简化。

心得:虽然这并不属于程序的语法或逻辑错误,但这次经过使我明白了:程序的编译每个人可能都有不同的方法,但方法与方法之间是存在差别的,只有用心思考,才能以最简单明了的方式实现程序的功能。

第二题:四则运算

一、题目:四则运算

目的与要求

1.目的:

通过编写四则运算程序,培养学生综合利用C语言进行程序设计的能力,熟悉字符串的操作方法,加强函数的运用,提高软件系统分析能力和程序文档建立、归纳总结的能力。

2.基本要求:

1)要求用C语言编程,在Visual C++环境下调试完成;

2)要求按照程序功能分成几个功能模块来实现,各个功能模块分别使用函数来完成; 3)要求应用本课所讲授的程序设计语言知识来解决问题.

设计方法和基本原理

1.课题功能描述

本程序的功能,就是实现数的加减乘除四则运算,如自动计算3+5*8的结果。

2.问题详细描述

程序运行时,首先提示用户输入四则运算表达式(表达式中最多有3个运算符,数据范围为1-100的整数);

输入结束后,程序自动进行计算并给出结果。 如:输入13-10+5/8时输出3.625。

3.问题的解决方案

注意:问题的解决方案有很多,下面给出的仅供同学们参考。 该问题主要注意四则运算的优先级问题:乘除运算比加减运算优先级高,同级运算按从左到右的顺序运算。

本程序应采用模块化设计方法,设计几个功能模块。例如(仅供参考): ◆ 字符串解析函数(将输入字符串分解成数和运算符) ◆ 将数据(字符数组中)转换成十进制数(long)

◆ 判读是否存在高优先级运算符,若存在首先计算其运算结果并保存。 ◆ 同级运算按先后顺序进行。

创新要求

实现程序功能后,可进行创新设计:

1)使用多文件,即主函数和各个函数分别存放在不同的.c文件中,在头文件中进行函数原型声明;

2)在程序中增加自动出题功能及自动批卷功能 3)不限定运算符个数

4)允许括号运算的存在。

二、功能描述

本程序的功能,就是实现数的加减乘除四则运算,同时支持多重括号,算是的长度不超过20个运算符(可以修改数量)。而且,程序中包含自动出题及自动阅卷功能,对答错的问题会给出正确答案,最后会给出整体分数。

三、解决方案(流程图)

开始 Main函数 (变量的定义、函数的调用)N K=1? Y Ftext函数 (出题模式) Scan函数 (将字符型算式转化为数字型) Cal函数 (计算算式的值并输出) 结束

四、主要函数描述

1.main函数:变量的定义,模式的选择以及函数的调用。 2.disg函数:判断该字符是否为数字

3.scan函数:给运算符赋优先级,同时调用函数cal,向主函数返回最后计 算值 4.cal函数:计算算式的值并返回。 5.ftext函数:程序的出题模式

五、主要技术问题

程序如下:

#include #include #include #include #define N 20

struct yun //记录算式结构的结构体参数 {

char kind;//算式的算术类型 double a;//算式的第一个参数 double b;//算式的第二个参数 int flag;//算式的优先级

}y[N];//定义一个结构体数组,使每个y[N]中含以上4个参数 /*判断该字符是否为数字*/ int disg(char a) {

if(a>='0'&&a<='9') return(1); else return(0); }

/*计算算式的值*/

double cal(struct yun y[],int Minflag) {

int i=0,j=0; double temp;

while(Minflag<=1){ //最高优先级为括号外的'+'法运算,其优先级为1,故令Minflag<=1

for(i=0;y[i].b!=0;i++)//此循环用于计算一个符号的运算结果,并相应修改前后 { 运算符的参数

if(y[i].flag==Minflag)//按照优先级顺序计算 {

switch(y[i].kind){

case '+':temp=y[i].a+y[i].b;

y[i-1].b=y[i+1].a=temp;break; case '-':temp=y[i].a-y[i].b;

y[i-1].b=y[i+1].a=temp;break; case '*':temp=y[i].a*y[i].b;

y[i-1].b=y[i+1].a=temp;break; case '/':temp=y[i].a/y[i].b;