实验6 函数与编译预处理(参考答案)
- 格式:doc
- 大小:4.87 MB
- 文档页数:12
《C语言程序设计》实验报告实验五函数与编译预处理学号姓名一、实验目的1、掌握函数定义及调用的方法,正确理解函数调用时实参和形参的对应关系;2、掌握并正确使用数组作为函数参数;3、掌握函数的嵌套调用和递归调用的方法;4、理解变量的作用域和生存期;5、掌握宏定义、文件包含。
二、实验内容1、分析下面的程序并上机运行程序,要求写出3组以上程序的运行结果。
#include <stdio.h>int fun(int k){int result=1,i;for(i=1;i<=k;i++){result=result*i;}return result;}void main(){int n;printf("Input n please(1<=n<=10)");scanf("%d",&n);printf("%d!=%d\n",n,fun(n));}『运行结果:』2、编写程序,输出2~n之间的所有素数,n由键盘输入。
要求判断素数的过程要写在函数中,由主函数调用实现,并写出2组以上程序运行结果。
程序代码:『运行结果:』3、编程实现输入8个学生某门功课的成绩,用函数求出平均分,并在主函数中输出平均分以及高于平均分的同学的成绩。
并写出2组以上程序运行结果。
程序代码:运行结果:』三、问题讨论1、举例说明自动变量和静态变量的区别。
四、实验总结1 总结本次实验完成情况、相关知识掌握情况2 总结本次实验编辑、编译、连接、运行所取得的经验3 分析本次实验出现的主要错误最直接原因。
实验1 C++基础6.编写程序,输入某大写字母的ASCII码值,输出该字母的对应小写字母。
#in clude<iostream>using n amespace std;int mai n(){int i;cin> >i;if(i>=65 && 1<=90 )cout<<char(i-'A'+'a')vve ndl;elsecout«"输入有误"<<endl;} return 0;实验2三、实验思考1.输入直角三角形的两条直角边长,调用平方根库函数sqrt来求斜边的长度#in clude<iostream>#in clude<cmath>using n amespace std;int mai n(){ float a,b,c;coutvv"请输入直角三角形的两条边长:";cin> >a>>b;c二sqrt(a*a+b*b);cout«"直角三角形的斜边="<<c<<endl;return 0;}2 •从键盘输入一个字符,如果输入的是英文大写字母,则将它转换成小写字母后输出,否则输出原来输入的字符。
#in clude<iostream>using n amespace std;int mai n(){char c;1coutvv"请输入一个字符:";cin> >c;if(c>='A'&& c<='Z')c+='a'-'A';coutvvcvve ndl;return 0;3•输入一个学生的成绩,如高于60分,贝V输出“ pass” ;否则,输出“failed ”。
一、选择题1、函数调用语句int fun( ) { return 50,60; },则函数调用后返回值为()。
A、50B、60C、50,60D、编译错2、设有函数定义调用语句“f((e1,e2),(e3,e4,e5));”,则实参个数是()。
A、2B、3C、4D、53、若用下列程序f(char a){ float b=5;b+=a/b;return b;}则函数返回值的类型是()。
A、intB、charC、voidD、float4、若定义函数int f(int x) { x++; return x; }执行以下语句:int a=5; f(a)+f(a);则a的值是()。
A、5B、6C、7D、85、下列程序的运行结果是()。
fun1(int a, int b){ return fun2(a++, --b); }fun2(int a, int b){ return a/b; }void main( ){ int x=5, y=6;cout<<fun1(x,y);}A、1B、1.6C、2D、语法错6、以下程序执行后输出结果是()。
int f(int x,int y){ return (y-x)*x; }void main( ){ int a=3, b=4, c=5, d;d=f(f(a,b),f(a,c));cout<<d;}A、3B、8C、9D、67、设有宏定义和语句#define P(x, y) x/y#define PP(a,b) a*bint c=P(2+3, 2+3)+PP(2+3, 2+3);则变量C的值是()。
A、26B、17C、17.5D、318、若有定义int k=3,以k+1作为参数,对下列宏定义进行宏展开,则最终结果不为7的是()。
A、#define s(x) x*xB、#define s1(x) (x)*(x)C、#define s2(x) (x*x)D、#define s4(x) (x*(x))9、下列编译预处理指令没有语法错误的是()。
实验六参考答案(参考答案)(1) 设计程序sy6-1.c,输入一个字符串,将其中的大写字母都改为对应的小写字母,其他字符不变。
例如,若输入"Ab,cD",则输出"ab,cd"。
算法分析:使用for循环遍历字符串,在遍历的过程中,如果该元素是大写字母时,能过str[i]=str[i]+32把大写字母置换成相应小写字母参考答案:#include<stdio.h>#include<string.h>void main(){char str[100];int i;printf("请输入一个字符串:");gets(str);for(i=0;str[i]!='\0';i++)if(str[i]>='A'&&str[i]<='Z') str[i]=str[i]+32;printf("输出转换后的字符串:");puts(str);}运行结果:(2) 设计程序sy6-2.c,输入一个字符串,删除其中所有的小写字母'c'。
例如,若输入字符串"ac abc bcdef",则应输出字符串" a ab bdef"算法分析:在原字符数组中删除指定字符时,当遍历的字符不等于要删除的字符时,在原数组中赋值。
注意在赋值的时候,元素下标不同步,所以用j做为删除后的下标,并且是赋一个值,其下标自动加1,所以最后j的值为数组的长度,另外为了保证字符数组能正确输出,所以在最后要人为加一个\0参考答案:#include<stdio.h>#include<string.h>void main(){int i,j=0;char str[20];printf("请输入一个字符:");gets(str);for(i=0;str[i]!='\0';i++)if(str[i]!='c')str[j++]=str[i]; //将指定字符c删除str[j]= '\0';printf("请输入一个字符:");puts(str);}运行结果:(3) 设计程序sy6-3.c,输入一个字符串,统计其中 'a' 到 'z' 26 个英文小写字母各自出现的次数。
《高级语言程序设计》实验报告班级: 学号: 姓名: 成绩:实验6 数组程序设计一、实验目的1. 掌握一维数组和二维数组的定义、赋值和输入输出的方法。
2. 掌握字符数组和字符串函数的使用。
3. 掌握与数组有关的算法。
二、实验内容1(1)下列程序的功能为:为指定的数组输入10个数据,并求这些数据之和。
纠正程序中存在的错误,以实现其功能。
程序以文件名保存。
#include<>void main(){int n=10,i,sum=0;int a[n]; int a[10];for(i=0;i<10;i++){scanf("%d",a[i]); scanf("%d",&a[i]);sum=sum+a[i];}printf("sum=%d\n",sum);}(2)下列程序的功能为:将字符串b 连接到字符串a 。
纠正程序中存在的错误,以实现其功能。
程序以文件名保存。
#include<>void main( ){ char a[]="wel",b[]="come"; char a[20]="wel",b[]="come";int i,n=0;while(!a[n]) n++; while(a[n] != '\0') n++;for(i=0;b[i]!='\0';i++)a[n+i]=b[i];a[n+i]=’\0’;printf("%s\n",a);}(3)下列程序的功能为:找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小。
也可能没有鞍点。
纠正程序中存在的错误,以实现其功能。
程序以文件名保存。
#include<>#define N 4#define M 4main(){for (i=0;i<N;i++)for (j=0;j<M;j++)scanf("%d",&a[i][j]);flag2=0;for (i=0;i<N;i++){max=a[j][0]; max=a[i][0];for (j=0;j<M;j++)if (a[i][j]>max) if (a[i][j]>=max){max=a[i][j];maxj=j;}for (k=0,flag1=1;k<N&&flag1;k++)if (max>a[k][maxj])flag1=0;if (flag1){printf("\nThe saddle point is:a[%d][%d]=%d\n",i,maxj,max);flag2=1;}}if ( flag2) if (! flag2)printf("\nThere is no saddle point in the Matrix\n");}2.程序填空题(1)以下程序的功能是:采用二分法在给定的有序数组中查找用户输入的值,并显示查找结果。
实验六函数与编译预处理(4学时)实验前必须做的操作...............——..新建文件夹:1、先在对应的K:盘上建立一个父文件夹(用来存放本人整个学期的作业),格式为:“专业+班级+学号+姓名”,如:工业1091班、学号为05的匡珍春同学,其父文件夹名称为:工业109105匡珍春,然后在此父文件夹下建立子文件夹,名称为:实验6(用来存放实验6需要上交的文件)。
2、在E:盘上建立一个以本人姓名为名称的文件夹(本次实验的工作文件夹),例如:E:\匡珍春【实验目的】1、掌握自定义函数的一般结构及定义函数的方法;2、掌握函数的形式参数、实际参数、函数返回值等重要概念;3、掌握函数实参与形参间的“值传递”方式;4、掌握函数声明、函数调用的一般方法;5、掌握模块化程序设计思想,会采用C语言中函数进行模块化程序设计;6、掌握全局变量和局部变量作用域以及全局变量和局部变量的使用方法;7、掌握函数的嵌套调用的程序的执行过程,会使用嵌套调用设计程序;8、掌握使用函数递归调用的程序的执行过程,会使用递归程序解决实际问题;9、理解宏的概念,掌握宏定义。
了解文件包含的概念,掌握其用法;10、学习对多文件程序的编译和运行;11、熟练掌握VC程序调试方法,包括断点的设置和取消,以及单步执行跟踪进入函数和跳出函数的方法。
【实验内容】[实验任务一]:断点的设置和取消、单步执行跟踪进入函数和跳出函数方法练习程序跟踪调试实例6-1:调试示例(请仔细按以下各步骤进行操作):从键盘输入一个正整数n,计算n! 的值,要求定义和调用函数fact(n),计算n!。
Input n: 1010! = 3628800说明:实验五中我们使用了程序运行到光标位置调试程序,本次实验需要掌握设置断点,以及单步调试进入函数和跳出函数的方法。
【操作步骤】:(1)输入源程序,并以error6_1.c文件名最终保存在实验6文件夹里,编译程序,出现警告信息:双击该警告信息,箭头指向“f=fact(n);”这一行,警告信息指出函数“fact”没有定义,而函数“fact”实际上已经定义了,这是为什么呢?因为函数在调用之前,必须先声明。
实验六函数与编译预处理1.void main(){float a,b,c;scanf("%f%f",&a,&b);c=add(a,b);printf("sum is %f\n",c);}float add(float x,float y){float z;z=x+y;return(z);}//错误的地方,(1)没有包含头文件<stdio.h> (2)函数定义应该在函数调用的前面. 更正后的程序:#include<stdio.h>float add(float x,float y){float z;z=x+y;return(z);}void main(){float a,b,c;scanf("%f%f",&a,&b);c=add(a,b);printf("sum is %f\n",c);}2.void main(){int a=3,b=6;printf("a=%d,b=%d\n",a,b);exchange1(a,b);printf(:a=%d,b=%d\n",a,b);}void exchange1(int x,int y){int t;t=x;x=y;y=t;printf("x=%d,y=%d\n",x,y);}//错误的地方,(1)没有包含头文件<stdio.h> (2)函数定义应该在函数调用的前面.更正后的程序:#include<stdio.h>void exchange1(int x,int y){int t;t=x;x=y;y=t;printf("x=%d,y=%d\n",x,y);}void main(){int a=3,b=6;printf("a=%d,b=%d\n",a,b);exchange1(a,b);printf("a=%d,b=%d\n",a,b);}3.long int fac(int n){long int p;int i;p=1;for(i=1;i<=n;i++)p=p*i;return(p);}int cmn(int m,int n){int x;x=fac(m)/(fac(n)*fac(m-n));return(x);}void main(){int m,n,c;scanf("%d%d",&m,&n);c=cmn(m,n);printf("c=%d\n",c);}//应该加个#include<stdio.h> 头文件4.int a=7,b=9;void main(){int i,a=5,x=80,y=60;for(i=1;i<4;i++){printf("a=%d,b=5d,max=%d\n",a,b,max(a,b));b+=6;}printf("result_sum=%d\n",sum(x,y));}int sum(int x,int y){extern int m,n;int temp;temp=x+y+m+n+a+b;return(temp);}int m=12,n=25;int max(int 1,int b){return(a>b?a:b);}程序更正:#include<stdio.h>int a=7,b=9;void main(){int i,a=5,x=80,y=60;int max(int a,int b);int sum(int x,int y);for(i=1;i<4;i++){printf("a=%d,b=5d,max=%d\n",a,b,max(a,b));b+=6;}printf("result_sum=%d\n",sum(x,y));}int sum(int x,int y){extern int m,n;int temp;temp=x+y+m+n+a+b;return(temp);}int m=12,n=25;int max(int a,int b){return(a>b?a:b);}5.调试运行以下程序.#include<stdio.h>int fun(int a){int b=0;static int c=2;b+=c;c+=1;return(a+b-c);}void main(){int a=3,i;for(i=0;i<3;i++) printf("%4d",fun(a));}6.略7.略8.#include<stdio.h>#define DEBUGvoid main(){int a=14,b=15,temp;temp=a/b;#ifdef DEBUGprintf("a=%d,b=%d",a,b);#endifprintf("temp=%d\n",temp);}程序结果为:a=14,b=15,temp=0(1)第二行中,宏定义是可以没有具体的值的,在这里只是定义了一个宏名.DEBUG没有值.(2)第7~9行为:#ifdef DEBUGprintf("a=%d,b=%d",a,b);#endif会被编译,因为种种原因DEBUG已经被定义过.(3)如将第2行删除,程序运行结果为:temp=0 因为没有定义DEBUG,所以原来第7~9行的程序没有执行.(4)第9行不能删除,因为#ifdef 和#endif必须成对出现.9.编程题#include<stdio.h>long int fac(int n){long int p;int i;p=1;for(i=1;i<=n;i++)p=p*i;return(p);}void main(){int m,n,c;scanf("%d%d",&m,&n);c=fac(n)/(fac(n-m)*fac(m));printf("c=%d",c);}。
本周实验内容:函数与预处理1完成下面实验内容,将程序清单或运行结果截图复制到实验文档中,以“学号+姓名+班级+实验6.doc”命名实验文档,将文档上传至ftp 服务器上的“C++\”目录下。
注:本此实验内容与教材略有不同,请按本文档完成实验内容。
一、实验目的1、理解函数的概念和定义。
2、锻炼调试程序的能力。
二、实验内容和实验要求按实验指导书P166至P167的要求,完成实验6的实验内容及自测练习。
1.练习题1思考题及问题:2.练习题2思考题及问题:3.练习题3思考题及问题:4.练习题4思考题及问题:5.练习题五(此题为新增内容)⑴数字反射⑵要求编写一个函数,接收一个整数值,返回这个数中数字逆序后的结果值。
例如:给定数7631,函数返回1367.⑶思路①通过% 10运算与循环的结合,可依次获得给定数的每位数字。
例如:7631%10=1,获得了个位数;7631 / 10 =763,即丢掉了个位数字。
继续下去,可依次得到数字1、3、6、7.②边循环边将每次得到的数字添加到需返回的数值中。
例如:0*10+1=1;1*10+3=13;13*10+6=136;136*110+7=1367.6.练习题六(此题为新增内容)⑴猜数字游戏⑵要求编写一个程序,可以玩“猜数字”的游戏。
具体描述如下:程序在1~1000之间的整数中随机选择需要猜的数。
然后显示:I have a number between 1 and 1000.Can you guess my number?Please type your first guess.玩家于是输入猜想的第一个数。
程序会做出如下响应之一:1.Excellent You guessed the number!Would you like to play again (y or n)?2.Too low. Try again.3.Too high. Try again.如果玩家的猜测是不正确的,程序应继续循环,直到玩家最终猜对为止。
一、选择题1、函数调用语句int fun( ) { return 50,60; },则函数调用后返回值为()。
A、50B、60C、50,60D、编译错2、设有函数定义调用语句“f((e1,e2),(e3,e4,e5));”,则实参个数是()。
A、2B、3C、4D、53、若用下列程序f(char a){ float b=5;b+=a/b;return b;}则函数返回值的类型是()。
A、intB、charC、voidD、float4、若定义函数int f(int x) { x++; return x; }执行以下语句:int a=5; f(a)+f(a);则a的值是()。
A、5B、6C、7D、85、下列程序的运行结果是()。
fun1(int a, int b){ return fun2(a++, --b); }fun2(int a, int b){ return a/b; }void main( ){ int x=5, y=6;cout<<fun1(x,y);}A、1B、1.6C、2D、语法错6、以下程序执行后输出结果是()。
int f(int x,int y){ return (y-x)*x; }void main( ){ int a=3, b=4, c=5, d;d=f(f(a,b),f(a,c));cout<<d;}A、3B、8C、9D、67、设有宏定义和语句#define P(x, y) x/y#define PP(a,b) a*bint c=P(2+3, 2+3)+PP(2+3, 2+3);则变量C的值是()。
A、26B、17C、17.5D、318、若有定义int k=3,以k+1作为参数,对下列宏定义进行宏展开,则最终结果不为7的是()。
A、#define s(x) x*xB、#define s1(x) (x)*(x)C、#define s2(x) (x*x)D、#define s4(x) (x*(x))9、下列编译预处理指令没有语法错误的是()。
实验六函数与编译预处理(参考答案)[实验任务一]:程序跟踪调试实例6-1:error6_1.c参考答案程序跟踪调试实例6-2:error6_2.c参考答案程序跟踪调试实例6-3:error6_3.c参考答案[实验任务二]:程序填空实例6-1:blank6_1.c参考答案程序填空实例6-2:print1.c参考答案程序填空实例6-3:reverse.c参考答案[实验任务三]:编程实例6-1:primefun.c参考答案(第一种方法)编程实例6-1:primefun.c参考答案(第二种方法)编程实例6-1:primefun.c参考答案(第三种方法)编程实例6-2:printnum.c参考答案编程实例6-3:printa.c参考答案编程实例6-4:power.c参考答案(第一种方法)编程实例6-4:power.c参考答案(第二种方法)编程实例6-5:Taile.c参考答案编程实例6-6:value.c参考答案编程实例6-7:LeRangDe.c参考答案编程实例6-8:multifac.c参考答案[实验任务四]:程序1参考答案:#include <stdio.h>/* 函数功能:计算两整型数之和,如果与用户输入的答案相同,则返回1,否则返回0 函数参数:整型变量a和b,分别代表被加数和加数函数返回值:当a加b的结果与用户输入的答案相同时,返回1,否则返回0 */int Add(int a, int b){int answer;printf("%d+%d=", a, b);scanf("%d", &answer);if (a+b == answer)return 1;elsereturn 0;}/* 函数功能:打印结果正确与否的信息。
函数参数:整型变量flag,标志结果正确与否函数返回值:无*/void Print(int flag){if (flag)printf("Right!\n");elseprintf("Not correct!\n");}main() /*主函数*/{int a, b, answer;printf("Input a,b:");scanf("%d,%d", &a, &b);answer = Add(a, b);Print(answer);}程序两次测试的运行结果分别如下:①Input a,b:1,2↙1+2=3↙Right!②Input a,b:1,2↙1+2=4↙Not correct!程序2参考答案:#include <stdio.h>/* 函数功能:计算两整型数之和,如果与用户输入的答案相同,则返回1,否则返回0 函数参数:整型变量a和b,分别代表被加数和加数函数返回值:当a加b的结果与用户输入的答案相同时,返回1,否则返回0*/int Add(int a, int b){int answer;printf("%d+%d=", a, b);scanf("%d", &answer);if (a+b == answer)return 1;elsereturn 0;}/* 函数功能:打印结果正确与否的信息。
函数参数:整型变量flag,标志结果正确与否函数返回值:无*/void Print(int flag){if (flag)printf("Rright!\n");elseprintf("Not correct. Try again!\n");}main() /*主函数*/{int a, b, answer;printf("Input a,b:");scanf("%d,%d", &a, &b);do{answer = Add(a, b);Print(answer);}while (answer == 0);}程序运行结果如下:Input a,b:1,2↙1+2=4↙Not correct. Try again!1+2=5↙Not correct. Try again!1+2=3↙Rright!程序3参考答案:#include <stdio.h>/* 函数功能:计算两整型数之和,如果与用户输入的答案相同,则返回1,否则返回0 函数参数:整型变量a和b,分别代表被加数和加数函数返回值:当a加b的结果与用户输入的答案相同时,返回1,否则返回0*/int Add(int a, int b){int answer;printf("%d+%d=", a, b);scanf("%d", &answer);if (a+b == answer)return 1;elsereturn 0;}/* 函数功能:打印结果正确与否的信息。
函数参数:整型变量flag,标志结果正确与否整型变量chance,表示同一道题已经做了几次还没有作对函数返回值:无*/void Print(int flag, int chance){if (flag)printf("Right!\n");else if (chance < 3)printf("Not correct. Try again!\n");elseprintf("Not correct. You have tried three times!\nTest over!\n"); }main() /*主函数*/{int a, b, answer, chance;printf("Input a,b:");scanf("%d,%d", &a, &b);chance = 0;do{answer = Add(a, b);chance++;Print(answer, chance);}while ((answer == 0) && (chance < 3));}程序两次测试的运行结果分别如下:①Input a,b:1,2↙1+2=4↙Not correct. Try again!1+2=5↙Not correct. Try again!1+2=2↙Not correct. You have tried three times!Test over!②Input a,b:1,2↙1+2=4↙Not correct. Try again!1+2=3↙Right!程序4参考答案:#include <stdio.h>#include <stdlib.h>#include <time.h>/* 函数功能:计算两整型数之和,如果与用户输入的答案相同,则返回1,否则返回0 函数参数:整型变量a和b,分别代表被加数和加数函数返回值:当a加b的结果与用户输入的答案相同时,返回1,否则返回0*/int Add(int a, int b){int answer;printf("%d+%d=", a, b);scanf("%d", &answer);if (a+b == answer)return 1;elsereturn 0;}/* 函数功能:打印结果正确与否的信息。
函数参数:整型变量flag,标志结果正确与否函数返回值:无*/void Print(int flag){if (flag)printf("Rright!\n");elseprintf("Not correct!\n");}main()/*主函数*/{int a, b, answer, error, score, i;srand(time(NULL));error = 0;score = 0;for (i=0; i<10; i++){a = rand()%10 + 1;b = rand()%10 + 1;answer = Add(a, b);Print(answer);if (answer == 1)score = score + 10;elseerror++;}printf("score = %d, error numbers = %d\n", score, error); }程序运行结果如下:10+1=11↙Rright!5+9=14↙Rright!4+6=10↙Rright!7+2=9↙Rright!3+10=13↙Rright!1+1=2↙Rright!5+2=7↙Rright!3+7=10↙Rright!4+7=10↙Not correct!5+6=11↙Rright!score = 90, error numbers = 1程序5参考答案:#include <stdio.h>#include <stdlib.h>#include <time.h>/* 函数功能:对两整型数进行加减乘除四则运算,如果用户输入的答案与结果相同,则返回1,否则0函数参数:整型变量a和b,分别代表参加四则运算的两个操作数整型变量op,代表运算类型,当op值为1、2、3、4时,分别执行加、减、乘、整除运算函数返回值:当用户输入的答案与结果相同时,返回1,否则返回0*/int Compute(int a, int b, int op){int answer, result;switch (op){case 1:printf("%d + %d=", a, b);result = a + b;break;case 2:printf("%d - %d=", a, b);result = a - b;break;case 3:printf("%d * %d=", a, b);result = a * b;break;case 4:if (b != 0){printf("%d / %d=", a, b);result = a / b;}else{printf("Division by zero!\n");}break;default:printf("Unknown operator!\n");break;}scanf("%d", &answer);if (result == answer)return 1;elsereturn 0;}/* 函数功能:打印结果正确与否的信息。