C实验指导书16学时
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言程序设计实验指导书
桂林电子科技大学信息科技学院
20012.01
前言上机实验的目的和要求
一上机实验的目的
上机实验的目的,绝不仅仅是为了验证教材和讲课的内容,或者验证自己所编程序正确与否。
学习程序语言,上机实验的目的如下:
1 加深对讲授内容的理解,尤其是一些语法规定,光靠课堂讲授,既枯燥无味又难以记住,通过多次上机,就能自然、熟练地掌握语法规定。
2 了解和熟悉C语言程序开发环境。
熟悉一两种环境(计算机系统的软件和硬件条件),再遇到其他的系统时便会触类旁通,很快学会。
3 学会上机调试程序,也就是善于发现程序中的错误,并且能很快地排除这些错误,使程序能够正确地运行。
要真正掌握计算机应用技术,就不仅应当了解和熟悉有关理论和方法,而且要求自己动手实践能力强。
4 在做实验时千万不要在程序通过后就认为万事大吉,完成任务了,应当在通过的程序上做一些调试和修改,看看会得到什么结果。
多动脑筋思考,将会对你有很大帮助。
二上机实验前的准备工作
1 了解所用的计算机系统的性能和使用方法;
2 复习和掌握与本实验有关的教学内容;
3 准备好上机所用的程序,切忌自己不思考、不编制程序或抄袭别人的程序;
4 准备好调试和运行时所需的数据。
三上机实验的步骤
1 调出C语言编译系统,进入C语言工作环境;
2 输入自己编制好的程序;
3 检查输入是否有错,及时更正;
4 进行编译和连接;
5 运行程序,分析结果。
四、实验结束,整理实验报告
实验报告应包括以下内容:
1 上机题目;
2 程序清单;
3 运行结果;
4 对结果的分析和本次获得的经验和体会。
实验一 C语言程序初步
数据类型、运算符和表达式
一实验目的
1 熟悉C语言运行环境——Microsoft Visual C++ 6.0中文版。
2 掌握C语言程序的书写格式和C语言程序的结构,初步了解C源程序的特点。
3 掌握C语言上机步骤,了解如何编辑、编译、调试和运行一个C程序的方法。
4 掌握C语言数据类型,熟悉如何定义一个整型、字符型和实型的变量,以及对他们赋值的方法。
5 掌握不同的类型数据之间赋值的规律。
二实验内容
1 C语言上机步骤
⑴开机,启动Microsoft Visual C++ 6。
⑵建立工程文件:在“文件”菜单中选择“新建”命令项,在弹出的“新建”对话框的“工程”选项卡中选择“Win32 Console Application”选项,在“工程”框中输入工程文件名sy1,在“c:位置”下拉框中输入或选择文件夹,单击“确定”;在以下弹出的两个对话框中分别单击命令按钮“完成”和“确定”。
⑶建立C++源文件:在“工程”菜单中选择“添加到工程”—“新建”命令项,在弹出的“新建”对话框的“文件”选项卡中选择“C++ Source File”,在右边的“文件”框中输入文件名sy11后单击“确定”。
⑷输入源程序:在弹出的文件编辑窗口中输入下面的源程序:
#include <stdio.h>
void main()
{ printf("Hello,World!\n");
printf("Welcome to the C language world!\n");
printf("Everyone has been waiting for.\n");
}
⑸编译:用“编译”菜单的“编译”命令项对源文件sy11.cpp进行编译,如果程序有语法或语义错误,在屏幕下面的窗口会出现错误信息;这时候要修改源程序、保存后重新编
译。
直到修改了全部错误,屏幕下面的窗口会出现下面的信息:
表示已通过编译,生成了目标程序sy11.obj。
⑹调试:接下来进行调试,操作如下图所示。
完成调试后,生成可执行程序文件sy1.exe。
⑺运行:最后用“编译”菜单的“!执行sy1.exe”命令项运行可执行程序文件sy1.exe。
运行结果如下:
2 用同样的方法,完成下面程序的运行
1 输入并运行下面的程序,运行后记录并分析结果。
#include <stdio.h>
main()
{ char c1,c2; /* 第2行 */
c1=97;c2=98; /* 第3行 */
printf ("%c %c\n",c1,c2);
}
在此基础上:
⑴在程序最后增加一个语句,再运行,并分析结果。
printf ("%d %d\n", c1, c2);
⑵将第2行改为:
int c1,c2;
再次运行,并分析结果。
⑶再将第3行改为:
c1=305;c2=340;
再使之运行,分析运行结果。
2 输入并运行下面的程序
#include <stdio.h>
main()
{ char c1='a',c2='b',c3='c',c4='\101',c5='\116';
printf("a%c b%c\tc%c\tabc\n",c1, c2, c3);
printf("\t\t\b%c%c\n", c4, c5);
}
在上机前先用人工分析程序,写出应得结果,上机后将二者对照。
三分析与讨论
1 下在调试过程中所发现的错误、系统给出的出错信息和对策。
分析讨论成功或失败的原因。
2 总结C程序的结构和书写规则。
四思考题
1 请写出C语言程序的构成和运行C语言程序的一般步骤。
2 编写一个C语言程序,输入a、b、c三个数,输出其中最大者。
试想,如果求四个数中的最大者,则程序该如何编写。
五注意事项
1 当程序在编译时发现很多错误,此时应从上到下逐一改正,或改一个错误,就重新再编译,因为有时一个错误会引起很多错误信息。
2 当需要用比较复杂的逻辑表达式时,要避免发生优先级上的错误,可以使用最高优先级的运算符()将其括起来,这样既增加可读性,又不会出现不必要的错误。
实验二顺序结构与输入/输出方法
一实验目的
1 学会使用C的有关算术运算符,以及包含这些运算符的表达式,特别是自加(++)和
自减(--)运算符的使用。
2 掌握C语言中赋值语句的使用。
3 掌握C语言中各种数据的输入/输出方法,能正确使用各种格式转换符。
4 理解C语言程序的顺序结构。
二实验内容
上机调通以下程序。
1 输入下面的程序
#include <stdio.h>
main()
{ int i,j,m,n;
i=8;j=10;
m=++i; /* 第5行 */
n=j++; /* 第6行 */
printf("%d,%d,%d,%d\n",i,j,m,n);
}
运行程序,注意i、j、m、n各变量的值;然后分别作以下改动并运行:
⑴将第5、6行改为如下以后再运行:
m=i++;
n=++j;
⑵将程序改为:
#include <stdio.h>
main()
{ int i,j;
i=8;j=10;
printf("%d,%d\n",i++,j++); /* 第5行 */
}
⑶在⑵的基础上,将第5行printf语句改为:
printf("%d,%d\n",++i,++j);
⑷再将printf语句改为:
printf("%d,%d,%d,%d\n",i,j,i++,j++);
⑸将程序改为:
#include <stdio.h>
main()
{ int i,j,m=0,n=0;
i=8;j=10;
m+=i++;n-=--j;
printf("i=%d,j=%d,m=%d,n=%d\n",i,j,m,n);
}
2 运行以下程序,并分析其输出结果
#include <stdio.h>
main()
{ short i;
i=-2;
printf("\n i:dec=%d,oct=%o,hex=%x,unsigned=%u\n",i,i,i,i);
}
【注意】在VC++ 6.0中,short和int类型的数据在内存中占用4个字节。
3 按格式要求输入、输出数据。
#include <stdio.h>
main()
{ int a,b;
float x,y;
char c1,c2;
scanf("a=%d,b=%d",&a,&b);
scanf("%f,%e",&x,&y);
scanf("%c%c%c",&c1,&c1,&c2); /* 第8行 */
printf("a=%d,b=%d,x=%f,y=%f,c1=%c,c2=%c\n",a,b,x,y,c1,c2);
}
运行该程序,按如下方式在键盘上输入数据:
a=3,b=7
85,71.82
aA
请同学们写出输出的结果。
【思考】程序第8行中,为什么变量c1要输入两次?
4 运行以下程序,并分析其输出结果
#include <stdio.h>
main()
{ float f;
f=3.1415;
printf("\n %f,%4.3f,%5.3f,%-10.3f,%10.3f\n",f,f,f,f,f);
}
4 运行以下程序,并分析其输出结果
#include <stdio.h>
main()
{ int a,b; float c,d; char c1,c2;
a=61;b=62;c=31.5;d=-68.87;c1='a';c2='A';
printf("\n");
printf("a=%d,b=%d\n",a,b);
printf("c=%f,d=%f\n",c,d);
printf("c=%e,d=%e\n",c,d);
printf("c1=%c,%c\n",c1,c2);
}
【注意】在VC++ 6.0中,实数的指数形式是:±X.XXXXXXe±XXX
5 以下程序的功能是从键盘输入一个整型数,一个实型数和一个字符型数,并把他们在屏幕上输出。
完成以下填空,并把程序调通,写出当输入为45,34.5,A<回车>时程序的运行结果。
#include <stdio.h>
main()
{ int a; float b; char c;
scanf("%d,%f,%c", );
printf("a= \n",a);
printf("b= \n",b);
printf("c= \n",c);
}
6 指出以下程序的错误并改正,并上机把程序调通。
#include <stdio.h>
main()
{ int a;
scanf("%f",a);
printf("a=%f, a);
char c;
c=A;
printf("%f,c)
}
三思考题
1 编写程序,用getchar函数读入两个字符c1,c2,然后分别用putchar函数和printf 函数输出这两个字符。
并思考以下问题:
⑴变量c1,c2应定义为字符型或整型?还是二者皆可?
⑵要求输出c1和c2的ASCII码,应如何处理?用putchar函数还是printf函数?
⑶整型变量和字符型变量是否在任何情况下都可以互相代替?
2 设圆半径r=2,圆柱高h=3,求圆周长,圆柱底面积,圆柱体积。
用scanf输入数据,用printf输出计算结果,输出时要求有文字说明,取小数点后两位数字。
实验三逻辑运算和选择结构程序设计
一实验目的
1 掌握C语言表示逻辑量的方法(0代表“假”,1代表“真”);
2 学会正确使用逻辑运算符和逻辑表达式;
3 熟练掌握if语句和switch语句。
二实验内容
1 已知三个数a,b,c,找出最大值放在max中。
#include <stdio.h>
main()
{ int a,b,c,max;
printf("请输入3个整数(中间用逗号分开):");
scanf("%d,%d,%d",&a,&b,&c);
if(a>=b) max=a;
else max=b;
if(c>max) max=c;
printf("max=%d\n",max);
}
2 输入某学生的成绩,经处理后给出学生的等级,等级如下:
90分以上(包括90):A 80~90分(包括80):B
70~80分(包括70):C 60~70分(包括60):D
60分以下:E
方法一:用嵌套的if语句
#include "stdio.h"
main()
{ int score; char grade;
printf("请输入学生成绩:");
scanf("%d",&score);
if(score>100||score<0) printf("\n输入成绩错误!\n");
else{ if(score>=90) grade='A';
else if(score>=80) grade='B';
else if(score>=70) grade='C';
else if(score>=60) grade='D';
else grade='E';
printf("\n成绩等级是%c\n",grade);
}
}
输入测试数据,调试程序。
测试数据要覆盖所有路径,注意临界值,例如此题中100分,60分,0分以及小于0和大于100的数据。
如果稍不注意就会出现小的程序缺陷。
方法二:用switch语句
分析:switch语句是用于处理多分支的语句。
注意,case后的表达式必须是一个常量表
达式,所以在用switch 语句之前,必须把0~100之间的成绩分别化成相关的常量。
所有A (除100以外)、B 、C 、D 类的成绩的共同特点是十位数相同,此外都是E 类。
则由此可把score 除十取整,化为相应的常数。
请同学们自己根据分析写出完整的程序段,并编译、运行、查看结果。
三 思考题
1 有一函数:
x (-5<x<0)
y = x-1 (x=0)
x+1 (0<x<10)
要求输入x 的值,输出y 的值。
分别用:⑴ 不用嵌套的if 语句;⑵ 用嵌套的if 语句;⑶ 用switch 语句编写程序。
2 从键盘上输入三个实数,它们分别代表三条线段的长度,请写一个判断这三条线段所组成的三角形属于什么类型(不等边,等腰,等边或不构成三角形)的C 程序;如果能构成三角形,求出三角形的面积(取小数2位)。
【提示】已知三角形边长a 、b 、c ,计算三角形面积s 的公式是:
四 注意事项:
1 if-else 语句书写时应采用分层缩进的格式。
2 switch 语句的句法格式。
实验四 循环结构程序设计
一 目的和要求
1 掌握在设计条件型循环结构时,如何正确地设定循环条件,以及如何正确地控制计数
型循环结构的次数。
2
c b a p )c p )(b p )(a p (p s ++=
---=其中
2 熟悉用while语句,do-while语句和for语句实现循环的方法。
3 掌握在程序设计中用循环的方法实现各种算法(如穷举、选代、递推等)。
4 掌握选择结构与循环结构的嵌套。
二实验内容
1 程序分析
下面是一个计算e的近似值(使误差小于给定的δ)的程序。
#include <stdio.h>
main()
{ double e=1.0,x=1.0,y,delta;
int i=1;
printf("请输入给定的误差:");
scanf("%lf",&delta);
y=1/x; 1.0 1 1 1 1
while(y>=delta) e=1+1 i=2 x=2 y=1/2
{ e=e+y; 2+1/2 3 2*3 1/6
i++; 2+1/2+1/6 4 2*3*4 1/24
x=x*i; 2+ +1/(n-1)! n n! 1/n!
y=1/x;
}
printf("计算结果是:%12.10lf\n",e);
}
⑴阅读上面的程序,写出程序所依据的计算公式。
⑵当输入的delta是什么值时,能分别使程序按下面的要求运行:
ⅰ不进入循环;
ⅱ只循环一次; >0.5 <=1
ⅲ只循环两次; >=0.5 >1/6
ⅳ进入死循环(程序将永远循环下去)。
<=0
ⅴ为了能知道程序循环了多少次,应该在程序中增加一条什么样的语句?
⑶原程序中while语句中的y>=delta,分别换成y>delta,y=delta,y<delta,y<=detax 观察程序运行将会有什么变化。
⑷把程序中的while结构改写成do-while结构,再运行程序,说明两种结构的区别。
⑸将程序改成用for循环结构,计算前50项,并运行程序,写出运行结果。
2 有一数列:2/1,3/2,5/3,8/5,…求出这个数列的前10项之和。
#include <stdio.h>
main()
{ int n,t;
float a=2,b=1,s=0;
for(n=1;n<=10;n++)
{ s=s+a/b;
t=a;
a=a+b;
b=t;
}
printf("%f\n",s);
}
要求:跟踪执行,观察s、t、a、b的变化。
方法:使用功能键F10单步跟踪执行程序,可以在监视窗口设置要观察的变量或表达式。
监视窗口
3 计算两个数的最大公约数。
算法:
⑴输入两个整数m、n,并求m除以n的余数k。
⑵当k≠0,将除数n作为被除数m,余数k作为除数n,继续求m除以n的余数k;反复做第⑵步,直到余数为0结束循环。
⑶结束循环后,除数n就是m与n的最大公约数。
请同学们根据算法写出完整的程序,并编译、运行、检查结果的正确性。
三思考题
编写程序:输入6名学生5门课程的成绩,分别统计出每个学生5门课程的平均成绩。
四、注意事项
1 while语句的句法格式及用法。
2 for语句的正确使用方法。
注意它的初始值、终止条件及步长的确定。
3 当循环不能停止(出现死循环),应该用Ctrl+break中断程序的运行。
实验五数组
一实验目的
1 掌握一维数组和二维数组的定义、赋值和输入输出的方法;
2 掌握字符数组和字符串函数的使用;
3 掌握与数组有关的算法(特别是排序算法)
二、实验内容
编程序并上机调试运行。
1 调试下列错误程序,使之具有如下功能:输入12个整数,按每行3个数输出这些整数,最后输出12个整数的平均值。
写出调试过程。
#include <stdio.h>
#define N 12
main()
{ int i,a[N],av;
for(i=0;i<N;i++) scanf("%d",a[i]);
for(i=0;i<N;i++)
{ printf("%d",a[i]);
if(i%3==0) printf("\n");
}
for(i=0;i!=N;i++) av+=a[i];
printf("av=%f\N",av);
}
上面给出的程序有错误和缺陷,请找出程序中的错误并改正。
【提示】请注意输入提示、变量赋初值、循环结束条件、输出格式等问题。
2 编写程序,输入9个整数到3×3二维数组,输出:
1 2 3 1 1 2 3
4 5 6 4 5 5 6
7 8 9 7 8 9 9
3 有一个3×4的矩阵,要求输出其中值最大的元素的值,以及它的行号和列号。
#include <stdio.h>
#define M 3
#define N 4
main()
{ int max,i,j,r,c;
int a[M][N]={{123,94,-10,218},{3,9,10,-83},{45,16,44,-99}};
max=a[0][0];
for(i=0;i<M;i++)
for(j=0;j<N;j++)
if(a[i][j]>max) { max=a[i][j]; r=i; c=j; }
printf("max=%d,row=%d,colum=%d\n",max,r,c);
}
输入并调试、运行程序,记录程序的输出;若将a[0][0]改为1230,程序运行结果有错,应如何修改程序?
4按照下面算法编一个程序,将两个字符串连接起来,不能用strcat函数。
⑴定义整型变量i、j,字符串s1、s2
⑵输入字符串s1、s2
⑶当字符串s1尚未结束,改变字符串s1的下标,使之到s1结束处
⑷当字符串s2尚未结束,将字符串s2逐个字符连接到字符串s1的后面
⑸为字符串s1添加结束标志
⑹输出连接后的字符串s1[4]=s2[0]
S1[0] s1[1] s1[2] s1[3] s1[4]
三思考题
1 将一个数组中的值按逆序重新存放,例如,原来顺序为8,6,5,4,1,要求改为1,4,5,6,8。
2 最常用的排序方法除了冒泡排序外,还有选择排序。
程序设计思路:设有10个元素a[0]~a[9],将a[0]与a[1]~a[9]比较,若a[0]比a[1]~a[9]都小,则不进行交换,即无任何操作。
若a[1]~a[9]中有一个以上比a[0]小,则将其中最小的一个(假设为a[i])与a[0]交换,此时a[0]中存放了10个中最小的数。
第二遍将a[1]与a[2]~a[9]比较,将剩下9个数中的最小者a[i]与a[1]对换,此时a[1]中存放的是10个中第2小的数。
依此类推,共进行9遍比较,a[0]到a[9]就已按由小到大顺序存放。
n个数的选择排序的N-S图如下:
定义变量、输入n及数组a各元素
for(i=0;i<n-1;i++)
k=i
for(j=i+1;j<n;j++)
a[j]<a[k]
真假
k=j
交换a[k]与a[i]
输出已排序的n个数
用冒泡排序同样的主函数,请根据上面的N-S图编写选择排序函数。
四、注意事项
1 在C语言中,数组元素的下标从0开始,最大下标总是比定义的数组长度少1。
2 在C语言中,定义数组时,其长度必须指定且必须用常量表示。
实验六 函数
一 实验目的
1 掌握定义函数的方法;
2 掌握函数实参与形参的对应关系以及“值传递”的方式;
3 掌握函数的嵌套调用和递归调用的方法;
4 掌握全局变量和局部变量动态变量、静态变量的概念和使用方法。
二 实验内容
1 编写两个函数,分别求两个正整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,两个正整数由键盘输入。
【提示】设有两个正整数m 和n
⑴ 实验五介绍了求最大公约数的算法,下面介绍用递归求m 和n 的最大公约数h 的方法。
设hcf(int m,int n)是用来求m 和n 的最大公约数h 函数,k=m%n ,则:
⑵ 若最大公约数为h ,则最小公倍数l=m*n/h 。
实验时,完成以下两个函数的定义,使之和主程序构成完整的程序,实现题目的要求。
#include <stdio.h>
int hcf(int m,int n) /* 求最大公约数的函数 */ { …… }
int lcd(int m,int n,int h) /* 求最小公倍数的函数 */ { …… } void main() { int m,n,h,l;
printf("请输入两个正整数m 、n :"); scanf("%d,%d ",&m,&n); h=hcf(m,n);
printf("%d 和%d 的最大公约数是:%d\n ",m,n,h);
⎩⎨
⎧=≠=0
k n
0k )k ,n (hcf h
l=lcd(m,n,h);
printf("%d 和%d 的最大公约数是:%d\n ",m,n,l); }
程序调试通过后,用m=350、n=125和m=96、n=64两组数据运行程序,记录程序的输出。
2 上机调试下面的程序,记录系统给出的出错信息,并指出错误原因。
main() { int x,y;
printf("%d\n ",sum(x+y)); int sum(a,b); { int a,b;
return(a+b); } }
3 编写求n!的函数f(int n),在主函数中输入两个整数m 、n ,然后调用函数求:
【注意】函数f 的类型应用long 或double 。
4 有一个字符串,内有若干个字符,今输入一个字符,要求程序将字符串中指定的字符删去,用外部函数实现。
整个程序由4个文件组成,这4个文件如下: sy64a.cpp
#include <stdio.h> void main()
{ extern void enter_string(char str[]);
extern void delete_string(char str[],char ch); extern void print_string(char str[]);
/* 以上3行声明在本函数中要调用在其他文件中定义的3个函数 */ char c; char str[80]; enter_string(str);
printf("请输入欲删除的字符:"); scanf("%c ",&c); delete_string(str,c); print_string(str);
n)!
-(m n!m!
C n m
}
sy64b.cpp
#include <stdio.h>
void enter_string(char str[80]) /* 定义外部函数enter_string */
{ printf("请输入字符串:");
gets(str); /* 从键盘输入字符串到数组str */
}
sy64c.cpp
#include <stdio.h>
void delete_string(char str[],char ch) /* 定义外部函数delete_string */
{ int i,j;
for(i=j=0;str[i]!='\0';i++) if(str[i]!=ch) str[j++]=str[i];
str[j]='\0';
}
sy64d.cpp
#include <stdio.h>
void print_string(char str[]) /* 定义外部函数printr_string */
{ printf("删除指定字符后的结果:%s\n",str); }
建立工程sy64,然后在工程sy64中建立这4个文件,调试并运行程序:
输入字符串: abcdceccfg
输入要删去的字符:c
记录运行后的输出结果。
三注意事项
1 参数是一个函数与外界的接口,其有无、多少,取决于在实现该函数功能时是否需要已知数据,以及需要多少,它的所需,即为参数。
2 注意函数调用返回的特点:返回调用处,而后继续执行下面的语句。
3 函数中无return语句时,函数的类型定义为void或int,不可定义为其他。
4 当被调函数定义在主调函数之后时,应在主调函数中说明被调函数,否则,调用时将出现错误。
5 当一个程序由2个或2个以上的源程序文件组成时,必须将这些源程序文件组织在一个工程——项目文件中。
在编译时,系统会分别对项目文件中的每个文件进行编译,然后将所得到的目标文件连接成一个整体,再与系统的有关资源连接,生成一个可执行文件,最后执行这个文件。
实验七 指针
一 实验目的
1 了解指针的概念,学会定义和使用指针变量。
2 掌握指针、变量和数组的关系及使用方法。
3 学会使用指向函数的指针变量。
二 实验内容
1 运行下列程序,写出运行结果。
#include "stdio.h " main()
{ int a[5],*p,j;
for(j=0;j<5;j++) a[j]=j+1; p=a;
for(j=0;j<5;j++) printf("*(p+%d)=%d\n ",j,*(p+j)); }
将输出语句中的*改成方括号的形式,修改后再运行程序。
2 函数void fun(float *sn,int n)的功能是:根据以下公式计算S ,计算结果通过形参指针sn 传回;n 通过实参传入,n 的值大于等于0。
请填空,并编写出主函数,使之成为完整程序,上机调试运行。
1
21
7151311+⋯
+-+-
=n S void fun(float *sn,int n) { float s=0.0,w,f=-1.0; int i=0;
for (i=0;i<=n;i++); { f= * f;
w=f/(2*i+1); s+=w; }
=s; }
3 想使指针变量pt1指向a和b中的大者,pt2指向小者,以下程序能否实现此目的?swap(int *p1,int *p2)
{ int *p;
p=p1;p1=p2;p2=p
}
main()
{ int a,b; int *pt1,*pt2 ;
scanf("%d,%d",&a,&b);
pt1=&a; pt2=&b ;
if(a<b) swap(pt1,pt2);
printf("%d,%d \n",*pt1,*pt2) ;
}
上机调试此程序。
如果不能实现题目要求,指出原因并修改之。
4 分析并验证以下程序的运行结果。
#include "stdio.h"
main()
{ char str[]="ABC",*p=str;
printf("%c\n",*(p+1));
}
5 分析并验证以下程序的运行结果:
#include "stdio.h"
main()
{ char a[4][5]={"ABCD","EFGH","IJK L","MNOP"};
char (*p)[5];
int i,j;
p=a;
for(i=0;i<4;i++)
{ for(j=0;j<4;j++) printf("%c",*(*(p+i)+j)); /* 第9行 */ printf("\n");
}
}
若将程序第9行中的%c改成%s,应该怎样修改?
6 分析以下程序运行结果,说明程序的作用。
#include "stdio.h"
char *strc(char *s1,char *s2)
{ char *p=s1;
while(*s2!='\0') { *p++=*s2++; }
return s1;
}
main()
{ char s1[30]="computer ok!",s2[]="language",*pt;
pt=strc(s1,s2);
printf("%s\n",pt);
}
三思考题
1 下面的程序用来实现将一个3×3的矩阵转置。
#include "stdio.h"
void tranf(int (*p)[3])
{ int t,i,j;
for(i=0;i<3;i++)
for(j=0;j<i;j++)
{ t=p[i][j]; p[i][j]=p[j][i]; p[j][i]=t; }
}
main()
{ int i,j,a[3][3];
for(i=0;i<3;i++)
for(j=0;j<3;j++) scanf("%d",&a[i][j]);
tranf(a);
for(i=0;i<3;i++)
{ for(j=0;j<3;j++) printf("%3d",a[i][j]);
printf("\n");
}
}
将上面程序tranf函数中的的方括号改成*号的表示形式,调试并运行程序。
程序输入:1 2 3 4 5 6 7 8 9,记录程序的输出。
2 用指向指针的方法对n个整数排序并输出。
要求将排序单独写一个函数。
n和各个整数在主函数中输入,最后在主函数中输出。
四注意事项
1 一个指针变量定义后,必须使其指向确定值(即给它赋值),否则,如果直接应用它的目标,就会破坏内存,使程序出错,甚至造成死机。
2 注意二维数组元素的不同表示方法,必须灵活掌握。
3 字符数组保存一字符串后,其长度一般不再起作用,对它的各种操作以字符串结束,标志'\0'作为结束条件。
4 字符串中%s格式整体输入和输出时,其输入输出项均为数组名。
5 当用一个字符串给一字符型变量赋值时,是把该字符串的首地址赋值给它,而不是该字符串。
字符型指针变量的目标是一个字符,而不是整个字符串。
实验八结构体和文件
一实验目的
1 掌握结构体类型的概念和定义方法与使用。
2 掌握指向结构体变量的指针变量的概念和应用。
3 掌握文件的基本概念
4 掌握文件指针与打开、关闭文件的相关函数
二实验内容
1 定义一个结构体类型,其成员包括:学号(num),姓名(name[20]),性别(sex),年龄(age),三门课的成绩(score[3])。
2 按上面的结构体类型定义一个结构体数组并初始化,然后调用一个函数count,在该函数中计算出每个学生的总分和平均分,最后返回主函数输出所有各项数据(包括原有的和新求出的)。
【提示】①在定义结构体类型时应预留出准备计算结果的成员项。
②设结构体变量为函数参数,将各数据传给count函数。
#include "stdio.h"
struct student
{ char num[9], name[20], sex; int age,score[3],sum; float av;
}st[3]=
{{"06040106","Li Ping", 'M', 18, 87,89,91},
{"06040125","Chen Fen", 'F', 19, 78,75,81},
{"06040132","Wang Yifei",'M', 19, 65,67,69}};
void count(struct student *p)
{ int i,j;
for(i=0;i<3;i++)
{ p[i].sum=0;
for(j=0;j<3;j++) p[i].sum+=p[i].score[j];
p[i].av=p[i].sum/3.0;
}
}
void main()
{ int i,j;
count(st);
printf("The student's information:\n");
printf("Num Name Sex Age Score Sum Average\n");
for(i=0;i<3;i++)
{ printf("%-10s%-12s%-3c%5d ",st[i].num,st[i].name,
st[i].sex,st[i].age);
for(j=0;j<3;j++) printf("%3d",st[i].score[j]);
printf("%6d%9.1f\n",st[i].sum,st[i].av);
}
}
读懂程序,特别注意程序的输出格式,然后调试运行程序,记录程序的输出。
3 将上题改为用指针方法处理,即用指针变量逐次指向数组元素,然后向指针变量所指向的元素输入数据,并将指针变量作为函数参数将地址值传给count函数,在函数count中作统计,再将数据返回到main函数,在main函数中输出。
4 设有一文件cj.dat存放了若干学生的成绩(英语、计算机、数学),存放格式为:每人一行,成绩间用逗号分隔。
计算三门课的平均成绩,统计个人平均成绩大于或等于90分的学生人数。
#include "stdio.h"
main()
{ FILE *fp; int num=0;
float x,y,z;
fp=fopen("cj.dat","r");
while(!feof(fp))
{ fscanf(fp,"%f,%f,%f",&x,&y,&z);
if((x+y+z)/3>=90) num=num+1;
}
printf("平均成绩在90分以上的学生人数:%2d人\n",num);
fclose(fp);
}
建立并调试、运行程序,记录程序的输出结果。
5 统计上题cj.dat文件中每个学生的总成绩,并将原有数据和计算出的总分数存放在磁盘文件stud.dat中。
#include "stdio.h"
main()
{ FILE *fp1,*fp2;
float x,y,z;
fp1=fopen("cj.dat","r");
fp2=fopen("stud.dat","w");
while(!feof(fp1))
{ fscanf(fp1,"%f,%f,%f",&x,&y,&z);
printf("%.0f,%.0f,%.0f,%.0f\n",x,y,z,x+y+z);
fprintf(fp2,"%.0f,%.0f,%.0f,%.0f\n",x,y,z,x+y+z);
}
fclose(fp1);
fclose(fp2);
}
建立并调试、运行程序,记录程序的输出结果。
三注意事项
1 当程序编译成功但运行结果不正确时,则表示产生逻辑错误。
此时应:
⑴查看程序的层次是否正确,尤其要注意复合语句的括号和位置等。
⑵采用分段检查的方法。
在程序中的不同位置设几个函数语句,输出相关变量的值,逐段检查。
⑶最后检查算法是否正确。
2 当读文件时,一定要保证指定路径上有该文件,否则打开文件失败;当写文件时,一定要保证指定盘有足够的存储空间,否则创建文件失败;对文件操作完毕后,一定要关闭文件。