学 生 实 验 报 告 册
课程名称:
学生学号:
所属院部:
(理工类)
C语言程序设计 专业班级:
学生姓名:
指导教师:
20 15 ——20 16 学年
金陵科技学院教务处制第 一 学期
实验报告书写要求
实验报告上交电子稿,标题采用四号黑体,正文采用小四号宋体,单倍行距。
实验报告书写说明
实验报告中实验目的和要求、实验仪器和设备、实验内容与过程、实验结果与分析这四项内容为必需项。教师可根据学科特点和实验具体要求增加项目。
填写注意事项
(1)细致观察,及时、准确、如实记录。 (2)准确说明,层次清晰。
(3)尽量采用专用术语来说明事物。
(4)外文、符号、公式要准确,应使用统一规定的名词和符号。 (5)应独立完成实验报告的书写,严禁抄袭、复印,一经发现,以零分论处。
实验报告批改说明
实验报告的批改要及时、认真、仔细,一律用红色笔批改。实验报告的批改成绩采用五级记分制或百分制,按《金陵科技学院课堂教学实施细则》中作业批阅成绩评定要求执行
实验项目名称: 初级程序设计 实验学时: 6 同组学生姓名: 实验地点: 实验日期: 实验成绩:
批改教师: 批改时间:
实验1 初级程序设计
一、实验目的和要求
(1)熟悉Visual C++集成环境,进行编辑、保存、编译、连接及运行,并能进行简单程序调试;
(2)掌握C语言中各种运算符的使用; (3)掌握C语言中各种数据类型的区别与应用;
(4)熟练掌握C语言中变量的定义、赋值和使用,表达式语句、输入/输出语句的使用; (5)掌握C语言中输入/输出函数的使用;
(6)掌握C语言中控制语句的使用,含if-else、for、while、do-while语句的使用。
二、实验仪器和设备
奔腾以上计算机,装有windows XP以上版本操作系统和Visual C++ 6.0软件。
三、实验内容与过程
1、程序调试
(1)#include
{ int s,t,p,sum;
scanf(“%d%d%d”,&s,&t,&p); sum=s+t+p;
printf(“sum=%d\\n”,sum); } (2)
#include
if((c>=’a’)&&(c<=’z’)) c=c-32; printf(“Char is %c”,c); } (3)
#include
{int x=1,y=1,z=1; y=y+z; x=x+y;
printf(“%d ”,x printf(“%d ”,x #include printf(“Please input a string:”); gets(s); /*scanf(“%s”,s);*/ printf(“\\nYou input string is: %s”,s); } (5)#include if(k=3) printf(“***”); else printf(“###”); } (6)#include { printf(“k=%d\\n”,k); }while(k++>0); } 2、问题:完成以下三个程序,分别以文件名A01.c、A02.c和A03.c保存: (1)定义两个整型变量x,y,要求利用scanf()函数从键盘对x,y赋值,然后利用printf()输出两者之和。 (2)定义两个变量:整型x,实型y,要求利用scanf()函数从键盘对x,y赋值,然后利用printf()输出两者之积。 (3)定义两字符型变量ch1、ch2,分别用getchar()和putchar()函数进行输入输出。 要求: (1)从键盘输入的时候,注意用多种分隔符的方法; (2)输出时,格式控制中要包含一些提示字符。 3、程序改错 下面是判断一个学生考试成绩及格与否的程序(成绩A,或B,或C者为及格;成绩为D者不及格),调试并改进如下程序使其能满足上述输出的需要。 #include { char mark=“A”; switch(mark) { case “A”: case “B”: case “C”: printf(“>=60\\n”); case “D”: printf(“<60\\n”); default: printf(“Error\\n”); } } 4、程序设计 (1)功能:编程实现使实型正数保留2位小数,并对第三位进行四舍五入。 例如:实型数为 1234.567,则函数返回 1234.570000; 实型数为 1234.564,则函数返回 1234.560000。 (2)功能:从键盘输入一个大写字母,要求改用小写字母输出。 (3)功能:编写函数计算下列分段函数的值: ?x2?x?6x?0且x?-3?2f(x)??x?5x?60?x?10且x?2且x?3 ?x2?x?1其它?(4)功能:判断整数x是否是同构数。若是同构数,函数返回1;否则返回0。x的值由主函数从键盘读入,要求不大于100。 说明:所谓“同构数”是指这样的数,这个数出现在它的平方数的右边。 例如:输入整数5,5的平方数是25,5是25中右侧的数,所以5是同构数。 (5)功能:计算正整数n的所有因子(1和n除外)之和并输出。n的值由键盘输入。 例如:n=120时,输出239。 (6)功能:计算并输出下列多项式的值 S = 1 + 1/1! + 1/2! + 1/3! + ... + 1/n! 例如:键盘给n输入15,则输出为:s=2.718282。 注意:要求n的值大于1但不大于100。 (7)功能:从低位开始取出长整型变量s奇数位上的数,依次构成一个新数放在t中。 例如:当s中的数为:7654321时,t中的数为:7531。 5、思考题 (1)功能:判断一个三位数是否\水仙花数\。在main函数中从键盘输入一个三位数,并输出判断结果。 说明:所谓\水仙花数\是指一3位数,其各位数字立方和等于该数本身。 例如:153是一个水仙花数,因为153=1+125+27。 (2)功能:计算并输出3到n之间所有素数的平方根之和。 例如:键盘给n输入100后,输出为:sum=148.874270。 (3)功能:输出Fibonacci数列中大于s的最小的一个数。其中Fibonacci数列F(n)的定义为: F(0)=0,F(1)=1 F(n)=F(n-1)+F(n-2) 例如:键盘输入s=1000时,输出1597。 程序清单及流程图:(程序题) 1. 编程实现使实型正数保留2位小数,并对第三位进行四舍五入 例如:实型数为 1234.567,则函数返回 1234.570000; 实型数为 1234.564,则函数返回 1234.560000。 #include float x ; int y,d1; printf(\请输入一个正实型数X=\ scanf (\ y = (int)(x * 1000); d1 = y; y=y/10; if(d1 >= 5) { y=y+1; } else { y=y; } printf(\四舍五入后的数是y=%f\\n\} 2.从键盘输入一个大写字母,要求改用小写字母输出 #include char X,Y; printf(\输入一个大写字母:\ scanf(\ Y = X + 32; printf(\输出的小写字母是:%c\\n\} 3.编写函数计算下列分段函数的值: #include int x,y; scanf(\ if(x<0 && x!=-3) { y = x*x + x + 6; printf(\输出的结果是 y=%d\\n\ } else if(x>=0 && x<10 && x!=2 && x!=3) { y=x*x - 5*x +6; printf(\输出的结果是 y=%d\\n\ }else { y = x*x - x - 1; printf(\输出的结果是 y=%d\\n\ } } 功能:判断整数x是否是同构数。若是同构数,函数返回1;否则返回0。x的值由主函数从键盘读入,要求不大于100。 说明:所谓“同构数”是指这样的数,这个数出现在它的平方数的右边。 例如:输入整数5,5的平方数是25,5是25中右侧的数,所以5是同构数。 main() { int x , y , z; printf(\请输入一个<100的数:\ scanf(\ y = x*x; if(y<100) { z = y; if(z==x) { printf(\返回值是1\\n\ }else { printf(\返回值是0\\n\ } }else { z = y0; if(z==x) { printf(\返回值是1\\n\ }else { printf(\返回值是0\\n\ } } } 四、实验结果与分析(程序运行结果及其分析)(程序调试+改错) 1、程序调试: (1)、 (2)、 (3) (4)gets(); scanf(); (5) (6) 3、程序改错 下面是判断一个学生考试成绩及格与否的程序(成绩A,或B,或C者为及格;成绩为D者不及格), 调试并改进如下程序使其能满足上述输出的需要。 #include { char mark; int x; scanf(\ if(x >= 90) { mark = 'A'; }else if(x >= 80) { mark = 'B'; }else if(x >= 60) { mark = 'C'; }else { mark = 'D'; } switch(mark) { case 'A': printf(\该同学成绩为:优秀\\n\ break; case 'B': printf(\该同学成绩为:良好\\n\ break; case 'C': //printf(\ printf(\该同学成绩为:合格\\n\ break; case 'D': printf(\ break; default: printf(\ } } 五、实验体会(遇到问题及解决办法,编程后的心得体会)(思考题+体会) 金陵科技学院实验报告 实验项目名称: 中级程序设计 实验学时: 8 同组学生姓名: 实验地点: 实验日期: 实验成绩: 批改教师: 批改时间: 1 金陵科技学院实验报告 实验2 中级程序设计 一、实验目的和要求 (1)掌握函数的定义、调用及返回、声明的应用; (2)熟练掌握一维数组的定义、初始化及使用; (3)掌握二维数组的定义、初始化及应用; (4)熟练掌握向函数传递一维数组的方法和应用; (5)掌握向函数传递一维数组的方法和应用。 二、实验仪器和设备 奔腾以上计算机,装有windows 7版本操作系统和Visual C++ 6.0软件。 三、实验内容与过程 1、程序调试 #include {int x=3,y=8,z=4,r; r=func(func(x,y),z); printf(“r=%d\\n”,r); } 2、程序改错 要求:1、改错时,只允许修改现有语句中的一部分内容,不允许添加和删除语句。 2、提示行下一行为错误行。 (1) 功能:判断m是否为素数,若是返回1,否则返回0。 #include /**********FOUND**********/ void fun( int n) { int i,k=1; if(m<=1) k=0; /**********FOUND**********/ for(i=1;i /**********FOUND**********/ if(m%i=0) k=0; /**********FOUND**********/ return m; } void main() { int m,k=0; 2 金陵科技学院实验报告 for(m=1;m<100;m++) if(fun(m)==1) { printf(\ if(k%5==0) printf(\ } } (2)功能:在一个已按升序排列的数组中插入一个数,插入后,数组元素仍按升序排列。 #include { int i,number,a[N]={1,2,4,6,8,9,12,15,149,156}; printf(\ /**********FOUND**********/ scanf(\ printf(\ for(i=0;i /**********FOUND**********/ for(i=N-1;i>=0;i--) if(number<=a[i]) /**********FOUND**********/ a[i]=a[i-1]; else { a[i+1]=number; /**********FOUND**********/ exit; } if(number printf(\ printf(\} (3)找出一个二行三列二维数组中的最大值,输出该最大值及其行列下标,建议二维数组值由初始化给出。 #include \#include \main() { int i,j,max,s,t; 3 金陵科技学院实验报告 /**********FOUND**********/ int a[2][]={1,34,23,56,345,7}; clrscr(); /**********FOUND**********/ max=0; s=t=0; for(i=0;i<2;i++) /**********FOUND**********/ for(j=1;j<3;j++) if(a[i][j]>max) { max=a[i][j]; s=i; t=j; } /**********FOUND**********/ printf(\} 3、程序设计 说明,所有题目均需添加main(),在main()中调用子函数并设计完整的输入输出才可调试通过。 (1) 功能:编写函数float fun(int n),求一分数序列2/1,3/2,5/3,8/5,13/8,21/13?的前n项之和。 说明:每一分数的分母是前两项的分母之和,每一分数的分子是前两项的分子之和。 例如:求前20项之和的值为32.660259。 (2)完成子函数int fun(int n),找出一个大于给定整数且紧随这个整数的素数,并作为函数值返回。 (3)功能:编写函数void fun(int n,int a[]),按顺序将一个4位的正整数每一位上的数字存到一维数组,然后在主函数输出。例如输入5678,则输出结果为 5 6 7 8。 (4)功能:编写函数void fun(int arr[],int n)将一个数组中的值按逆序存放,并在main()函数中输出。 例如:原来存顺序为8,6,5,4,1。要求改为:1,4,5,6,8。 (5) 功能:程序定义了N×N的二维数组,并在主函数中自动赋值。请编写函数fun(int a[][N],int n),使数组a左下三角元素中的值乘以n。 例如:若n的值为3,a数组中的值为 | 1 9 7 | | 3 9 7 | a = | 2 3 8 | 则返回主程序后a数组中的值应为 | 6 9 8 | | 4 5 6 | | 12 15 18| (6)功能:编写函数void fun(int array[3][3]),实现矩阵(3行3列)的转置(即行列互换)。 例如:输入下面的矩阵: 100 200 300 400 500 600 700 800 900 程序输出: 100 400 700 200 500 800 4 金陵科技学院实验报告 300 600 900 4、讨论、思考题 (1)功能:编写函数float fun(),利用以简单迭代方法Xn+1=cos(Xn)求方程:cos(x)-x=0的一个实根。迭代步骤如下: 1)取x1初值为0.0; 2)x0=x1,把x1的值赋给x0; 3)x1=cos(x0),求出一个新的x1; 4)若x0-x1的绝对值小于0.000001,执行步骤(5),否则执行步骤(2); 5)所求x1就是方程cos(x)-x=0的一个实根,作为函数值返回。 输出:程序将输出结果Root=0.739085。 (2)功能:编写float fun(float array[],int n),统计出若干个学生的平均成绩,最高分以及得最高分的人数。 例如:输入10名学生的成绩分别为92,87,68,56,92,84,67,75,92,66,则输出平均成绩为77.9,最高分为92,得最高分的人数为3人。 (3)编写函数 int fun(int lim,int aa[MAX]),该函数的功能是求出小于lim的所有素数并放在aa数组中,该函数返回求出素数的个数。 (4)功能:编写函数int fun(int a[M][M]),求5行5列矩阵的主、副对角线上元素之和。注意,两条对角线相交的元素只加一次。 (5)功能:请编一个函数void fun(int tt[M][N],int pp[N]),tt指向一个M行N列的二维数组,求出二维数组每列中最小元素,并依次放入pp所指一维数组中。二维数组中的数已在主函数中赋予。 程序清单及流程图: 程序调试 #include return(a+b); } main() { int x=3,y=8,z=4,r; r=func(func(x,y),z); printf(\} 5 金陵科技学院实验报告 2.程序改错题 /*(1) 功能:判断m是否为素数,若是返回1,否则返回0。*/ #include /**********FOUND**********/ int fun( int m) { int i,k=1; if(m<=1) k=0; /**********FOUND**********/ for(i=2;i void main() { int m,k=0; for(m=1;m<100;m++) if(fun(m)==1) { printf(\ if(k%5==0) printf(\ } } (2)功能:在一个已按升序排列的数组中插入一个数,插入后,数组元素仍按升序排列。 #include { int i,number,a[N]={1,2,4,6,8,9,12,15,149,156}; printf(\ /**********FOUND**********/ scanf(\ 6 金陵科技学院实验报告 printf(\ for(i=0;i /**********FOUND**********/ for(i=N-2;i>=0;i--) if(number<=a[i]) /**********FOUND**********/ a[i+1]=a[i]; else { a[i+1]=number; /**********FOUND**********/ break; } if(number (3)找出一个二行三列二维数组中的最大值,输出该最大值及其行列下标,建议二维数组值由初始化给出。 #include \#include \main() { int i,j,max,s,t; /**********FOUND**********/ int a[2][3]={1,34,23,56,345,7}; /**********FOUND**********/ max=a[0][0]; 7 金陵科技学院实验报告 s=t=0; for(i=0;i<2;i++) /**********FOUND**********/ for(j=0;j<3;j++) if(a[i][j]>max) { max=a[i][j]; s=i; t=j; } /**********FOUND**********/ printf (\} 四、实验结果与分析(程序运行结果及其分析) /*(1) 功能:编写函数float fun(int n),求一分数序列2/1,3/2,5/3,8/5,13/8,21/13?的前n项之和。 说明:每一分数的分母是前两项的分母之和,每一分数的分子是前两项的分子之和。 例如:求前20项之和的值为32.660259。*/ #include double a = 1, b = 2, x = 2, y = 3, sum; sum = x / a + y / b; for (i = 0; i < (n/2-1); i++) { a += b; b += a; x += y; y += x; sum += x / a + y / b; } return sum; } main() { int n,i; double sum =0.0; printf(\请输入一个数 n=\ scanf(\ sum= fun(n); 8 金陵科技学院实验报告 printf(\} /*(2)完成子函数int fun(int n),找出一个大于给定整数且紧随这个整数的素数,并作为函数值返回。*/ #include int i ,j; for(i=n+1;;i++) { for(j=2;j<(int)sqrt(i);j++) { if(i%j==0) { break; }else { return i; } } } } main () { int x,y; printf(\请输入一个数 x=\ scanf(\ y=fun(x); printf(\紧随x的最小素数 x=%d\\n\ } 9 金陵科技学院实验报告 (3)功能:编写函数void fun(int n,int a[]),按顺序将一个4位的正整数每一位上的数字存到一维数组,然后在主函数输出。例如输入5678,则输出结果为 5 6 7 8。 #include void fun(int n,int a[]); main() { int i,n,b[4]; scanf(\ for(i=0;i<4;i++) { b[i]=n; n=n/10; } fun(n,b); for(i=0;i<4;i++) printf(\ printf(\ } void fun(int n,int a[]) { int i,t; for(i=0;i<=1;i++) { t=a[i]; a[i]=a[3-i]; a[3-i]=t; } } (4)功能:编写函数void fun(int arr[],int n)将一个数组中的值按逆序存放,并在main()函数中输出。 #include void fun(int arr[],int n); main() { int i,j,a[N]; printf(\请输入数组的值\\n\ for(i=0;i 10 金陵科技学院实验报告 { scanf(\ } fun(a,N); for(j=0;j void fun(int arr[],int n) { int i,t; for(i=0;i<=n/2-1;i++) { t=arr[i]; arr[i]=arr[n-1-i]; arr[n-1-i]=t; } } (5) 功能:程序定义了N×N的二维数组,并在主函数中自动赋值。请编写函数fun(int a[][N],int n),使数组a左下三角元素中的值乘以n。 例如:若n的值为3,a数组中的值为 | 1 9 7 | | 3 9 7 | a = | 2 3 8 | 则返回主程序后a数组中的值应为| 6 9 8 | | 4 5 6 | | 12 15 18| #include fun(int a[][N],int n); main() { int a[N][N]={{1,9,7},{2,3,8},{4,5,6}}; int i,j,n; scanf(\ fun(a,n); 11 金陵科技学院实验报告 for(i=0;i printf(\ } printf(\ } printf(\} fun(int a[][N],int n) { int i,j; for(i=0;i if(i>=j) { a[i][j]=a[i][j]*3; } } } return a; } (6)功能:编写函数void fun(int array[3][3]),实现矩阵(3行3列)的转置(即行列互换)。 例如:输入下面的矩阵: 100 200 300 400 500 600 700 800 900 程序输出: 100 400 700 200 500 800 300 600 900 #include 12 金陵科技学院实验报告 #define N 3 void fun(int array[3][3]); main() { int i,j,a[3][3]={{100,200,300},{400,500,600},{700,800,900}}; fun(a); for(i=0;i<3;i++) { for(j=0;j<3;j++) { printf(\ } printf(\ } printf(\} void fun(int array[3][3]) { int i,j,temp; for(i=0;i<2;i++) { for(j=i+1;j<3;j++) { temp=array[i][j]; array[i][j]=array[j][i]; array[j][i]=temp; } } } 五、实验体会(遇到问题及解决办法,编程后的心得体会) 思考题: (1)功能:编写函数float fun(),利用以简单迭代方法Xn+1=cos(Xn)求方程:cos(x)-x=0的一个实根。迭代步骤如下: 1)取x1初值为0.0; 2)x0=x1,把x1的值赋给x0; 3)x1=cos(x0),求出一个新的x1; 4)若x0-x1的绝对值小于0.000001,执行步骤(5),否则执行步骤(2); 13 金陵科技学院实验报告 5)所求x1就是方程cos(x)-x=0的一个实根,作为函数值返回。 输出:程序将输出结果Root=0.739085。 #include double x1=0.0; x1=fun(); printf(\} float fun() { double x1=0.0,x0; do { x0=x1; x1=cos(x0); }while(fabs(x0-x1)>=1e-6); return x1; } (2)功能:编写float fun(float array[],int n),统计出若干个学生的平均成绩,最高分以及得最高分的人数。 例如:输入10名学生的成绩分别为92,87,68,56,92,84,67,75,92,66,则输出平均成绩为77.9,最高分为92,得最高分的人数为3人。 #include float fun(float array[],int n); main() { float array[N]; int i; float ave=0.0; for(i=0;i 14 scanf(\ 金陵科技学院实验报告 ave=fun(array,N); printf(\平均成绩为%3.1f\\n\} float fun(float array[],int n) { int i,j=0; float ave=0.0,max,sum=0.0; max=array[0]; for(i=0;i for(i=0;i if(max==array[i]) } printf(\最高分为%3.0f\\n\ printf(\最高分的个数是%d\\n\ ave =sum/n; return ave; } j++; sum+=array[i]; if(max<=array[i]) { max=array[i]; } 15 金陵科技学院实验报告 (3)编写函数 int fun(int lim,int aa[MAX]),该函数的功能是求出小于lim的所有素数并放在aa数组中,该函数返回求出素数的个数。 #include int fun(int lim,int aa[MAX]); main() { int lim,k=0,i; int aa[MAX]={0}; printf(\输入一个大于或等于2的整数lim: \ scanf(\ k = fun(lim,aa); for(i=0;i printf(\} int fun(int lim,int aa[MAX]) 16 printf(\if(i==0) printf(\ 金陵科技学院实验报告 { int i,j=0,k; k=0; for(i=2;i for(j=2;j if(i%j==0) { break; } } if(j==i) } return k; } { aa[k]=i; k+=1; } 之和。注意,两条对角线相交的元素只加一次。 #include int fun(int a[M][M]); main() { int 17 (4)功能:编写函数int fun(int a[M][M]),求5行5列矩阵的主、副对角线上元素 金陵科技学院实验报告 a[M][M]={{1,3,5,7,9},{2,4,6,8,10},{2,3,4,5,6},{4,5,6,7,8},{1,3,4,5,6}}; int sum=0; sum = fun(a); printf(\} int fun(int a[M][M]) { } int i,j; int sum=0; for(i=0;i return sum; for(j=0;j if(j==i||j==M-1-i) sum+=a[i][j]; (5)功能:请编一个函数void fun(int tt[M][N],int pp[N]),tt指向一个M行N列的二维数组,求出二维数组每列中最小元素,并依次放入pp所指一维数组中。二维数组中的数已在主函数中赋予。 #include void fun(int ,int ); int main() { int t[M][N]={{11,23,13,25},{20,14,16,19},{32,26,21,12}}; int p[N],i,j,k; 18 金陵科技学院实验报告 } void fun(int tt[M][N],int pp[N]) { } int i ,j; for(j=0;j pp[j]=tt[0][j]; for(i=1;i if(tt[i][j] pp[j]=tt[i][j]; printf(\原始数据为:\\n\ for(i=0;i for(j=0;j printf(\ printf(\ } printf(\ fun(t,p); printf(\结果为:\\n\ for(k=0;k printf(\ printf(\ 19 金陵科技学院实验报告 心得体会: 20 金陵科技学院实验报告 实验项目名称: 高级程序设计 实验学时: 6 同组学生姓名: 实验地点: 实验日期: 实验成绩: 批改教师: 批改时间: 21 金陵科技学院实验报告 实验3 高级程序设计 一、实验目的和要求 (1)理解C语言中指针的本质,区分指针与指针变量,掌握有关指针的应用; (2)熟练掌握字符串常量和字符串的存储及字符串处理函数的使用; (3)掌握字符指针的定义、使用等; (4)掌握向函数传递字符串的方法; 二、实验仪器和设备 奔腾以上计算机,装有windows XP以上版本操作系统和Visual C++ 6.0软件。 三、实验内容与过程 1、程序调试 (1) main() { int a=10,b=20,x,*pa,*pb; pa=&a;pb=&b; printf(“%d,%d,%d,%d”,a,b,*pa,*pb); x=*pa;*pa=*pb;*pb=x; printf(“%d,%d,%d,%d”,a,b,*pa,*pb); } (2) main() { int a=10,b=20,*p,*pa=&a,*pb=&b; printf(“%d,%d,%d,%d”,a,b,*pa,*pb); p=pa;pa=pb;pb=p; printf(“%d,%d,%d,%d”,a,b,*pa,*pb); } (3) int *swap(int *a,int *b) { int *p; p=a; a=b; b=p; return(a); } main() {int x=3,y=4,z=5; swap(swap(&x,&y),&z); printf(“%d,%d,%d”,x,y,z); } 思考:上面程序中函数swap()预将两个数的值相互交换,但结果为什么没有交换? 2、程序改错 22 金陵科技学院实验报告 要求:1、改错时,只允许修改现有语句中的一部分内容,不允许添加和删除语句。 2、提示行下一行为错误行。 (1)功能:为一维数组输入10个整数;将其中最小的数与第一个数对换,将最大的数与最后一个数对换,输出数组元素。 #include void input(int *arr,int n) { int *p,i; p=arr; printf(\ for(i=0;i /**********ERROR**********/ scanf(\} void max_min(int *arr,int n) { int *min,*max,*p,t; min=max=arr; for(p=arr+1;p /**********ERROR**********/ if(*p<*max) max=p; else if(*p<*min) min=p; t=*arr;*arr=*min;*min=t; /**********ERROR**********/ if(max=arr) max=min; t=*(arr+n-1); *(arr+n-1)=*max; *max=t; } void output(int *arr,int n) { int *p,i; p=arr; printf(\ /**********ERROR**********/ while(i=0;i main() { int a[10]; input(a,10); 23 金陵科技学院实验报告 max_min(a,10); output(a,10); } (2)功能:将s所指字符串的反序和正序进行连接形成一个新串放在t所指的数组中。 例如:当s所指的字符串的内容为\时,t所指数组中的内容为\。 #include /**********FOUND**********/ void fun (char s, char t) { int i, d; /**********FOUND**********/ d = len(s); /**********FOUND**********/ for (i = 1; i t[i] = s[d - 1 - i ]; for (i = 0; i /**********FOUND**********/ t[2*d] = '/0'; } main() { char s[100], t[100]; printf(\ scanf(\ fun(s, t); printf(\} 3、程序设计 说明,所有题目均需添加main(),在main()中调用子函数并设计完整的输入输出才可调试通过。 (1) 功能:请编写一个函数 int fun(int *s, int t, int *k),用来求出数组的最大元素在数组中的下标, 用k返回。 例如: 输入如下整数:876 675 896 101 301 401 980 431 451 777 则输出结果为: 6, 980 (2) 功能:编写函数void len_cat(char c1[],char c2[])将第二个串连接到第一个串之后,不允许使用strcat函数 (3) 功能:编写函数long fun ( char *p),将一个数字字符串转换为一个整数(不得调用C语言提供的将字符串转换为整数的函数)。 例如:若输入字符串\,则函数把它转换为整数值 -1234。 24 金陵科技学院实验报告 (4) 功能:编写函数int fun(char *ptr)过滤串,即只保留串中的字母字符,并统计新生成串中包含的字母个数作为函数的返回值。 (5)功能:编写函数void fun(char s[])将一个由四个数字组成的字符串转换为每两个数字间有一个空格的形式输出。 例如:输入“4567”,应输出“4□5□6□7”(□表示空格)。 (6) 功能:编写函数void fun(char s[],char c)从字符串s中删除指定的字符c。 说明:该字符可能多次和连续出现,算法应全面考虑。 4、讨论、思考题 (1)功能:请编写函数void fun(char (*s)[N], char *b),将M行N列的二维数组中的字符数据按列的顺序依次放到一个字符串中。 例如:二维数组中的数据为: W W W W S S S S H H H H 则字符串中的内容应是:WSHWSHWSHWSH。 (2)功能:编写函数void fun(char str[],int i,int n),从字符串str中删除第i个字符开始的连续n个字符(注意:str[0]代表字符串的第一个字符)。 (3)功能:编写函数void fun(char *s,char t[]),将s所指字符串中除了下标为奇数、同时ASCII值也为奇数的字符之外,其余的所有字符都删除,串中剩余字符所形成的一个新串放在t所指的数组中。 例如:若s所指字符串中的内容为:\,其中字符A的ASCII码值虽为奇数,但所在元素的下标为偶数,因此必需删除;而字符1的ASCII码值为奇数,所在数组中的下标也为奇数,因此不应当删除,其他依此类推。最后t所指的数组中的内容应是:\。 (4) 功能:请编写函数int fun( char *s),统计一行字符串中单词的个数作为函数值返回。规定所有单词由小写字母组成,单词之间由若干个空格隔开,一行的开始没有空格。 程序清单及流程图: 1、程序调试 25 金陵科技学院实验报告 2、程序改错 (1)功能:为一维数组输入10个整数;将其中最小的数与第一个数对换,将最大的数与最后一个数对换,输出数组元素。 #include void input(int *arr,int n) { int *p,i; p=arr; printf(\ for(i=0;i /**********ERROR**********/ scanf(\} void max_min(int *arr,int n) { int *min,*max,*p,t; min=max=arr; for(p=arr+1;p /**********ERROR**********/ if(*p>*max) max=p; 26 金陵科技学院实验报告 else if(*p<*min) min=p; t=*arr;*arr=*min;*min=t; /**********ERROR**********/ if(max==arr) max=min; t=*(arr+n-1); *(arr+n-1)=*max; *max=t; } void output(int *arr,int n) { int *p,i; p=arr; printf(\ /**********ERROR**********/ for(i=0;i printf(\ printf(\} main() { int a[10]; input(a,10); max_min(a,10); output(a,10); } (2)功能:将s所指字符串的反序和正序进行连接形成一个新串放在t所指的数组中。 例如:当s所指的字符串的内容为\时,t所指数组中的内容为\。 #include /**********FOUND**********/ 27 金陵科技学院实验报告 void fun (char *s, char *t) { int i, d; /**********FOUND**********/ d = strlen(s); /**********FOUND**********/ for (i = 0; i t[i] = s[d - 1 - i ]; for (i = 0; i /**********FOUND**********/ t[2*d] = '\\0'; } main() { char s[100], t[100]; printf(\ scanf(\ fun(s, t); printf(\} 四、实验结果与分析(程序运行结果及其分析) 3、程序设计 (1) 功能:请编写一个函数 int fun(int *s, int t, int *k),用来求出数组的最大元素在数组中的下标, 用k返回。 例如: 输入如下整数:876 675 896 101 301 401 980 431 451 777 则输出结果为: 6, 980 #include int fun(int *s, int t, int *k) { int i,max; max=s[0]; for(i=0;i if(max max=s[i]; 28 金陵科技学院实验报告 *k=i; } } return *k; } main() { int a[10],k; int i,s; printf(\ for(i=0;i<10;i++) { } s=fun(a, 10, &k); printf(\最大值的下标是%d\\n\ printf(\最大值是%d\\n\} scanf(\ (2) 功能:编写函数void len_cat(char c1[],char c2[])将第二个串连接到第一个串之后,不允许使用strcat函数 #include void len_cat(char c1[],char c2[]) { int i=0,n=0; n=strlen(c1); while(c2[i]!=0) { 29 金陵科技学院实验报告 } main() { } char a[N]=\len_cat(a,b); printf(\新的字符串为:\puts(a); } c1[n]='\\0'; c1[n++]=c2[i++]; (3) 功能:编写函数long fun ( char *p),将一个数字字符串转换为一个整数(不得调用C语言提供的将字符串转换为整数的函数)。 例如:若输入字符串\,则函数把它转换为整数值 1234。 #include long fun ( char *p) { long number=0,s=1; while(*p!='\\0') { } return number; } main() { char num[N]; long number; printf(\请输入一组数字字符串:\ 30 number=number*10+*p-'0'; p++; 金陵科技学院实验报告 gets(num); number=fun(num); printf(\请输出新的数字:%ld\\n\} (4) 功能:编写函数int fun(char *ptr)过滤串,即只保留串中的字母字符,并统计新生成串中包含的字母个数作为函数的返回值。 #include int n=0; while(*ptr!='\\0') { if((*ptr>='a'&&*ptr<='z')||(*ptr>='A'&&*ptr<='Z')) { n++; } ptr++; } return n; } main() { char a[N]; int n; printf(\请输入一组字符串:\gets(a); n=fun(a); printf(\输入字符串中字母的个数是%d\\n:\} 31 金陵科技学院实验报告 (5)功能:编写函数void fun(char s[])将一个由四个数字组成的字符串转换为每两个数字间有一个空格的形式输出。 例如:输入“4567”,应输出“4□5□6□7”(□表示空格)。 #include void fun(char s[]) { int i,n; n=strlen(s); for(i=n-1;i>0;i--) { s[2*i]=s[i]; s[2*i-1]=' '; } s[2*(n-1)+1]='\\0'; } main() { char num[N]; printf(\请输入一组数字字符串:\ gets(num); fun(num); printf(\请输出新的数字:%s\\n\} (6) 功能:编写函数void fun(char s[],char c)从字符串s中删除指定的字符c。 说明:该字符可能多次和连续出现,算法应全面考虑。 #include void fun(char s[],char c) { 32 金陵科技学院实验报告 int i,k=0; } main() { char a[N],ch; printf(\请输入一组字符串:\gets(a); for(i=0;s[i]!='\\0';i++) { if(s[i]!=c) { s[k++]=s[i]; } }s[k]='\\0'; printf(\请输入删除的字符ch:\ } scanf(\fun(a,ch); printf(\删除字符%c后的字符串为:%s\\n\ 五、实验体会(遇到问题及解决办法,编程后的心得体会) (1)功能:请编写函数void fun(char (*s)[N], char *b),将M行N列的二维数组中的字符数据按列的顺序依次放到一个字符串中。 例如:二维数组中的数据为: W W W W S S S S H H H H 则字符串中的内容应是:WSHWSHWSHWSH。 #include void fun(char (*s)[N], char *b) { int i,j,k=0; 33 金陵科技学院实验报告 for(j=0;j for(i=0;i b[k++]=s[i][j]; } } b[k]='\\0'; } main() { char a[100],b[M][N]={{'W','W','W'},{'S','S','S'},{'H','H','H'}}; int i,j; printf(\原始数据是\\n\ for(i=0;i for(j=0;j printf(\ } printf(\ } fun(b,a); printf(\字符串:\\n\ puts(a); } (2)功能:编写函数void fun(char str[],int i,int n),从字符串str中删除第i个字符开始的连续n个字符(注意:str[0]代表字符串的第一个字符)。 #include void fun(char str[],int i,int n) 34 金陵科技学院实验报告 { while(str[i+n-1]) { } str[i-1]='\\0'; } main() { char s[N]; int i,n; printf(\请输入一组字符串:\ gets(s); printf(\输入从第几个开始:\ scanf(\ printf(\输入删除几个字符:\ scanf(\ fun(s,i,n); printf(\从第%d开始删除%d后的字符串为:%s\\n\} str[i-1]=str[i+n-1]; i++; (3)功能:编写函数void fun(char *s,char t[]),将s所指字符串中除了下标为奇数、 同时ASCII值也为奇数的字符之外,其余的所有字符都删除,串中剩余字符所形成的一个新串放在t所指的数组中。 例如:若s所指字符串中的内容为:\,其中字符A的ASCII码值虽为奇数,但所在元素的下标为偶数,因此必需删除;而字符1的ASCII码值为奇数,所在数组中的下标也为奇数,因此不应当删除,其他依此类推。最后t所指的数组中的内容应是:\。 #include 35 金陵科技学院实验报告 #define N 20 void fun(char *s,char t[]) { int i,j=0; for( i=0;s[i]!='\\0';i++) { if(i%2!=0&&(s[i]-'0')%2!=0) { t[j++]=s[i]; } } t[j]='\\0'; } main() { char a[N],b[N]; printf(\请输入一组字符串:\ gets(a); fun(a,b); printf(\下标为奇数且ASCII值也为奇数的字符:%s\\n\} (4) 功能:请编写函数int fun( char *s),统计一行字符串中单词的个数作为函数值返回。规定所有单词由小写字母组成,单词之间由若干个空格隔开,一行的开始没有空格。 #include #include int fun( char *s) { int n=1; while(*s!='\\0') 36 金陵科技学院实验报告 心得体会: { if(*s==' ') { n++; } s++; } return n; } main() { int n=0; char ss[200]; printf(\请输入一组字符串:\ gets(ss); n=fun(ss); printf(\单词的个数是:%d\\n\} 37 金陵科技学院实验报告 实验项目名称: 构造类型程序设计 实验学时: 4 同组学生姓名: 实验地点: 实验日期: 实验成绩: 批改教师: 批改时间: 38