C语言四则运算测试程序设计报告

合集下载

四则运算实验报告

四则运算实验报告

实验3四则运算表达式求值背景在工资管理软件中,不可避免的要用到公式的定义及求值等问题。

对于数学表达式的计算,虽然可以直接对表达式进行扫描并按照优先级逐步计算,但也可以将中缀表达式转换为逆波兰表达式,这样更容易处理。

问题描述四则运算表达式求值,将四则运算表达式用中缀表达式,然后转换为后缀表达式,并计算结果。

基本要求使用二叉树来实现。

实现提示利用二叉树后序遍历来实现表达式的转换,同时可以使用实验2的结果来求解后缀表达式的值。

输入输出格式:输入:在字符界面上输入一个中缀表达式,回车表示结束。

输出:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔开;如果不正确,在字符界面上输出表达式错误提示。

选作内容(1)在输入输出方式上要求使用:输入:将中缀表达式存于文本文件中,程序从该文本文件中读出表达式。

输出:如果该中缀表达式正确,则将后缀表达式输出到该文件中原表达式的后面,它们之间用“---”后相连;如果不正确,请在输出表达式错误提示到该文件原表达式的后面,它们之间用“---”相连。

(2) 利用堆栈来实现中缀表达式转换为后缀表达式。

测试用例输入:21+23*(12-6)输出:21 23 12 6 -*+程序代码:#include <iostream>#include <string.h>using namespace std;#define SIZE 100#define STACKINCREMENT 10template<class T>//栈class stack{public:void InitStack() {S.base = (T *)malloc(SIZE * sizeof(T));if(!S.base) exit(0);S.top = S.base;S.stacksize = SIZE;}void DestroyStack(){free(S.base);}void ClearStack(){S.top = S.base;}bool StackEmpty(){if(S.top == S.base) return true;else return false;}int StackLength(){return (S.top - S.base);}bool GetTop(T &t){if(S.top != S.base){t = *(S.top - 1);return true;}else return false;}void Push(T t){if(S.top - S.base >= S.stacksize){S.base = (T *)realloc(S.base,(S.stacksize + STACKINCREMENT) * sizeof(T));if(!S.base) exit(0);S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top = t;S.top++ ;}bool Pop(T &t){if(S.top == S.base) return false;else S.top-- ;t = *S.top ;return true;}private:struct SqStack{T *base;T *top;int stacksize;}S;};class BiTree{private:struct BiTreeNode{char OPT[10];BiTreeNode *lchild,*rchild;};BiTreeNode *T; //T是根结点int index; //index是后缀表达式转换二叉树时的索引int number_of_point ;//销毁一颗树void DestroyTree(BiTreeNode *T){if(T){DestroyTree(T->lchild);DestroyTree(T->rchild);free(T);}}void DestroyTree(){DestroyTree(T);}//1表示栈顶优先级高于待入栈的元素int compare(char a,char b){ //定义了任意两个运算符的优先级if(a == '(' && b == ')') return 0;else if((a == '+' && b == '*') || (a == '+' && b == '/') || (a == '-' && b == '*') || (a == '-' && b == '/')|| (a != ')' && b == '(') || (a == '(' && b != ')'))return -1;else return 1;}//递归构造start,end分别是一个式子开始值和结束值的索引/*递归构造中缀表达式转化为的二叉树(利用栈) */void InorderCreate(BiTreeNode *&T,char str[30][10],int start,int end){ if(start == end) { //递归终止if(!(T = (BiTreeNode *)malloc(sizeof(BiTreeNode)))) exit(0);strcpy(T->OPT,str[start]);T->lchild = NULL;T->rchild = NULL;}else{stack<char> opt;stack<int> num;num.InitStack();opt.InitStack();char last;int index;int a;bool jump = false;for(int i = start;i <= end;i++) { //begin求解优先级最小的一个运算符if(jump) break;number_of_point = 0 ;if(IsNumber(str[i][0]) || str[i][0] == '-' &&IsNumber(str[i][1]) )continue;else{char c = str[i][0];char b;if(i == start && c == '(') {start += 1;continue;}else if(opt.StackEmpty() || (opt.GetTop(b) && compare(b,c) == -1)){opt.Push(c);num.Push(i);}else{if(c != ')'){opt.Pop(b);num.Pop(a);if(!opt.StackEmpty()){opt.GetTop(b);if(compare(b,c) == 1){opt.Pop(b);num.Pop(a);opt.Push(c);num.Push(i);}else{opt.Push(c);num.Push(i);}}else{opt.Push(c);num.Push(i);}}else{for(opt.GetTop(b);compare(b,c) != 0;opt.GetTop(b)){opt.Pop(b);num.Pop(a);if(opt.StackEmpty()){opt.Push(b);num.Push(a);end -= 1;jump =true;break;}}if(compare(b,c) == 0) {opt.Pop(b);num.Pop(a);}}}}} //end,得到的是该步中的根结点字符last及其索引indexopt.Pop(last);num.Pop(index);if(!opt.StackEmpty()){opt.Pop(last);num.Pop(index);}opt.DestroyStack();num.DestroyStack();if(!(T = (BiTreeNode *)malloc(sizeof(BiTreeNode)))) exit(0);T->OPT[0] = last;T->OPT[1] = '\0';InorderCreate(T->rchild,str,start,index-1);InorderCreate(T->lchild,str,index+1,end);}}bool IsNumber(char a){ //判断一个字符是否为数值形式的if( a == '.' && number_of_point == 0 ) {number_of_point ++ ;return true;}else if('0' <= a && a <= '9') return true ;else return false;}//递归求解树表示的表达式的值double Operate(BiTreeNode *T){if(T->lchild==NULL && T->rchild==NULL){double num = atof(T->OPT); //调用系统函数atof()将字符串转换为浮点数return num;}double ld,rd;ld = Operate(T->lchild);rd = Operate(T->rchild);char c = T->OPT[0];switch(c){case '+': return ld+rd;break;case '-': return rd-ld;break;case '*': return ld*rd;break;case '/': return rd/ld;break;default:cout << " you have entered wrong data ! "<< endl ;return 0;break ;}}void display(BiTreeNode *T){if(T == NULL ) return ;display(T->rchild);display(T->lchild);cout << T->OPT << " " ;public:BiTree() {T = NULL ;index = 0 ;number_of_point = 0 ;}/*以下两个函数重载私有成员函数方便计算*/void InorderCreate(){char OPT[30][10];cout << "输入中缀表达式: " << endl;char c = getchar();bool flag = true;int i = 0,j = 0 ;while(c != 10) { //输入的是空格j = 0;if(c == '-' && flag == true) { //flag判断是否是一个负数的值OPT[i][j++] = c;for(c = getchar() ; IsNumber(c) ; c = getchar() )OPT[i][j++] = c;OPT[i++][j] = '\0';flag = false;}else if(IsNumber(c)){OPT[i][j++] = c;for(c = getchar();IsNumber(c);c = getchar())OPT[i][j++] = c;OPT[i++][j] = '\0';flag = false;}else //运算符时的处理{flag = true;OPT[i][j++] = c;OPT[i++][j] = '\0';c = getchar();}}InorderCreate(T,OPT,0,i-1);}double Operate(){return Operate(T);}void display(){display(T) ;}~BiTree() {DestroyTree();};int main(){BiTree tree;tree.InorderCreate();cout << endl << tree.Operate() << endl;tree.display() ;cout << endl ;return 0;}测试结果:。

【7A版】四则运算表达式求值实验报告

【7A版】四则运算表达式求值实验报告

HUNANUNIVERSITY课程实习报告题目:四则运算表达式求值学生姓名:学生学号:专业班级:指导老师:完成日期:一、需求分析四则运算表达式求值,将四则运算表达式用中缀表达式表示,然后转换为后缀表达式,并计算结果。

本程序要求利用二叉树后序遍历来实现表达式的转换,同时可以使用实验2的结果来求解后缀表达式的值。

在字符界面上输入一个中缀表达式,回车表示结束。

如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔开;如果不正确,在字符界面上输出表达式错误提示。

测试数据输入:21+23G(12-6)输出:2123126-G+二、详细设计输入和输出的格式输入本程序可以将输入的四则运算表达式(中缀表达式)转换为后缀表达式输出后缀表达式为://输出结果的位置表达式的值为://输出结果的位置三、调试分析本次实验的难点主要是在建立二叉树的问题上。

关于如何把中缀表达式存入二叉树中,我参考了网上的一些方法,成功实现了目标,但是却遇到了一个问题,那就是不能处理小数,甚至两位或两位以上的整数。

因为如果采用字符数组来存储操作数,运算符合一位整数还可以处理,但对于两位数就就会出问题,最后我改进采用字符串数组来存储操作数,成功解决了问题。

另外在处理输入的非法表达式问题中,我也费了很大功夫,但总体问题不大。

四、测试结果五、用户使用说明(可选)1、运行程序时提示输入四则运算表达式本程序可以将中缀表达式转化为后缀表达式,并计算结果请输入四则运算表达式:输出后缀表达式为:表达式的值为:程序源代码(c++)#include<iostream>#include<string>#include<stack>#include<iomanip>constintMaG=100;usingnamespacestd;classNode{public:charch[MaG];//考虑到数值有时会是两位数,所以使用字符串数组NodeGlChild;NodeGrChild;Node(){strcpy(ch,"");lChild=rChild=NULL;}~Node(){if(lChild!=NULL)deletelChild;if(rChild!=NULL)deleterChild;}};staticintcount=0;staticchararray[MaG];//保存原始的中缀表达式staticcharstr[2GMaG];//保存后序遍历出来的字符串,为表达式求值提供方便staticintk=0;chargetOp(NodeGtemp);//temp指针保存每个结点,返回的是运算符NodeGcrtTree(NodeGroot);//传入根结点指针,返回根结点指针voidoutput(NodeGroot);//获得处理后的字符串boolisError(char);//判断字符是否有问题voiddeal();//对字符数组进行处理doublevalue(string);//计算后缀表达式,得到其结果。

C语言实验报告范文

C语言实验报告范文

C语言实验报告范文一、实验目的本实验旨在通过实际操作和编程,加深对C语言的理解和掌握,同时提高解决实际问题的能力。

二、实验内容1.利用C语言设计一个简单的计算器程序,实现简单的四则运算功能。

2.利用C语言设计一个简单的学生信息管理系统,实现添加、删除、修改和查询学生信息的功能。

三、实验步骤和代码实现1.计算器程序的设计与实现(1) 定义一个函数addition,传入两个参数,实现两数相加。

(2) 定义一个函数subtraction,传入两个参数,实现两数相减。

(3) 定义一个函数multiplication,传入两个参数,实现两数相乘。

(4) 定义一个函数division,传入两个参数,实现两数相除。

(5)在主函数中,通过用户的输入选择所需进行的运算,并输出结果。

代码如下:```C#include <stdio.h>float addition(float a, float b)return a + b;float subtraction(float a, float b)return a - b;float multiplication(float a, float b)return a * b;float division(float a, float b)if (b == 0)printf("Divisor cannot be zero!\n");return 0;}return a / b;int maiint choice;float num1, num2;printf("Please enter two numbers: ");scanf("%f%f", &num1, &num2);printf("Please choose the operation (1:addition, 2:subtraction, 3:multiplication, 4:division): ");scanf("%d", &choice);switch (choice)case 1:printf("The result is: %.2f\n", addition(num1, num2)); break;case 2:printf("The result is: %.2f\n", subtraction(num1, num2)); break;case 3:printf("The result is: %.2f\n", multiplication(num1, num2)); break;case 4:printf("The result is: %.2f\n", division(num1, num2)); break;default:printf("Invalid choice!\n");break;}return 0;```2.学生信息管理系统的设计与实现(1) 定义一个结构体Student,包含学生的姓名、学号、年龄等信息。

c实验报告

c实验报告

c实验报告实验报告:基于C语言的简易计算器设计一、设计目的:本实验旨在通过使用C语言进行编程,设计一个简易计算器,能够完成基本的四则运算。

二、设计要求:1. 实现加、减、乘、除四种基本运算的功能;2. 能够连续计算,并显示计算结果;3. 能够进行多层嵌套运算。

三、设计原理:1. 首先通过输入函数获取用户输入的数字和运算符;2. 然后通过switch语句判断用户选择的运算符,并执行相应的运算;3. 最后将计算结果输出。

四、设计步骤:1. 首先定义变量,包括两个操作数和一个运算符的字符型变量;2. 利用scanf函数分别获取用户输入的两个操作数和运算符,并进行赋值;3. 利用switch语句判断运算符,执行相应的运算,并将结果保存在一个结果变量中;4. 利用printf函数将计算结果输出。

五、设计代码:```c#include <stdio.h>int main() {double num1, num2, result;char operator;printf("请输入第一个操作数:");scanf("%lf", &num1);getchar(); // 清除缓冲区中的换行符printf("请输入运算符:");scanf("%c", &operator);getchar(); // 清除缓冲区中的换行符printf("请输入第二个操作数:");scanf("%lf", &num2);switch(operator) {case '+':result = num1 + num2;printf("计算结果:%lf\n", result); break;case '-':result = num1 - num2;printf("计算结果:%lf\n", result); break;case '*':result = num1 * num2;printf("计算结果:%lf\n", result);break;case '/':result = num1 / num2;printf("计算结果:%lf\n", result);break;default:printf("错误的运算符\n");break;}return 0;}```六、实验结果:运行程序后,按照提示依次输入操作数和运算符,然后程序会自动计算并显示结果。

实验报告长整数四则运算

实验报告长整数四则运算

实验报告:长整数四则运算实验者:唐怡04120082 题目:设计一个实现任意长的整数进行加法运算的演示程序一.需求分析1.本演示程序中,长整数为任意长的带符号的长整数的输入及求加法后输出的长整数形式为每四位一组,组间用逗号隔开,输入以“回车符”为结束标志。

2.程度执行的命令包括:1)构造整数1,2)构造整数2,3)做加法运算,4)结束3.测试数据(1)0;0;应输出“0”(2)-2345,6789;-7654,3211;应输出“-1,0000,0000”(3)-9999,9999;1,0000,0000,0000;应输出“9999,0000,0001”(4)1,0001,0001;-1,0001,0001;应输出“0”(5)1,0001,0001;-1,0001,0000;应输出“1”(6)-9999,9999,9999;-9999,9999,9999;应输出“-1,9999,9999,9998”(7)1,0000,9999,9999;1;应输出“1,0001,0000,0000”。

二.概要设计为实现上述程序功能,应以有序表实现长整数的存储,为此,需要抽象数据类型:有序表1.有序表的抽象数据类型定义为:ADT Dulinklist{数据对象:D={ai|ai为带符号整数,1,2,…,n,n>=0}数据关系:R1={<ai-1,ai>|ai-1,ai属于集合D,ai-1<ai,i=2,…..,n}基本操作:InitDulinklist(&)操作结果:构造一个空的有序表LDestroyDulinklist(&)初始条件:有序表L已存在操作结果:销毁有序表LDulinklistLength(L)初始条件:有序表L已存在操作结果:返回有序表L的长度DulinklistEmpty(L)初始条件:有序表L已存在操作结果:若有序表L为空表,则返回TUER,否则返回FALSEGetElem(L,pos)初始条件:有序表L已存在操作结果:若干1〈=POS〈=LENGTH(L),则返回有序表L中第POS个数据元素。

c语言四则运算实验报告

c语言四则运算实验报告

深圳大学实验报告课程名称: ________ C 语言实验 ________________实验名称: 100以内的四则运算游戏 _________学 院: ___________ 信息工程学院 ______________指导教师 ______________ 张金凤 __________________报告人: 王文杰 组号:]7 ________学号 2013130073 实验地点 教学楼D506实验时间: 2014 年 4 月 16 日提交时间: ___________ 2014.5.9 ____________________课程编号 1300050027一、实验目的一、学习和掌握c语言函数的泄义与调用:二、进一步掌握随机数、选择结构、循环控制、交互式输入输出等程序设计方法:三、进一步掌握c语言中的数组左义和引用方法:四、学习和掌握根据流程图进行模块化程序设计的思想*二、实验要求产生1到4之间的随机数,决定4则运算的符号,再产生两个0到99的随机数进行运算,并记录下做的题数以及正确的数目,当做题者输入n或N时退出程序并显示出完成题数及正确率。

int num2); int五、对流程图的简要说明:#include <std io. h> #include <stdlib. h> #include Htime. h" #include <conio. h> void max_min(int a, int b); randN1N2(int rN1f int rN2 ); rand0per4(); randL/ntlOO ();addLmt100(int num1vsubLmt100(int num1fmulLmt100(int num1fdivLmt100(int num1f/*主函数的功能如下:在主函数中调用上面定义的五个函数,在屏幕上随机循环出一道 100以内的四则运算题。

C语言四则运算测试程序设计报告

C语言四则运算测试程序设计报告

昆明理工大学《计算机程序设计基础》课程综合实践型教学课题报告课题名称:100以内的整数四则运算测试程序设计组长:学号 040401067 姓名周绍平组员:学号 040401070 姓名邓磊学号 040401106 姓名刘云路学号姓名学号姓名学号姓名学号姓名学院:信自学院专业班级:自动化0421 指导教师:耿植林昆明理工大学计算中心2005 年 6月18日昆明理工大学计算中心《计算机程序设计基础》课程综合实践型教学课题报告课程名称:100以内的整数四则运算测试程序设计正文内容:一、问题描述这是一个进行数学计算的程序,且要求拥有多种功能,包括(1)选项菜单集成各功能函数模块(2)出题(每次出10道题目)(3)答题并评分(4)答错的题给出正确答案(5)显示答卷。

总体看来,大多数功能要求调用错题,所以面临的两个难题便是出题和保存答题者做错的题以便其它函数调用。

另外,由于除法的特殊性——其除数不能为0。

又因为这是一个用于100以内整数的四则运算的程序,又对除法这个特殊成员提出了新的要求——要使得到的结果为整数。

所以有必要把除法单独拿出来作为一个函数处理。

二、问题分析这是一个任务很明确的程序设计—用于100以内的整数的四则运算。

这个程序要求拥有选项菜单、出题、答题评分、显示答卷、错题再解、重复练习的功能。

既然是一个用于计算的程序那它的主要作用就是给练习者答题,并验证答题的正确与否。

当然,还要有一些附加功能,比如:把答卷显示出来,错题给出正解,错题再抽出来再做。

这个程序只要求100以内的四则运算,所以随机出现的数字只能是100以内的,并且要求其为整数。

不论是数据的输入与输出,都要求其为整数。

鉴于这个程序所要求达到的功能,我们小组决定把它分为计算、菜单、答卷、重做、正解、评价、除法七个函数模块。

对各成员的分工如下:计算、正解和菜单(周绍平)评价和除法(邓磊)答卷和重做(刘云路)主函数及各函数的连接则由小组成员共同完成。

c++课程设计四则运算.doc

c++课程设计四则运算.doc

Vc++课程设计报告题目名称:四则运算班级:测控技术与仪器姓名:周赛学号:914101170150一、程序功能简介该程序用字符串形式接受一个带括号的四则运算表达式,然后按照四则运算优先级的算法先括号,后乘方、乘除、加减这样的顺序将这个算式解出。

该程序的设计比较巧妙,是在主程序中反复查找最后一对括号,将其中的结果计算出来,去掉括号,这样的过程持续下去,最后导致所有的括号都去除,解出算式。

二、课程设计要求(1)用类的要求改写程序,将数据和函数封装到类中。

(2)修改主程序,使程序可以反复运算,直到选择退出为止。

(3)扩充程序功能,使程序适合浮点数运算。

(4)增加程序的判断功能,当有非法的输入时(如字母等),给出提示信息并退出运算,当输入带有空格时,能将空格滤除。

三、程序设计思想(1)类的封装实际上该字符串类基本类似于c++中的string类,比string类多定义了浮点数与字符串的相互转换的函数,输入输出友元函数,可以从string类派生出CStr类,这样,类的定义就更加简单,且可以利用很多现成的成员函数。

(2)主程序结构算法的设置定义char类型的变量用来存储字符串,定义CStr类用于对字符串操作函数的引用。

先对输入字符串用Judge函数进行输入正确性的判断及取出空格内容;然后用charinstr函数在字符串中反复查找最后一对括号;用midstr函数提取出来,用calculate函数进行计算;并用left函数与right函数及addstrings函数将所找到这对括号的左边、右边及运算结果以字符串的形式合并成一个新的字符串;重复上述操作直至字符串中不再有括号;最后用calculate函数进行最后的计算返回计算结果。

紧接着进行是否退出计算的输入判断,完成程序反复运算的功能。

四、详细设计①判断功能:用类中定义的judge函数实现,返回值为1即合法,为0即不合法。

去除空格:定义p、s两个指针指向字符串,r指针指向p指针实现p、s指针在字符串中的遍历,用p指针找到第一处空格处,再用s指针找到p指向位置以后最近一个不是空格处,赋值语句*p=*s,继续向下遍历字符串直至结束。

C语言实验报告四则运算

C语言实验报告四则运算

《C语言》课内实验报告学生姓名:及学号:学院:班级:课程名称:C语言实验题目:实验二选择结构程序设计指导教师姓名及职称:年月日一、实验目的1.掌握逻辑表达式和if语句、嵌套的if语句、switch语句和break语句的格式、语义。

2.掌握选择结构程序设计方法。

二、实验内容编写程序实现两个数的四则运算,要求从键盘输入进行运算的两个数字以及相应的运算符('+'、'-'、'*'、'/'),程序给出算数表达式及运算结果。

(如下图所示,要求使用if语句和switch语句两种方法实现)三、实验结果1、流程图2、源程序(1)使用if语句#include <stdio.h>void main(){float a,b;char c;printf("please input two numbers:");scanf("%f%f",&a,&b);getchar();printf("\nplease input the operator:");//fflush(stdin);scanf("%c",&c);printf("\n");if(c=='+')printf("%10.2f+%10.2f=%10.2f\n",a,b,a+b);else if (c=='-')printf("%10.2f-%10.2f=%10.2f\n",a,b,a-b);else if (c=='*')printf("%10.2f*%10.2f=%10.2f\n",a,b,a*b);else if (c=='/')printf("%10.2f/%10.2f=%10.2f\n",a,b,a/b);elseprintf("Input error!\n");}(2)使用switch语句#include <stdio.h>void main(){float a,b;char c;printf("please input two numbers:");scanf("%f%f",&a,&b); //输入a,b的值getchar();printf("\nplease input the operator:"); //输入操作符scanf("%c",&c);printf("\n");switch(c) //判断输入操作符{case '+': //若操作符为'+',输出a+b printf("%10.2f+%10.2f=%10.2f\n",a,b,a+b);break;case '-': //若操作符为'-',输出a-b printf("%10.2f-%10.2f=%10.2f\n",a,b,a-b);break;case '*': //若操作符为'*',输出a*b printf("%10.2f*%10.2f=%10.2f\n",a,b,a*b);break;case '/': //若操作符为'/',输出a/b printf("%10.2f/%10.2f=%10.2f\n",a,b,a/b);break;default:printf("Input error!\n");}}2、运行结果输入12、13以及+,得到结果如下:输入12、13以及-,得到结果如下:输入12、13以及*,得到结果如下:输入12、13以及/,得到结果如下:输入12、13以及a,得到结果如下:3、结果分析题目要求编程实现两个数的四则运算,因此只需判断输入的操作符为四则运算中的哪一个,编程时可以使用if语句或者switch语句实现判断过程。

C语言四则运算

C语言四则运算

机电学部课程设计题目:小学生算术四那么运算测试程序姓名:黄超学号:202112110118班级:计算机科学与技术课程:程序设计方法学任课老师:顾保磊2021年6月28日课程设计任务书及成绩评定目录背景 (1)摘要 (1)功能要求................................................... . (2)设计流程 (3)程序执行 (4)程序 (5)程序 (6)程序 (7)程序 (8)实验结果 (9)实验结果 (10)实验心得…………………………………………....….. .11背景伴随着人类社会的进步,人们的计算工具也在不断的变化,从远古时期的结绳计数,到算筹,算盘,以及近代的机械计算机、计算尺,直至今天我们广泛运用的电子计算机。

计算工具的每一次进步,都导致科学技术发生深入的革命。

人类最初是用手指来作为记数和计算工具的。

在古代,人们还广泛地使用过筹码和结绳来作为记数和计算的工具,其中筹码可能采用石子、木棍、滑片等,每一个可以单独使用也可用工具在其刻上道使用。

我们中华民族的祖先,在公元前5世纪以前开场使用算筹。

利用算筹记数,用笔写下来就是筹算数字,当时这在世界上是非常先进的。

而作为我们的祖先对世界文明的重大奉献——四大创造之一的珠算盘,那么是人类经过设计加工,制造出来的第一种计算工具。

十六世纪以来,随着机械设计和制造程度的进步,同时也为了满足日益复杂的计算要求,许多科学家设计制造了以齿轮为主要构件的机械式计算机。

自从上个世纪四十年代电子计算机的创造,人类计算工具的开展进入了一个新纪元。

计算机以人类技术史上前所未有的高速度开展着,其主要构件由电子管、晶体管、集成电路,一直开展到运用超大规模集成电路。

计算机的计算速度也从每秒几千次算术计算,进步到每秒上万亿次算术计算。

摘要小学生四那么运算,是利用VC++软件编写的一程序,电脑可随机的出10道四那么运算题,每题非常。

答题者输入需要运算的数,其中要求算式面向小学1~2年纪,数的大小不超过50且运算的结果必须在0~50之间,答题者有三次答题时机,在这三次时机之内答出,系统会自动根据答案的正确与否,得出分数,按照相应的分数给出级别,80-90显示“GOOD〞,70-80显示“OK〞,60-70显示“PASS〞,60以下“TRY AGAIN〞功能要求题目:小学生算术四那么运算测试程序面向小学1~2年级学生,随机选择两个整数和加减法形成算式要求学生解答。

数据结构c语言版算术四则混合运算实验报告

数据结构c语言版算术四则混合运算实验报告

数据结构c语言版算术四则混合运算实验报告一、引言在计算机科学领域,算术四则运算是最基本的运算之一。

本实验旨在通过使用C语言编写程序,实现算术四则运算的混合运算功能。

通过该实验,我们可以提高对数据结构的理解,并掌握在C语言中实现算术四则混合运算的方法。

二、实验目的1. 理解算术四则运算的基本原理;2. 掌握数据结构在算术四则运算中的应用;3. 使用C语言编写程序,实现算术四则混合运算功能。

三、实验方法1. 首先,我们需要定义并实现一个栈数据结构,用于存储运算符和操作数;2. 然后,通过读取用户输入的表达式,将其中的运算符和操作数依次入栈;3. 在入栈的过程中,我们需要判断运算符的优先级,以确保正确的运算顺序;4. 最后,通过出栈的方式,按照正确的运算顺序进行运算,并输出结果。

四、实验步骤1. 定义并实现栈数据结构,包括入栈、出栈等基本操作;2. 读取用户输入的表达式,并将其中的运算符和操作数依次入栈;3. 根据运算符的优先级,确定出栈的顺序,并进行相应的运算;4. 将运算结果入栈,继续进行下一轮的运算,直到表达式中的所有运算符和操作数都被处理完毕;5. 最后,将最终的运算结果出栈,并输出。

五、实验结果通过本实验,我们成功实现了算术四则混合运算的功能。

经过多组测试,程序能够正确处理各种复杂的运算表达式,并给出正确的结果。

六、实验总结通过本次实验,我们进一步加深了对数据结构的理解,并成功将其应用于算术四则混合运算中。

我们掌握了C语言中实现算术四则混合运算的方法,并通过编写程序实现了该功能。

通过本次实验,我们不仅提高了对数据结构的应用能力,还提升了编程能力和问题解决能力。

在今后的学习和工作中,我们将继续深入研究数据结构和算法,不断提升自己的编程技术,为解决实际问题提供更好的解决方案。

七、致谢感谢指导老师对本实验的支持和指导,感谢实验室的同学们在实验过程中给予的帮助和建议。

本次实验的顺利完成离不开你们的支持与帮助。

C语言小学生四则运算考试系统课程设计

C语言小学生四则运算考试系统课程设计

C语言小学生四则运算考试系统课程设计代码部分:#include"stdio.h"#include "windows.h"#include<time.h>#include<stdlib.h>#include<conio.h>#define N 3struct stu{int num;char name[12];int score;}em[N],max;void input();void menu_admin();void search();void search_num();void search_name();void cal_score();void sort();void del();int *p;void mune_admin(){int k=0;printf("请根据提示选择:\n");printf("1.查询系统\n");printf("2.删除系统\n");printf("3.排序\n");scanf("%d",&k);switch(k){case 1:search();break;case 2:del();break;case 3:sort();break;}}void input(){int i;printf("请输入你的信息:\n");for(i=0;i<N;i++){printf("请输入学生的学号:\n");scanf("%d",&em[i].num);printf("请输入学生姓名:\n");scanf("%s",&em[i].name);printf("请完成下列题目得出你的成绩:\n");cal_score();em[i].score=*p;getchar();}mune_admin();}void cal_score(){int a[10],b[10],d[10],c[10],num=0,result,score=0;double va1;char fa[5]={'+','-','*','/'};p = &score;srand((unsigned)time(NULL)); // 出10道题10while(1) { d[num]=abs(rand())%4;// 保证出题算法的随机性while(1) // 保证出题成功{c[num]=-1; //保存计算结果a[num]=abs(rand())%100;b[num]=abs(rand())%100;if(d[num]==0) c[num]=a[num]+b[num];else if(d[num]==1) c[num]=a[num]-b[num];else if(d[num]==2) c[num]=a[num]*b[num];else if(d[num]==3){ if(b[num]>0){va1=1.0*a[num]/b[num]; }else { va1=-1; } }if(d[num]<=2){if(c[num]>=0 && c[num]<=100) // 保证计算结果在0-100之间27break;}else{if(a[num]==va1*b[num] && va1>=0){c[num]=va1; break;}}}num++;if(num==10) break;}num=0; //回答41while(1){printf("%d %c %d= ",a[num],fa[d[num]],b[num]);scanf("%d",&result);if(result==c[num]){printf("回答正确!\n");score+=10; }else printf("错误,正确答案: %d\n",c[num]);num++;if(num==10) break;}printf("\n成绩:%d\n",score);}void sort(){int i,j;printf("排序前:\n");for(i=0;i<N;i++){printf("学号\t姓名\t成绩\n");printf("%d\t%s\t%d\n",em[i].num,em[i].name,em[i].score);}for(i=0;i<N;i++){for(j=0;j<N-1;j++){if(em[j].score<em[j+1].score){max=em[j];em[j]=em[j+1];em[j+1]=max;}}}printf("排序后:\n");for(i=0;i<N;i++){printf("学号\t姓名\t成绩\n");printf("%d\t%s\t%d\n",em[i].num,em[i].name,em[i].score);}mune_admin();}void search(){int t=0;printf("请根据提示选择:\n");printf("1.学号查询\n");printf("2.姓名查询\n");printf("请输入你的选择1/2\n");scanf("%d",&t);switch(t){case 1:search_num();break;case 2:search_name();break;}mune_admin();}void search_num(){int num,i;printf("请输入你要查找的学号:");scanf("%d",&num);for(i=0;i<N;i++){if(num==em[i].num){printf("找到此人\n");printf("学号\t姓名\t成绩\n");printf("%d\t%s\t%d\n",em[i].num,em[i].name,em[i].score);break;}if(i==N-1){printf("查无此人\n");}}}void search_name(){char name[12];int i;printf("请输入你要查找的姓名:");scanf("%s",&name);for(i=0;i<N;i++){if(strcmp(em[i].name,name)==0){printf("找到此人\n");printf("学号\t姓名\t成绩\n");printf("%d\t%s\t%d\n",em[i].num,em[i].name,em[i].score);break;}if(i==N-1) {printf("查无此人\n");}}}void del(){int i,k,j,num;char a = '\0';printf("请输入你要删除的学号:");scanf("%d",&num);for(i=0;i<N;i++){if(num==em[i].num){printf("找到此人\n");printf("学号\t姓名\t成绩\n");printf("%d\t%s\t%d\n",em[i].num,em[i].name,em[i].score);printf("确认删除输入1 ,取消删除输入2\n");scanf("%s",&k);if(k==1){/* em[i].num=0;strcpy(em[i].name,a);em[i].score=0;*/for(j=i;j<N-1;j++){em[j].num=em[j+1].num;strcpy(em[j].name,em[j+1].name);em[j].score=em[j+1].score;}}else if(!k==1){break;}}}printf("删除后:\n");printf("学号\t姓名\t成绩\n");printf("%d\t%s\t%d\n",em[i].num,em[i].name,em[i].score);search();}void main(){input();}。

(完整word版)长整数四则运算实验报告

(完整word版)长整数四则运算实验报告

一、需求分析设计一个实现任意长的整数间进行四则运算的程序,要求完成长整数的加、减运算,乘除运算可选做。

在这里长整数没有范围限制,可任意长。

运算后的进位、借位等都要进行正确处理,可实现动态的输入,实时的输出。

测试数据:0、0;输出“0”2345,6789、-7654,3211;输出“1,0000,0000”1,0000,0000,0000、9999,9999;输出“9999,0000,0001”1,0001,0001、;1,0001,0001;输出“0”自选数据:1,1111;1,1111 输出“0”二、概要设计1、数据结构利用双向循环链表来实现对长整数的存储。

选择该数据结构来完成长整数的加减运算是因为a.要对长整数进行运算,需要对长整数进行存储,选择用链表对长整数存储。

b.存储的顺序是从左到右,运算的顺序则是从右到左,为操作方便选择循环链表。

c.在运算过程中有进位和借位的操作。

2、使用算法三、详细设计typedef struct DoubleNode //定义链表元素void InitNode(DLNode **head) //初始化链表int InsertNode(DLNode *head,int n,DataType x) //向链表第N个位置插入元素Xint digit(int n) //判断整数N有几位void PrintNode(DLNode *head) //打印链表void DestroyNode(DLNode **head)//销毁链表void add(DLNode *h1,DLNode *h2) //两数相加void jian(DLNode *h1,DLNode *h2) //两数相减int main() //入口函数四、调试分析由于在程序设计时,对于指针的不了解,编程时使用双重指针,无形中给自己增添了更多麻烦。

老师在检查的过程中指出并教导了这一点。

五、测试结果1、输入0和0做加法运算,输出“0”,结果如下图:2、输入2345,6789和-7654,3211做减法运算,输出“1,0000,0000”,结果如下图:3、输入1,0000,0000,0000和9999,9999做减法运算,输出“9999,0000,0001”,结果如下图:4、输入1,0001,0001和1,0001,0001做减法运算,输出“0”,结果如下图:5、输入1,1111和1,1111做减法运算,输出“0”结果如下图:六、心得体会本次实验主要是针对双向链表的练习,通过这次试验我们大家对于双向循环链表有了更深刻的记忆。

C语言计算器设计实验报告

C语言计算器设计实验报告

C语言计算器设计实验报告班级:11661 姓名:学号:38号一、实验目的:利用C语言编写一个简单的计算器,并能正确运行+,-,*,/四则运算。

二、实验内容:1、编写前分析;(1)、根据实验目的,要求键盘录入表达式,并运行后输出结果;由于键盘录入的表达式含数字和运算符,所以要选择用字符串数据类型输入。

(2)、由于输入的是字符串,而只有数值类型的数据才能参与运算,所以得把字符(串)类型的数据转换为数值类型的数据。

(3)、四则运算时,括号优先级高于乘除,乘除优先级高于加减,程序必须能正确判断其优先级才能得出正确的结果。

(4)、为了保证运行结果的精确度需正确选择所用变量的数据类型。

2、利用所学知识进一步分析以上内容;(1)、利用gets函数输入表达式,例如:gets(calc);(2)、C语言中将字符类型数据转化成数值类型数据方法很多,该程序利用函数库stdlib.h中的atof函数来实现这一目的。

同时注意主函数前加上预处理指令:#include<stdlib.h>。

(3)、为了能正确判断优先级,该程序利用函数间的多层嵌套,循环调用来实现;从优先级最高的括号开始判断,若有括号,再判断括号内部,若无括号判断是否为乘除,最后判断加减;括号内内容法方类似。

具体判断方法在后面将以实例详细介绍。

(4)、为了保证输出数据的精确度,该程序中函数f1()-f4()返回值均用double 类型;用g格式符输出最终结果让输出结果简明而又能保证其精确度。

3、开始编程:首先编写必要的预处理指令,声明必要的函数,定义必要的变量。

#include<stdio.h> (输入,输出函数需要该指令);#include<stdlib.h> (atof函数需要该指令);全局声明:Double f1(); (用于存放最终输出结果);Char calc[n]; (用于存放输入的表达式);Int n; (用于标注clac中的各个元素);编写主函数:int main(void){printf("请输入表达式:\n");gets(calc);(输入表达式)printf("原式=%g\n",f1());(程序将调用f1(),并输出f1()的结果)return(0);}由于四则运算先算出优先级最高的结果,并对同一优先级采用从左到右的顺序计算,所以最终的运算是对表达式进行加减运算。

深圳大学C程序设计Lab Assignment3实验报告(四则运算)

深圳大学C程序设计Lab Assignment3实验报告(四则运算)

附件(四)本文档仅限于学习交流,禁止抄袭。

程序结果截图非本人信息,请自行修改。

深圳大学实验报告课程名称:C程序设计实验名称:Lab Assignment 3学院:信息工程学院专业:指导教师:报告人:报告人学号:班级:实验时间:报告提交时间:教务处制四、实验结果与数据分析:1.首先,这次实验把我最近学的知识穿插了起来,让我进一步掌握了随机数、选择结构、循环控制、交互式输入输出等程序设计方法。

2.我认识到了写代码的重要性,例如空格,空行,缩进等细节。

因为做到了这些细节,程序一旦发生了错误,修改的时候很容易下手,一目了然,别人看着也舒服。

3.我学会了用visio软件画流程图,这个软件简单快捷易操作。

(注:“指导教师批阅意见”栏请单独放置一页)指导教师批阅意见:实验报告内容完整性(20分)实验数据准确性(程序与程序运行结果)(30分)实验结果与数据分析(20分)实验报告(格式规范、按时完成)(20分)实验态度(实验课考勤、实验表现)(10分)完整20 较完整15不完整10准确30较准确20不够准确10正确20较正确10不正确规范20较规范15不够规范10好10较好5一般2说明:说明:说明:说明:说明:。

利用C语言开发一个“小学生算术四则运算测试系统”

利用C语言开发一个“小学生算术四则运算测试系统”

武汉理工大学华夏学院课程设计课程名称C语言程序设计题目利用C语言开发一个“小学生算术四则运算测试系统”专业____电子商务_____班级______1091_______学号_____20510809105_____姓名______张宇_______成绩_________________指导教师杨沙、王绪梅2010年6月28日至2010年7月2日课程设计任务书设计题目:利用C语言开发一个“小学生算术四则运算测试系统”设计目的1.加深对《C语言程序设计》课程所学知识的理解;2.掌握结构化程序设计的基本方法;3.学会编制结构清晰、风格良好、数据结构选择恰当的C语言程序;4.掌握多模块的C语言程序的调试方法。

设计任务(在规定的时间内完成下列任务)任务描述:利用C语言开发一个“小学生算术四则运算测试系统”该系统是让计算机充当一位给小学生布置作业的算术老师,为学生出题、阅卷该系统应具备以下功能:1.为小学生出题(分别进行+、-、*、÷等不同运算)2.学生做题后,进行评阅;学生每做一题后,评阅时给出“答题正确,很好”或“答题错误,重做”等字样;3.加、减、乘、除运算功能可以自由选择实现;4.运算数值可以控制在两位(或三位)数的四则运算范围内。

具体要完成的任务是:1 完成整个规定任务的设计及调试,得出正确结果,并经教师检查及答辩;2. 写出规范的课程设计说明书;3. 课程设计结束后交设计说明书等文档和设计内容。

设计说明书的主要内容是详细写出在设计过程中所用到的主要技术或方法;4. 从6月28日起,学生每天至少要到设计教室半天以上;5.课程设计报告按国际通用格式书写,具体格式要求请在网络上查阅时间安排6月28日上午1-103教室动员全体学生,给学生下任务书;下午查阅相关资料;6月29日~7月1日完成选题的设计及报告的书写;7月2日上午提交课程设计报告并答辩。

指导教师签名:2010年 6 月27 日教研室主任(或责任教师)签名:2010年 6 月27 日1、问题描述1.1在最开始设计此程序过程中,我定义的变量flag为字符型,当把原程序段中对应于下面的程序段的程序段改为:……scanf("%d",&temp);while(temp!=answer){printf("\n答案错误,重做\n");printf("\n请输入正确的答案:\n");scanf("%d",&temp);}printf("\n继续请按y,退出测试请按n \n");scanf("%c",&flag);while(flag!=y&&flag!=n){printf("\n继续请按1,退出测试请按0 \n");scanf("%d",&flag);}……我将会发现当我做完一题且做对了的时候,无论我输入的是y还是n或者是其他的字符,printf("\n继续请按1,退出测试请按0 \n")这个提示在屏幕上出现两次,说明了在第一个scanf("%c",&flag)语句中无论什么,flag!=y&&flag!=n都是成立的,这说明了在第一个scanf("%c",&flag)中输入的字符并没有赋给flag。

四则运算程序报告

四则运算程序报告

四则运算程序功能简介:该程序用字符串的形式接收一个带括号的四则运算的表达式,然后按照四则运算优先级的算法先括号,后乘方、乘除、加减这样的顺序将这个算式解出。

该程序的设计比较巧妙,是在主程序中反复查找最后一对括号,将其中的结果计算出来,去掉括号,这样的过程持续下去,最后导致所有的括号都去除,解出算式。

课程设计要求:(1)用类的形式改写程序,将数据和函数封装到类中。

(2)修改主程序结构,使程序可以反复运算,直到选择退出为止。

(3)扩充程序功能,使程序适合浮点运算。

(4)增加程序的判断功能,当有非法输入(如字母等),给出提示信息并退出运算,当输入带有空格使,能将空格滤除。

评定难易等级:A级。

程序设计思想:类的封装:class CStr // 定义一个字符串类{private:int nLen; //字符串长度char *pStr; //字符串首地址public:CStr(){nLen=0;pStr=NULL;} //构造函数CStr(CStr &str); //拷贝的构造函数~CStr(){if(pStr) delete[]pStr;} //析构函数int GetLen(){return nLen;} //返回字符串长度CStr & Midstr(CStr &str,int nStart,int nLength); /*返回字符串类中从nStart序号开始nLength长度的字符串*/CStr & Left(CStr &str,int nLength); //返回制定字符串类中从左边开始nLength 个字符CStr & Right(CStr &str,int nLength); //返回制定字符串类中从右边开始nLength个字符CStr & Calculate(); //计算该字符串所代表的四则运算的值(内无括号)int CharInStr(char chChar); //判断字符chChar是否在字符串中double V al(); //求字符串代表的数字字符的数值char GetChar(int i){return *(pStr+i);} //返回字符串中第i个字符CStr & Str(double val); //将数值表示成字符串的形式CStr & operator=(CStr &); //重载赋值运算符friend CStr operator+(CStr &,CStr &); //友元,实现字符串类的加法operator char *(){return(char *)pStr;} //将字符串类转换成字符数组friend istream &operator>>(istream &,CStr &); //重载输入运算符int Judge(); //判断输入法是否合法,滤除空格};对程序设计要求的解答所遇到的问题及解决方案:(1)用类的形式改写程序,将数据和函数封装到类中。

C语言课程设计-小学生算术四则运算测试系统

C语言课程设计-小学生算术四则运算测试系统

C语言课程设计-小学生算术四则运算测试系统#ifndef H_STUDENT_HH#define H_STUDENT_HH#include "stdio.h"#include "string.h"#include "malloc.h"#define LEN sizeof(struct message_student) /*一个结构体数组元素的长度*/ #define numsubs 5 /*学科数目*/typedef struct message_student /*结构体定义*/{char number[6];char name[20];char sex[4];float subject[numsubs];float score;float average;int index;}student;extern int numstus; /*学生数目*/extern student *pointer; /*指向结构体数组*/extern int lens;int menu_select(); /*函数声明*/int openfile(student stu[]);int findrecord(student stud[]);int writetotext(student stud[]);void welcome();void display1();void showtable();void sort(student stu[]);void deleterecord(student stu[],int i); void addrecord(student stud[]);void display(student stud[],int n1,int n2); void amendrecord(student stud[]);void count(student stud[]);void sortnum(student stud[]);void sortnum2(student stud[]);void sortname(student stud[]);void sortname2(student stud[]);void sortcount(student stud[]);void sortcount2(student stud[]);void statistic(student stud[]);void display1();#endif//#include "head.h"int menu_select(){char c;printf("\\");printf(" | 1. 增加学生记录 5.统计信息 |\"); printf(" | 2. 查询学生记录 6.打开文件 |\"); printf(" | 3. 修改学生记录 7.保存文件 |\"); printf(" | 4. 学生纪录排序 8.显示记录 |\"); printf(" | 0. 退出系统 |\");printf("\\");printf("请选择(0-8):");c=getchar();getchar();return (c-'0');}//#include "head.h"int findrecord(student stud[]) /*查找信息*/{char str[2];int i,num;if(numstus==0){printf("没有可被查找的记录\");return -1;}else{printf("以何种方式查找?\1.学号\2.姓名\3.名次\"); gets(str); if(str[0]=='1') /*按学号查找*/{printf("请输入学号:");gets(str);for(i=0;i<=numstus;i++)if(strcmp(str,stud[i].number)==0) {display(stud,i,i);break;}else continue;}else if(str[0]=='2') /*按姓名查找*/ {printf("请输入姓名:");gets(str);for(i=0;i<=numstus;i++)if(strcmp(str,stud[i].name)==0) {display(stud,i,i);break;}else continue;}else if(str[0]=='3') /*按名次查找*/ {printf("请输入名次:");scanf("%d",&num);getchar();for(i=0;i<=numstus;i++)if(num==stud[i].index){display(stud,i,i);break;}else continue;}if(i>numstus){printf("没有查找所要的信息。

四则运算实验报告

四则运算实验报告
a=rand()%100+1;/*在1~100随机取一个数*/
b=rand()%100+1;/*在1~100随机取一个数*/
printf("%d+%d=",a,b);
s=a+b;
scanf("%d",&ans1);//扫描用户输入答案//
if(ans1==s)
{
printf("Very Good!\n");
if(ans2==s)
{
printf("Very Good!\n");
count++;
}
else
{printf("Wrong!!!\n");}
}
}
printf("***正确率为%.0f%%***\n",100.0*count/N);
}
count,a,b,j,ans1,ans2用法与加法运算函数相同;N仍为10,作用相同;仍需srand((unsigned)time(NULL))使随机数a,b在每次运行中保持不同,用户在退出后再次进入并选择相同种类运算时,程序给出的数不会与先前给出的数相同;
整体功能:实现减法运算,并作出批改结果及正答率。
乘法运算函数
h();
void h()//乘法运算函数//
{
int count=0,j,a,b,ans1,ans2,s;
for(j=1;j<=N;j++)
{srand((unsigned)time(NULL));
a=rand()%100+1;
b=rand()%100+1;
while(a+b<201)//保证给出的是整除运算//
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

昆明理工大学《计算机程序设计基础》课程综合实践型教学课题报告课题名称:100以内的整数四则运算测试程序设计组长:学号 040401067 姓名周绍平组员:学号 040401070 姓名邓磊学号 040401106 姓名刘云路学号姓名学号姓名学号姓名学号姓名学院:信自学院专业班级:自动化0421 指导教师:耿植林昆明理工大学计算中心2005 年 6月18日昆明理工大学计算中心《计算机程序设计基础》课程综合实践型教学课题报告课程名称:100以内的整数四则运算测试程序设计正文内容:一、问题描述这是一个进行数学计算的程序,且要求拥有多种功能,包括(1)选项菜单集成各功能函数模块(2)出题(每次出10道题目)(3)答题并评分(4)答错的题给出正确答案(5)显示答卷。

总体看来,大多数功能要求调用错题,所以面临的两个难题便是出题和保存答题者做错的题以便其它函数调用。

另外,由于除法的特殊性——其除数不能为0。

又因为这是一个用于100以内整数的四则运算的程序,又对除法这个特殊成员提出了新的要求——要使得到的结果为整数。

所以有必要把除法单独拿出来作为一个函数处理。

二、问题分析这是一个任务很明确的程序设计—用于100以内的整数的四则运算。

这个程序要求拥有选项菜单、出题、答题评分、显示答卷、错题再解、重复练习的功能。

既然是一个用于计算的程序那它的主要作用就是给练习者答题,并验证答题的正确与否。

当然,还要有一些附加功能,比如:把答卷显示出来,错题给出正解,错题再抽出来再做。

这个程序只要求100以内的四则运算,所以随机出现的数字只能是100以内的,并且要求其为整数。

不论是数据的输入与输出,都要求其为整数。

鉴于这个程序所要求达到的功能,我们小组决定把它分为计算、菜单、答卷、重做、正解、评价、除法七个函数模块。

对各成员的分工如下:计算、正解和菜单(周绍平)评价和除法(邓磊)答卷和重做(刘云路)主函数及各函数的连接则由小组成员共同完成。

三、程序设计思路功能模块说明各函数流程图:1、除法(chufa)2、计算(jisuan)3、重做(chongzuo)4、主函数(main)由于其它四个函数较为简单或者和某些函数相似,这里就不再重复说明。

在程序中用到的数据说明:运算符:随机产生4个数字(0、1、2、3),定义为int p(全局变量),再转换为运算符(+、-、*、/),定义为char fh[10](全局变量) .运算数:随机产生两个运算数,对100取余。

定义为 int sy[10],sr[10](全局变量).结果和答案:定义为 int jd[10],jg[10](全局变量).循环控制变量:定义为 int i(函数(jisuan,chufa)),j(函数(dajuan)),k(函数(zhengjie)),m,n(函数(chongzuo)),key(主函数(main)).临时交换数据变量:int gh(函数(jisuan)).统计分数:int fs(全局变量).四、程序调试与测试100以内的四则运算出题(程序调试过程中遇到的问题)第一;重做程序调试中遇到的问题:在重做程序的调试中遇到的问题不太多,主要是答错的题给三次重做机会的程序设计一开始不能正常运行,要不就是给予无限次的机会,要不就是只能重做一次。

由于开始我不能找出错误所在,调试了多次也不能很好的运行,经过多次的调试,改正,再调试,再改正,到最后终于将错误的地方改正了,正确的程序应当是“for(n=0;n<3;n++){ printf("你仍未做对!你还有%d次机会: ",2-n);/*再次计算*/printf("%2d %c %2d =?",sy[m],fh[m],sr[m]);scanf("%d",&jd[m]);if(jd[m]==jg[m]) { printf("恭喜!你做对了!\n"); break;}/*跳出循环*/} ”这样就很好的解决了前面所遇到的问题。

第二;评价程序中遇到的问题:我们做的这个自动出题程序中,当答题者做完题目后,程序会按成绩分段给出响应的评价。

在做这部分程序的时候遇到的困难主要是score数据的获得,一开始不知道该用哪个函数对成绩进行评价,经过看书和小组内部的讨论才知道了应当用条件函数switch对成绩score进行分段并给出相应的评价结果score的数据从主函数获得:“int fs;printf("请输入成绩(0,10,20...100):");scanf("%d",&fs);switch(fs) ”这才使得程序能够正常运行。

第三;菜单程序设计中遇到的问题:本程序的主菜单选项分为显示答卷、错题的正确解、再进行一次练习、系统对成绩的评价、退出系统等选项。

在做这个程序的时候,一开始我用的是0—5代表以上各选项,但是在定义的时候却定义成了1—6,导致程序在运行的过程中5选项和0选项都无法运行,而这个错误在编译时又不能找出来,所以让我费了大量的时间才知道是自己不认真定义错了。

而这个程序主要是使用printf()函数显示菜单项,用sacnf()函数接收选项字符while条件限定选项的合法性,非法字符则重新输入并返回主函数:“printf("\n********** 数学四则运算测试软件**********\n\n\n");printf(" 1.显示答卷 2.错题正解\n\n");printf(" 3.系统评估 4.错题重做\n\n");printf(" 5.再次练习0.退出系统\n\n");printf("\n********************************************");printf("\n请输入选项(0-5):"); /*提示输入选项*/第四;计算程序的设计中的问题:在这部分程序的设计中没什么大的问题,计算程序主要是用随机函数rand()产生0-32767之间的整数,与100取余数后得到0-99之间的整数运算符也由随机数产生,rand()%4 得到0-3之间的随机数,约定0:减法,1:加法,2:乘法,3:除法。

for循环控制题目数量,每次循环先产生题目并显示出来,将计算结果保存在jg中然后再等待做题的人从键盘输入计算结果保存在s中,将jg与s进行比较判定正确性做完10道题后(循环结束),显示测试结果并进行评价。

第五;除法程序中遇到的问题:除法运算程序的设计是本程序设计中最难解决也是出错最多的部分。

主要除法运算的每一次运算不可能都是整数,这就使得程序的设计难度提高了许多,特别是在主函数的调用中主程序中遇到的问题:在主程序的调试过程中,遇到的问题较为突出。

主要有两个方面。

一是菜单选项的不运行。

二是计算函数对除法函数的调用问题。

为了解决这两个问题,我们小组进行了多次的试验,但是都无法解决这两个问题。

这使得我们有点失落。

主程序最后的解决是在询问了老师之后才解决的。

我们在老师的帮助下发现并解决了这两个问题。

菜单选项的问题是由于,对选项字符的合法性验证有问题。

对函数调用的不成功则是对指针的不熟悉,从而造成了调用的不恰当,使数据的返回存在问题。

五、程序清单#include "stdio.h"#include <stdlib.h>#include <time.h>#include <ctype.h> /* 字符操作函数*//* 定义全局变量*/int sy[10],sr[10],jd[10],jg[10]; /* sy,fh,sr,jd,jg分别保存第一运算数,运算符,第二运算数,输入结果,正确结果*/int fs=0; /* s接收键盘输入的结果,score保存成绩*/char fh[10]; /* fh保存运算符号*//*作者:邓磊编写日期:2005.6.13最后修改日期:2005.6.13*/void chufa(int *s1,int *s2,int *s3){int i,b=1,c,jg; /*i为控制循环变量,jg,jd分别保存输入结果和正确答案*/int cs[20]={0},sy,sr; /*cs为除数数组,sy保存被除数,sr为从cs中抽取的除数*/srand( (unsigned)time( NULL ) );FA: sy=rand()%100;if(sy==0) goto FA;for(i=1;i<=sy;i++) /*产生除数数组的循环*/{if(sy%i==0) { cs[b]=i; b++;}else continue;} /*循环结束*/c=rand()%b; /*随机抽取除数*/if(c==0) c=c+1;sr=cs[c];jg=sy/sr;*s1=sy; /*指针变量*/*s2=sr;*s3=jg;}/* 作者:周绍平编写日期:2005.6.8最后修改日期:2005.6.14*//* 自动生成10道运算题目,数值在0-99之间每出1道题后等待操作者输入运算结果判断输入的结果是否正确,正确则加10分给出最终得分*//* 算法:用随机函数rand()产生0-32767之间的整数,与100取余数后得到0-99之间的整数运算符也由随机数产生,rand()%4 得到0-3之间的随机数,约定0:减法,1:加法,2:乘法,3:除法。

for循环控制题目数量,每次循环先产生题目并显示出来,将计算结果保存在jg中然后再等待做题的人从键盘输入计算结果保存在s 中,将jg与s进行比较判定正确性做完10道题后(循环结束),显示测试结果并进行评价*/void jisuan(){int p; /* p为随机产生的运算符号,规定0为加法,1为减法,2为乘法,3为除法*/int i,gh; /* i为循环控制变量,gh用于临时交换数据*/printf("你将进行的是100以内数字的四则运算!\n");srand( (unsigned)time( NULL ) ); /* 随即数种子由系统时间函数产生*//* 循环产生10道100之内的加减乘除法运算题目*/for(i=0;i<10;i++){sy[i]=rand()%100; /* 随机产生第一个操作数(1-99)*/sr[i]=rand()%100; /* 随机产生第二个操作数(1-99)*/p=rand()%4; /* 随机产生运算符(0-3)*/if(p==0) /* 转换成运算符号,p为0表示做加法*/{ fh[i]='+'; jg[i]=sy[i]+sr[i]; } /* fh为‘+’,jg为sy[i]+sr[i]*/else if(p==1) /* p为1,表示做减法*/{ fh[i]='-';if(sy[i]<sr[i]) { gh=sy[i]; sy[i]=sr[i];sr[i]=gh; } /* 如果sy<sr则交换sy,sr,以保证结果为正数*/jg[i]=sy[i]-sr[i]; /* fh为‘-’,jg为sy-sr*/ }else if(p==2) /* p为2表示做乘法*/{ fh[i]='*'; jg[i]=sy[i]*sr[i]; } /* fh为‘*’,jg为sy*sr*/else if(p==3){fh[i]='/'; /* p为3表示做除法*/chufa(&sy[i],&sr[i],&jg[i]);}printf("第%2d题: %2d %c %2d = ? ",i+1,sy[i],fh[i],sr[i]); /* 显示题目*/scanf("%d",&jd[i]); /* 等待键盘输入计算结果*/if(jd[i]==jg[i]) fs+=10; /* 如果输入的结果与计算机运算结果相符则加10分*/} /* 循环结束*/printf("\n测试结束!\n\n");}/* 作者:周绍平编写日期:2005.6.12最后修改日期:2005.6.12*//* 主菜单选项,分为显示答卷、错题的正确解、再进行一次练习、系统对成绩的评价、退出系统等选项*//* 算法:使用printf()函数显示菜单项,用sacnf()函数接收选项字符while条件限定选项的合法性,非法字符则重新输入并返回主函数*/char caidan(){char c='0'; /*定义变量*/printf("\n********** 数学四则运算测试软件**********\n\n\n");printf(" 1.显示答卷 2.错题正解\n\n");printf(" 3.系统评估 4.错题重做\n\n");printf(" 5.再次练习0.退出系统\n\n");printf("\n********************************************");printf("\n请输入选项(0-5):"); /*提示输入选项*/do{ scanf("%c",&c); } /*输入选项*/while(!(c>='0'&&c<'6')); /*验证选项是否合法,若否则重输*/ return c; /*返回选择项*/}/*作者:邓磊编写日期:2005.6.12最后修改日期:2005.6.12*//*对成绩结果进行评价,便于做题都了解自己的情况,进行有针对性的学习.按分数的不同层次进行评价*//*算法:用条件函数switch对成绩score进行分段并给出相应的评价,结果score的数据从主函数获得*/void pingjia(){printf("你的成绩是%d分.\n",fs); /* 显示测试结果*/switch(fs) /*显示评价*/{ case 100: printf("真棒!不要骄傲哟!\n"); break;case 90: printf("优秀!恭喜你取得了好成绩!\n"); break;case 80:case 70: printf("良好!请继续努力,下次取得更好的成绩!\n"); break;case 60: printf("及格!成绩不太理想哟!再接再励吧!\n"); break;case 50:case 40:case 30:case 20:case 10: printf("多花点功夫吧,不然你会后悔的!!\n"); break;case 0: printf("太差劲了!再不努力的话,你就完了!再做一次吧!!!!\n"); break;}printf("\n\n");}/*作者:刘云路编写日期:2005.6.12最后修改日期:2005.6.12*//*显示答卷*//*各数据从主函数中获取*/void dajuan(){int j;printf("你的答卷为:\n");for(j=0;j<10;j++)printf("%2d %c %2d = %2d\n",sy[j],fh[j],sr[j],jd[j]);printf("\n\n");}/*作者:周绍平编写日期:2005.6.12最后修改日期:2005.6.12*//*对错题给出正确的答案*//*各数据从主函数中获取*/void zhengjie(){int k;printf("你答错的题的正确答案为:\n");for(k=0;k<10;k++){ if(jd[k]==jg[k]) continue;else{printf("%2d %c %2d = %2d\n",sy[k],fh[k],sr[k],jg[k]);}}printf("\n\n");}/*作者:刘云路编写日期:2005.6.12最后修改日期:2005.6.12*//*将错题给出,让做题者再次对其进行计算*//*各数据从主函数中获取*/void chongzuo(){int m,n;printf("以下是你做错的题,请重做:\n");for(m=0;m<10;m++) /*用循环对错题进行选择*/ if(jd[m]==jg[m]) continue; /*做对的题则跳过*/else{ printf("%2d %c %2d =?",sy[m],fh[m],sr[m]);scanf("%d",&jd[m]);if(jd[m]==jg[m]) printf("恭喜!你做对了!\n");/*再次对输入的答案进行检验*/else /*若仍未做对,则用此函数*/{for(n=0;n<3;n++){ printf("你仍未做对!你还有%d次机会: ",2-n);/*再次计算*/printf("%2d %c %2d =?",sy[m],fh[m],sr[m]);scanf("%d",&jd[m]);if(jd[m]==jg[m]) { printf("恭喜!你做对了!\n"); break;}/*跳出循环*/}}} /*循环结束*/ printf("\n\n");}/*作者:周绍平、刘云路、邓磊编写日期:2005.6.13最后修改日期:2005.5.14*//*主函数*/void main(){int key=1;jisuan();while(key){switch(caidan()){case '1': { printf("\n\n\n"); dajuan(); } break;case '2': { printf("\n\n\n"); zhengjie(); } break;case '3': { printf("\n\n\n"); pingjia(); } break;case '4': { printf("\n\n\n"); chongzuo(); } break;case '5': { printf("\n\n\n"); jisuan(); } break;case '0': key=0;}}}个人收获和体会:(1)组长:周绍平这次C语言的程序设计,对于我来说是一个挑战。

相关文档
最新文档