C语言实验报告(16)

更新时间:2024-06-09 18:23:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

专 业 _____________ 年 级 _____________ 学 号 _____________ 学生姓名 _____________ 指导老师 _____________

华中师范大学信息管理系编

《C语言》实验报告

I 实习目的和意义

C语言程序设计实验的目的是培养学生具有初步的C语言程序设计、编程、调试和排除C语言程序语法、逻辑错误的能力。通过实验使学生进一步熟悉并掌握C语言程序的调试运行环境、程序设计过程、程序的基本结构以及程序设计的基本方法。通过实验,使学生将程序设计的理论知识与实践相结合,为学生学习其他计算机编程语言打下基础。

在每一次的实验过程中,学生要认真复习基本概念,独立编写程序,并上机调试运行,培养自己发现程序中的错误、改正错误以使程序能正确运行的能力。经验丰富的人,当编译时出现“出错信息”时,能很快地判断出错误所在,并改正之。而缺乏经验的人即使在系统给出明确出错提示信息下也往往找不出错误而求救于别人。对于学生来说,不仅要了解和熟悉有关理论和方法,还要求自己动手实现,要求会编写程序并上机调试通过。因此调试程序本身是程序设计课程的一个重要内容和基本要求,应给予充分的重视。调试程序的经验固然可以借鉴他人的现成经验,但更重要的是通过自己的直接实践来积累,而且有些经验是只能“意会”难以“言传”。

调试程序的能力,是学完《C语言程序设计》之后,每个学生应当掌握的一项基本功。因此,在实习时千万不要在程序通过后就认为完成任务了,而应当在已通过的程序基础上作一些改动(例如修改一些参数、增加程序一些功能、改变输入数据的方法等,甚至于“自设障碍”,即把正确的程序改为有错的,如用scanf函数输入变量时,漏写“&”符号,使数组下标越界,使整数溢出等),观察和分析所出现的情况,并认真、及时总结。这样的学习是灵活主动的学习而不是呆板被动的学习,才会有真正的收获。

II实验要求

1.每次实验中有若干习题,每个学生至少应该完成其中的三道习题。

2.上机之前应作好充分的准备工作,预先编好程序,经过人工检查无误后,才能上机,以提高上机效率,严禁一边上机一边编写。

3.独立上机输入和调试自己所编的程序,切忌抄袭、拷贝他人程序。

4.上机结束后,应整理出实验报告。书写实验报告时,重点放在调试过程和小结部分,总结出本次实验中的得与失,以达到巩固课堂学习、提高动手能力之目的。

III 实验内容

实验一 VC++6.0开发平台环境及应用

【实验目的】

1.熟悉VC++6.0的运行环境。

2.了解在VC++6.0上如何编辑、编译、连接和运行一个C程序。

3.通过运行简单的C程序,初步了解C源程序的特点,初步掌握查错和排错的技能.

【上机实习指导】

1.通过阅读上机操作指南,在VC中练习输入、编译、运行一个C语言程序的全过程。

2

以下程序是计算函数y=3x+2x-4(假设x=2)。 # include “stdio.h” void main( ) {

2

int x=2,y; y=3*x*x+2*x-4;

printf(“\\ny=%d”,y); }

程序运行正确后,可以尝试改变x的值和输出格式“%d”、 “%u”、”%o”、”%x”等,观察运行结果的变化。

2.分析下面的程序输出的结果。 # include int main( ) {

char c='1'; int i=-1;

long n=2147483647; float f=-0.12345;

putchar(c);putchar(';');printf(\ printf(\ printf(\ printf(\ printf(\ printf(\

printf(\ return 0; }

【自编程序上机】

1.编程实现在屏幕输出下面图形

* * * * * * * * * * * * *

2.编程实现:从键盘上输入半径,输出园的周长及面积。

3

【实验报告】

实习时间: 实习地点: 实习机号: 具 体 实 验 内 容 4

程 序 调 试 过 程 实 习 小 结 5

实验二 简单程序设计

【实验目的】

1.进一步熟悉VC++6.0的运行环境。

2.掌握三种标准类型和部分运算符的使用。 3.熟练掌握格式输入与格式输出函数的使用。

【上机实习指导】

1.基本数据类型表示范围练习 假设有如下程序: # include void main ( ) {

char ch1, ch2, ch; unsigned char c; int a; ch1 = 80; ch2 = 60;

ch = ch1 + ch2; c = ch1 + ch2; a = ch1 + ch2;

printf (“ch1 + ch2 = %d\\n”, ch1 + ch2); printf(“ch = %d\\n”, ch); printf(“c = %d\\n”, c); printf(“a = %d\\n”, a); }

问题1 :运行该程序,写出输出结果。并说明为什么存在输出结果的差异?

问题2 :如果要求四行输出的结果均为140,在不改变变量的数据类型的基础上,则应修改程序中的哪条语句?怎样修改?

问题3 :编一程序,要求两个负整数相加,输出的结果为一正整数。

【自编程序上机】

1. 键盘输入与屏幕输出练习 用下面的scanf函数输入数据,使a = 3, b = 7, x = 8.5, y = 71.82, c1 = ?A?, c2 = ?a?,问在键盘上如何输入?要求把下列程序补充完整。

#include void main ( ) {

int a, b; float x, y; char c1, c2;

6

scanf (“a = %d b = %d”, &a, &b); scanf(“x = %f y = %e”, &x, &y); scanf(“c1 = %c c2 = %c”, &c1, &c2);

}

提示:在“格式控制”字符串中除了格式说明以外还有其它字符,在输入数据时应输入与这些字符相同的字符。为了验证输入格式的正确与否,应在程序中补充调用标准的输出函数printf。

2. 按输出结果要求编写程序

若a = 3, b = 4, c = 5, x = 1.2, y = 2.4, z = -3.6, u = 51274, n = 128765. c1 = ?a?, c2 = ?b?,想得到以下输出格式和结果,请写出完整的程序。要求输出结果如下:(*表示空格)

a = 3***b=4***c=5

x = 1.20000, y = 2.400000, z = -3.600000 x+y = *3.60**y+z = -1.20**z+x = -2.40 u = 51274***n = ***128765 c1 = ?a?*or*97(ASCII) c2 = ?b?*or*98(ASCII)

提示:根据题目中变量的值定义合适的变量类型。正确定义和使用printf函数中的格式控制字符串。 3. 计算定期存款本利之和

设银行定期存款的年利率rate为2.25%,并已知存款期为n年,存款本金为capital元,

试编程计算n年后本利之和deposit。要求定期存款的年利率rate、存款期间n和存款本金capital均由键盘输入。

4. 求一个四整数的各位数字之和,并在屏幕上输出结果。

5.编程实现:用1分、5分、10分、25分的硬币凑成任何给定的钱数x,要求硬币的数目最少。

7

【实验报告】

实习时间: 实习地点: 实习机号: 具 体 实 验 内 容 8

程 序 调 试 过 程 实 习 小 结 9

实验三 选择结构程序设计

【实验目的】

1.熟练掌握上机运行一个C程序的操作过程。

2.学会正确使用逻辑运算符和逻辑表达式,进一步掌握各种表达式的使用。 3.利用if语句实现选择结构程序设计。

4.利用switch语句实现多分支选择结构程序设计。 5.进一步练习调试与修改程序。

【上机实习指导】

1.输入并运行习题3.10。即:

# include “stdio.h” void main( ) { int i,j,n,m; i=8;j=10; m=++i;n=j++;

printf(“%d,%d,%d,%d”,i,j,m,n); }

分别作以下改变并运行:

①将程序第四行改为:m=i++;n=++j; ②程序改为:

# include “stdio.h” void main( ) { int i,j; i=8;j=10;

printf(“%d,%d”,i++,j++); }

③在②的基础上,将语句改为: printf(“%d,%d”,i++,j++); ④再将语句改为:

printf(“%d,%d,%d,%d”,i,j,i++,j++); ⑤程序改为:

# include “stdio.h” void main( )

{ int i,j,n=0,m=0; i=8;j=10;

m+=i++;n-=- -j;

printf(“%d,%d,%d,%d”,i,j,m,n); }

2.计算下列分段函数值:

10

具体要求如下:

①用if语句实现分支。自变量x与函数值均用单精度类型。

②自变量x用scanf函数输入,且输入前要有提示。结果的输出采用以下形式: x=具体值,f(x)=具体值

③分别输入x=-5.0,-3.0,1.0,2.0,2.5,3.0,5.0,运行该程序。 3.先静态分析以下程序的运行结果,然后上机验证。 # include “stdio.h” void main( )

{ int a=3,b=4,c=5,x,y,z; x=c>b>a;

y=!a+b

z=c/b+((float)a/b&&(float)(a/c)); printf(“\\n x=%d,y=%d,z=%d”,x,y,z); x=a||b--; y=a---3&&b;

printf(“\\n %d,%d,%d,%d,%d,%d”,a,b,c,x,y,z); }

上机运行的结果与你分析的结果是否一致?不一致的原因何在?

请在程序的最后一个花括号前加上语句:getchar();后重新运行程序,注意事项加上这一语句后,程序的运行进程有何不同?getchar()是一个函数调用,其作用是等待接收你从键盘输入的一个字符,在你未按键之前一直处于等待状态。在这里可以起到暂停的作用。当你看清结果并按任意键后,立即退出程序并切换回TC主屏幕。用这一方法可以减少屏幕切换操作。

4.下列C程序的功能是:计算并输出分段函数值。

其中x由键盘输入。

请通过调试修改程序中的错误(包括语法错误和逻辑错误)。 #include “stdio.h” main( )

{float x,y;

printf(“input x=”); scanf(\,&x);

if((-5.0<=x<0.0)&&(x!=-2.0))y=1.0/(x+2.0); else if(x<5.O)y=l.0/(x+5.0); else if(x

printf(\,x,y); }

具体要求如下:

11

①不允许改变计算的精度。

②不允许改变原来程序的结构,只能在语句或表达式内部进行修改。

③调试正确后,用x=-7.0,-2.0,-1.0,0.0,2.0,5.0,8.0,10.0,11.0运行这个程序。

④画出与调试正确后的程序对应的流程图。

【自编程序上机】

1. 数据整除判断

编程实现:输入一个整数,判断它能否被3,5,7整除,并输出以下信息之一:①能

同时被3,5,7整除;②能被其中两数(要指出哪两个)整除;③能被其中一个数(要指出哪一个)整除;④不能被3,5,7任一个整除。

提示:

⑴判断能否被某一个数整除应采用求余运算。

⑵在一个程序中利用选择结构把四种可能的信息全部表示出来。

2.用scanf函数输入一个百分制成绩(整型量),要求输出成绩等级A,B,C,D,E。其中90-100分为A,80-89分为B,70-79分为C,60-69分为D,60分以下为E。 具体要求如下:

①用if语句实现分支。

②在输入百分制成绩前要有提示。

③在输入百分制成绩后,要判断该成绩的合理性,对于不合理的成绩(即大于100分或小于0分)应输出出错信息。

④在输出结果中应包括百分制成绩与成绩等级,并要有文字说明。

⑤分别输入百分制成绩:-90,100,90,85,70,60,45,101,运行该程序。

3.将第2题中的(1)改为“用switch语句实现”,其余不变,重复实现第2题中的各功能。 4.编程找出5个整数中的最大数和最小数,并输出找到的最大数和最小数。

5.假设一种自动售货机可以为顾客提供3种价格档次的不同饮料。投入2元钱,可选择康师傅矿泉水、怡宝矿泉水和农夫山泉之一;投入3元钱,可选择可乐、雪碧和果汁之一;投入5元钱,可选择奶茶、咖啡和酸奶之一。

编写程序,模拟用户向自动售货机投入钱币选择一种饮料的过程。

提示:使用scanf()函数模拟投入钱币,使用getchar()函数模拟选择饮料(输入A、B、C代表选择的饮料)。

12

。【实验报告】

实习时间: 实习地点: 实习机号: 具 体 实 验 内 容 13

程 序 调 试 过 程 实 习 小 结 14

实验四 循环结构程序设计

【实验目的】

1.进一步练习选择结构的程序设计。

2.练习并掌握实现循环结构的三种方法。 3.练习并掌握选择结构与循环结构的嵌套。 4.掌握多重循环的应用。 5.学会单步跟踪的操作方法。

【上机实习指导】

1.根据字母判断是星期几

平时我们看到M时就想到星期一,看到W时就想到星期三,请用C语言程序编写当输入星期几的第一个字母就判断出是星期几,如果第一个字母一样,则用第二个字母来判断。要求输入为字母‘Y’时,结束判断。

提示:可利用C语言的switch语句实现多路分支:根据输入的的第一个字母、第二个字母,判断是星期几,如果第一个字母一样,如星期二和星期四(Tuesday和Thursday),则用if语句判断第二个字母,这样就可以解决问题了。另外为了实现可以多次进行判断,此题还需用循环进行控制。

要求:当输入字母“Y”时,则结束程序。当输入的不是星期几的第一个字母时,则可给出出错信息:printf(“DATA ERROR!”);当输入两个星期几相同的字母时,则可给出提示信息:printf(“PLEASE INPUT SECOND LETTER\\n”)。

【自编程序上机】

1.如果一个数恰好等于它的所有因子(包括1但不包括自身)之和, 例如:6的因子为1,2,3,且1+2+3=6,因此6是一个“完数”。 计算并输出1000以内的所有“完数”之和。 具体要求如下:

①所有循环均用for循环。

②输出要有文字说明,并同时输出各“完数”。输出形式为:

完数1+完数2+?=和值

2.打印如下图所示的数字金字塔(注意观察数字分布的规律)。

3.百钱买百鸡问题。已知公鸡每只5元,母鸡每只3元,小鸡1元3只,要求100元钱正好买100只鸡,则应买公鸡、母鸡的小鸡各多少只?

4.某班有学生n人,从终端读入n及n个人学生的成绩,试编程实现以下功能: ①打印出前3个最好成绩及取得每个最好成绩的人数; ②若90分以上计为优,75-89分计为“良”,60-74分计为“中”,60分以下计为“不及格”,试统

15

实验七 模块化程序设计(1)

【实验目的】

1.掌握C语言中定义函数的方法及其调用方法。

2.掌握函数实参与形参的对应关系以及“值传递”与“地址传递”的方式,熟练掌握模块间数据传递的方式。

3.掌握全局变量和局部变量、动态变量与静态变量的概念和使用方法,深刻体会全局变量和局部变量、动态变量与静态变量的概念和使用方法,

【上机实习指导】

1.先静态阅读以下程序,然后上机运行程序,查看运行结果是否与你阅读的结果一致?不一致的原因何在?

# include “stdio.h” int a=3,b=5,c=2; int f(int a,int b) { a++;b--;c=a+b;

return(a+b+c); }

void main( ) { int a=4,k; k=f(a+2,b+1);

printf(“\\n %d,%d,%d,%d”,a,b,c,k); getchar(); }

2.静态分析以下程序的执行结果,然后上机运行程序,将分析结果与运行结果加以对比,从中领会静态局部变量的含义及用法。

# include “stdio.h” int f(int x)

{ static int f=0,y=0; if(f==0) y+=2*x;

else if(f==1)y+=3*x; else y+=4*x; f++;

return y; }

void main( )

{ printf(“\\n %d”,f(2)); printf(“\\n %d”,f(2)); printf(“\\n %d”,f(2)); getchar(); }

【自编程序上机】

26

1.求两整数的最公约数和最小公倍数。用一函数求最大公约数,用另一函数调用此函数求出最大公约数,并用求出的最大公约数求最小公倍数。

具体要求如下:

①用全局变量。将最大公约数与最小公倍数设为全局变量,在主函数中输出它们的值。 ②不用全局变量。最大公约数和最小公倍数由被调模块返回值。 2.计算并输出

具体要求如下:

①编制一个函数pq(n),返回n!值。

②编制主函数,由键盘输入m与n(m≥n≥O),调用(1)中的函数计算下列算式值。

③在主函数中,输入m与n之前要有提示,并检查输入数据的合理性,对于不合理的输入,应输出出错信息,不再进行计算。在函数pq(n)中也要检查n的合理性,当n<O时输出出错信息,不再进行计算。 ④分别输入(m,n)=(3,-1),(0,0),(8,3),(3,8),(8,8)运行该程序。

⑤画出模块pq()的流程图。

3.编写程序,要求找出满足下列条件的3位数:它是完全平方数,又有两位数字相同。如:144、676。 要求:设计一函数判断一个三位数是否为完全平方数,设计另一函数判断一个三位数中是否有两位数字相同,再在主函数中调用这两个函数,找出所有的满足这两个条件的三位数。

27

【实验报告】

实习时间: 实习地点: 实习机号: 具 体 实 验 内 容 28

程 序 调 试 过 程 实 习 小 结 29

实验八 模块化程序设计(2)

【实验目的】

1.进一步熟悉函数之间的数据传递方式,熟练掌握函数的嵌套调用与递归调用的方法。 2.掌握通过数组进行数据传递的方法。

【上机实习指导】

1.对以下程序进行单步运行,并从中了解数组作为函数的参数是如何进行数据传递? # include \

void change(int a[],int n) { int i,j,t;

for(i=0,j=n-1;i

t=a[i]; a[i]=a[j]; a[j]=t; } }

void main( ) { int i,b[10];

for(i=0;i<10;i++) scanf(\

printf(\ for(i=0;i<10;i++) printf(\ printf(\ change(b,10);

printf(\ for(i=0;i<10;i++) printf(\ printf(\ getchar(); getchar(); }

【自编程序上机】

1.编写函数,将n个整数的数列进行重新排放,重新排放后的结果为:前段都是奇数,后段都是偶数,并编写主函数完成:①输入10个整数;②调用此函数进行重排;③输出重排后的结果。

2.输入10个学生4门课的成绩,分别用函数求: ①每个学生的平均成绩; ②每门课的及格率;

③最高分所对应的学生和课程。

30

【实验报告】

实习时间: 实习地点: 实习机号: 具 体 实 验 内 容 31

程 序 调 试 过 程 实 习 小 结 32

实验九 指针程序设计

【实验目的】

1.掌握变量的指针及其基本用法。 2.掌握一维数组的指针及其基本用法。

3.掌握指针变量作为函数的参数时,参数的传递过程及其用法。

【上机实习指导】

1.对以下程序进行单步运行,并从中了解变量的指针和指针变量的概念。 # include “stdio.h” void main()

{ int a=5,b=5,*p; p=&a;

*p=8; p=&b; b=10; }

按以下步骤操作:

①输入程序后,连续按三次F8,使绿条停留在P=&a诵句行上。

②用Ctrl一F7操作分别将a,b,&a,&b,p及*p显示出来。

③查看观察窗口中的内容,可发现此时a、b己有确定的地址(&a和&b)和确定的值,而p还没荷确定的值(此时语句p=&a还未执行),即p还没有明确的指向,因而它所指向的内存单元(*p)中的内容也是不确定的。

④按F8往下执行一步后再查看观察窗中的内容,可发现p已有确定的值,它与&a的值一致,说明p中存放了变量a的地址,也就是说p是指向变量a的指针变量。同时可发现,*p的内容与a的内容一致,

即p所指向的内存单元中的内容就是a的内容;从而可以理解*p等效于a,表示同一内存单元。

⑤按F8往下执行一步后再查看观察窗中的内容,可发现*p和a的内容都已发生变化,从而可理解通过改变指针变量p所指向的内存单元中的内容可以间接地改变a中的内容。

⑥再按F8往下执行一步,可发现p的值己发生变化,它与&b的值一致,说明p已经是指向变量b的指针变量,它不再是指向a,*p的内容也已变为b的内容,从而可理解指针变量的指向是随时可以改变的。

⑦再按F8往下执行一步,可发现,b的值和*p的值都已发生变化,即改变b的内容就等于改变指针变量p所指向的内存单元中的内容。

2.单步运行以下程序,观察&a[0],&a[i])和P的变化,然后回答以下问题: ①程序的功能是什么?

②在开始进入循环体之前,p指向谁?

③循环每增加一次,p的值(地址)增加多少?它指向谁? ④退出循环后,p指向谁?

⑤你是否初步掌握了通过指针变搔引用数组元素的方法? # include “stdio.h” void main()

{ int i,*p,s=0,a[5]={5,6,7,8,9}; p=a;

for(i=0;i<5;i++,p++)

33

s+=*p;

printf(“\\n s=%d”,s); }

3.先分析以下程序的运行结果,然后上机验证,并通过此例掌握通过指针变量引用数组元素的各种方法。

# include “stdio.h”

void main( )

{ int i,s1=0, s2=0, s3=0, s4=0,*p,a[5]={1,2,3,4,5}; p=a;

for(i=0;i<5;i++) s1+=p[i]; for(i=0;i<5;i++) s2+=*(p+i); for(p=a;p

p=a;

for(i=0;i<5;i++) s4+=*p++;

printf(“\\n s1=%d, s2=%d, s3=%d, s4=%d”s1,s2,s3,s4); }

【自编程序上机】

1.编写函数实现计算一元二次方程的两个实根,然后编写主函数调用此函数。

要求:在同一个函数内求出方程的两个实根,此函数不准使用全局变量进行数据传递,也不能使用return语句,只能通过指针进行数据传递。

2.编写函数,将n个数按原来的顺序的逆序排列(要求用指针实现),然后编写主函数完成:①输入10个数;②调用此函数进行重排;③输出重排后的结果。

3.编写程序,从键盘输入3个整数,通过函数调用的方式,将输入的3个整数求出被10除后的余数之和以及余数的乘积,并通过形参传送回主调函数,进行输出。

34

【实验报告】

实习时间: 实习地点: 实习机号: 具 体 实 验 内 容 35

程 序 调 试 过 程 实 习 小 结 36

实验十 结构体程序设计

【实验目的】

1.掌握结构体类型变量与结构体数组的定义和使用。 2.学会使用结构体指针变量和结构体指针数组。

3.掌握链表的概念,初步学会对链表进行操作。

【上机实习指导】

1.输入出10个学生的学号、姓名和成绩,求出其中的高分者和低分者。 # include “stdio.h” struct student { int num;

char name[20]; int score; };

void main( ) { int i;

struct student st,stmax,stmin; stmax.score=0; stmin.score=100; printf(“\\n input data”); for(i=0;i<10;i++)

{ scanf(“%d%s%d”,&st.num,st.name,&st.score);

if(st.score>stmax.score) stmax=st; if(st.score

printf(“\\n hight:]s]”,stmax.num,stmax.name,stmax.score); printf(“\\n low:]s]”,stmin.num,stmin.name,stmin.score); }

①分析程序,上机运行程序。

②程序中,哪些是对结构体变量的成员引用,哪些是整体引用? ③对于此例来说,用结构体变量作为数据结构有何优越性?

【自编程序上机】

1.有一学生情况如下表所示。编制一个C程序,用冒泡法对该学生情况表按成绩(grade)从低到高进行排序。

37

具体要求如下: ①结构体类型为 struct 结构体名 { int num;

char name[8]; char sex; int age;

int grade; }

②在程序中,首先输出排序前的学生情况,然后输出排序后的结果,其格式如上表所示(表的框线不要)。

2.定义一个学生成绩结构体类型,包含“学号”、“姓名”、“性别”、“年龄”、“英语”、“数学”、“物理”、“总分”、“名次”等信息。编写5个函数分别实现:

使用结构体数组,输入10名学生的上述信息; 计算每一个学生的总分、平均分; 计算每一门课程的平均分; 查找成绩有不及格的学生信息; 输出全班学生的学号、总分及名次。 3.链表基本操作。 具体要求如下:

①初始时链表为空,即链表的头指针为空。

②对于上表所示的学生情况表,依次将每个学生的情况作为一个结点插入到单链表的链头(即当前插入的结点将成为链表的第一个结点)。

③所有学生情况都插入到链表中后,从链头开始,依次输出链表中的各结点值(即每个学生的情况)。输出格式如同上表。

38

【实验报告】

实习时间: 实习地点: 实习机号: 具 体 实 验 内 容 39

程 序 调 试 过 程 实 习 小 结 40

本文来源:https://www.bwwdw.com/article/1kw6.html

Top