您的当前位置:首页正文

C程序设计实验指导书_2014版

来源:类询娱乐


C语言程序设计实验指导及报告书

班级:____________________ 学号:____________________ 姓名:____________________

徐州师范大学计算机科学与技术学院

目 录

实验一 C程序的运行环境........................................................................1 实验二 简单C程序的设计..........................................................................10 实验三 选择结构设计................................................................................................15 实验四 循环结构设计................................................................................................21 实验五 数组.........................................................................................................29 实验六 函数............................................................................................................36 实验七 指针................................................................................................................43实验八 结构体和文件................................................................................................49

实验一 C程序的运行环境

实验一 C程序的运行环境(2学时)

目的要求

(1)熟悉Visual C++6.0集成环境,熟练掌握在Visual C++6.0集成环境中进行编辑、编译、连和运行一个C单文件程序的步骤及方法。

(2)通过运行简单的C程序,理解C源程序的特点。

上机内容

一般示例

【例1】C程序的运行环境 1. 进入C++工作环境

建立个人子目录:

第一次上机时先在D上建立一个JSJ子目录,在JSJ子目录下,再建立以自己学号后三位为目录名的子目录,如学号为09261001的同学,可以用001为子目录名。然后按以下步骤进行操作;

启动Visual C++ 6.0:

双击Windows桌面上的Visual C++ 6.0图标或单击Windows桌面上“开始”按钮,在“程序”中选择“Visual C++ 6.0”运行即可。 2. 编译、运行C++ 源程序

创建一个新的工程文件(Project file)

启动Visual C++6.0 编译系统后,出现“Microsoft Developer Studio”窗口,该窗口菜单条有9个菜单项(如图1所示):

图1 Visual C++6.0 窗口 (1)单击“File”菜单,在其下拉菜单中选择“New”,屏幕上出现一个“New”对话框,在该对话框中选择“Projects”标签,出现“Project”对话框。

1

实验一 C程序的运行环境

(2)选择工程类型为“Win32 Console Application”,这时,在右边的Platforms选框中就会出现Win 32。

(3)输入工程名字。在“Project name”选框中输入所指定的工程文件名字,例如: shy1_1 (4)输入路径名。在“Location”选框中,输入你将要把所建立的工程文件放人何处的路径名。例如,要将工程文件放在D盘下已建立好的子目录D\\JSJ\\001子目录中,所以该选取路径为:D:\\JSJ\\001\\shy1_1。(如图2所示)

图2 建立新的工程文件 (5) 选择“OK”按钮,出现图3。

图3

(6)选择“Finish‖按钮,出现图4。

2

实验一 C程序的运行环境

图4

(7)选择OK按钮,则新的工程文件的建立已经完成,出现图5.

图5

建立源文件

(1)再次选择“File”菜单中的“New”选项,在四个标签中选择“File”标签,在其对话框选项中,选择“C++ Source File”,并在右边的Add project的选择框内打勾,激活其下面的选项,然后在File框内输入源文件名(如ex1)。如图6所示。

3

实验一 C程序的运行环境

图6

(2)单击“OK”按钮,出现编辑屏幕,即可编写程序(如图7)。

图7 (3)输入准备好的源程序。(如图8)

4

实验一 C程序的运行环境

图8

编译连接和运行源程序

程序编好后要进行编译连接和运行,步骤如下:

(1)编译程序。选择“Build”菜单,单击下拉菜单中的“Compile ex1.cpp”,这时系统开始对当前的源程序进行编译,在编译过程中,将所发现的错误显示在屏幕下方的“Build”窗口中。根据错误提示,修改程序后再重新编译,如还有错误,再继续修改、编译,直到没有错误为止。

(2)编译无误后进行连接。这时选择“Build”菜单中的“Build ex1.exe”选项。同样,对出现的错误要进行更改,直到编译连接无错为止。这时,在“Build”窗口中会显示如下信息:ex1.obj- 0 error(s), 0 warning(s),说明编译连接成功,并生成以源文件名为名字的可执行文件(ex1.exe)。

(3)运行程序。选择“Build”菜单中的“! Execute 1st.exe”选项。这时,会出现一个“MS-DOS”窗口,输出结果显示在该窗口中(如图9所示)。

图9

(4)观察分析运行结果。按键盘上的任意键,则可返回到图8所示的窗口。

5

实验一 C程序的运行环境

(5)运行结束后,可以回到“File”菜单,点击“Close Workspace‖选项,关闭当前文件窗口。若要编辑新的源程序,可以再次打开“File”菜单,重新建立工程文件,步骤如上所述;也可以点击“File”菜单中的“Open Workspace‖选项,打开一个已经存在的源文件。

【例2】输入并运行程序,分析程序的功能。 #include void main() {

printf(\"Hello,World!\\n\");

printf(\"Wolcome to the C language world!\\n\"); printf(\"Everyone has been waiting for.\\n\"); }

程序功能为:

【思考】 你能不能编写一个程序,输出一个生日祝贺卡?你的程序可以输出如下内容: To My Friend,

Happy Birthday to You!

Yours Sincerely

【例3】输入并运行程序,写出运行结果。 #include void main() {

int a,b,sum; a = 123;b = 456; sum = a+b;

printf(―sum is %d\\n‖,sum); }

程序功能为:

【思考】 能不能编写程序,从键盘上输入加数和被加数,从而实现任意两个整数的求和并输出?我们可以把它称作加法器程序,进一步,能不能实现减法器、乘法器和除法器呢?你想不想实现一个四则运算器呢? 继续努力吧!这些你将来都会实现! 【例4】输入并运行程序,写出运行结果。

#include void main() {

int a,b,c;

int max(int x,int y) ;

scanf(―%d%d‖,&a,&b);

6

实验一 C程序的运行环境

c = max(a,b);

printf(―max=%d‖,c); }

int max(int x,int y) {

int z;

if (x>y) z = x; else z = y; return(z); }

程序功能为:

【思考】 在此程序的基础上,怎么实现三个数的比较,输出较大的那个数呢?如果求4个数中的最大者,该怎么编写?如果求最小的那个数,又该如何呢?

编程作业

1.以下是一句英文绕口令:

she sells sea shells by the seashore

请分别按下述三种方式将这句话输出到屏幕上。 (a) 写在一行, (b) 写在7行

/ * C语言源代码 */ void main() { } 2.本题将帮助你熟悉一些由Visual C++6.0产生的错误信息。VC6.0环境给出的一些错误信息一些可能对你有用,而另一些可能无用。请你首先核对下述程序编译后没有错误信息: #include int main( )

{ int a = 1, b = 2, c =3 ; printf(―Some output: %d %d %d\\n‖, a ,b, c, c);

7

实验一 C程序的运行环境

return 0; }

现在,依次引入下述的程序错误,请你编译程序,并记录产生的错误信息: a) 把 a = 1后面的逗号改为分号。 b) 把printf改为print。 c) 去掉控制串中的第二个引号。 d) 用a, b, c替换a, b, c, c e) 去掉printf()语句后面的分号。 f) 去掉用于结束的花括号。

3. 下面是一个由用户输入三个整数开始的程序片段:

/ * C语言源代码 */ #include void main( ) { int a,b,c,sum; printf(―Input three integers: ―); }

请你完成这个程序。在执行你的程序时,如果你分别给a,b,c输入的值为2,3,7,那么屏幕上应出现如下内容: Input three integers: 2 3 7

Twice the sum of you integers plus 7 is 31 --- bye!

8

实验一 C程序的运行环境

选做题

1.参考教材例1.2,编程实现求三个整数的平均值。 2.参考教材例1.3,编程实现求三个整数中的最大值。

好的编程习惯

正确使用缩进。首先,一定要有缩进,否则代码的层次不明显。需要缩进时一律按Tab键,或一律按空格键,不要有时用Tab键缩进,有时用空格键缩进。缩进最好为4个空格,变量和运算符之间最好加一个空格。

知识点描述及编程体会

实验成绩

9

签名 年 月 日

实验二 简单C程序设计

实验二 简单C程序设计(2学时)

目的要求

(1)了解C语言中数据类型的意义,掌握不同数据类型之间的赋值的规律。 (2)掌握有关C语言的有关运算符,以及包含这些运算符的表达式。 (3)理解C语言程序的顺序结构。

(4)掌握常用的C语言语句,熟练应用赋值、输入、输出语句。 (5)进一步熟悉Visual C++6.0集成环境。

上机内容

一般示例

【例1】下面的程序试图计算由键盘输入的任意两个整数的平均值:

#include void main( ) {

int x, y, a;

scanf(―%x,%y, &x, &y); a = (x+y)/2;

printf(―The average is :‖,a); }

请首先调试该程序保证没有语法错误,然后分别使用下面的测试用例对上述程序进行测试:

(1) 2, 6 (2) 1, 3 (3) -2, -6 (4) -1, -3 (5) -2, 6 (6) -1, 3 (7) 1, 0 (8) 1, 6 (9) 2147483650, 2147483620 (10) -2147483650, 2147483620

(1) 请分析哪几组测试用例较好?通过测试,你发现程序有什么错误了吗?若有错误,请指出错误原因。

10

实验二 简单C程序设计

(2) 操作符sizeof用以测试一个数据或数据类型所占用的存储空间的字节数。请编写一个程序,测试在你的系统中,各种基本数据类型所占用的存储空间大小。例如,在VC6.0中,你测试int数据类型,程序会输出: int: 4 bytes

/ * 用sizeof测试一个数据类型占用的存储空间 */ void main() { }

【例2】本例要说明在一个运算符前后的空格是很重要的。研究下面的代码,并写出你模拟运行的结果。再编写一个程序,检查你的答案。 int a, b = 0, c = 0; a = ++b + ++c;

printf(―%d %d %d\\n‖, a ,b, c); a = b++ + c++; printf(―%d %d %d\\n‖, a, b, c); a = ++b + c++; printf(―%d %d %d\\n‖, a, b, c); a = b-- + --c; printf(―%d %d %d \\n‖, a, b, c); 模拟运行结果为:

增量运算符++ 和减量运算符--的用法特点:

11

实验二 简单C程序设计

【例3】除了printf( )外,下面的程序是完整的。它用整数除和取模运算符把秒转换成分和秒。

/ * */ /* Convert seconds to minutes and seconds.*/ #include void main( ) { int input_value,minutes,seconds; printf(―Input the number of seconds: ―); scanf(―%d‖,&input_value); minutes = input_value / 60; seconds = input_value % 60; printf( ); }

请你编写一个适当的printf( )语句完成这个程序。例如,如果在提示后输入123,程序应该输出: 123 seconds is equivalent to 2 minutes and 3 seconds.

【思考】你能修改你的程序,从而实现把秒转换成小时、分和秒吗?例如,如果在提示后输入7382,你的程序应该输出: 7382 seconds is equivalent to 2 hours,3 minutes and 4 seconds.

【例4】当输入流为“56789 0123 45a72”时,执行下面的程序段 int i, j; float x, y; char c; scanf(―%2d%f%*d%f%c%d‖,&i.&x,&y,&c,&j);

之后,变量i, j, x, y,中的内容各是什么?先写出你的分析结果,再编程验证你的答案。 分析结果为:

编程作业

1. 请你编写一个交互式程序。通过键盘输入圆的半径和圆柱的高度,程序则计算出圆周长、圆面积、圆球表面积、圆球体积和圆柱体积,并在屏幕上整齐地输出所有结果。自己设定输出数据的小数点位数。

【思考】你编程时,考虑到如何检测输入数据的合理性了吗?那么该如何实现呢?你可以去教材第5章寻找解决方法!如果你这样做了,那么,祝贺你,你是一个爱思考和喜欢主动学习的学生,你具有了成为一名优秀程序员的素质!

12

实验二 简单C程序设计

程序流程图 void main() { } 2. Jujius Caesar生活在充满危险和阴谋的年代,为了生存,他首次发明了密码,用于军队消息的传递。假设你是Caesar军团中的一名军官,需要把Caesar发送的消息破译出来,并提供给你的将军。消息加密的方法是:对消息原文中的每个字母,分别用该字母之后的第5个字母替换(例如,消息原文中的每个字母A都分别替换成字母F),其它字符不变,并且消息原文中的所有字母都是大写的。请你编程实现。( 完成这道题目,你就可以和你的朋友用密码通信联系了!当然了,你还可以设计自己的密码!)

要求:输入为一行加密消息,输出为Caesar的原始消息。

程序流程图 void main() { } 13 实验二 简单C程序设计

选做题

1.已知一个整数的值,求它的平方和平方根,输出时要求有文字提示,并取小数点后两位。

2.编程序,用getchar 函数读入两个字符给c1、c2,然后分别用putchar函数和printf函数输出这两个字符。上机运行程序,比较用printf和putchar 函数输出字符的特点。

好的编程习惯

1. 注释对程序的可阅读性是十分重要的。适当使用注释可让他人明白程序做什么以及程序如何工作。个人和组织应该采取并遵循一致的注释风格。风格是一种习惯。良好的习惯有助于编程。

一种文件开头的注释模板如下:

/*************************************************************** **文件名:

**Copyright © 2007-2008 *****学院*****班级 **创建人: **日期: **文件描述: **版本:

**************************************************************/

2. 应该尽量使用标准库函数。

知识点描述及编程体会

实验成绩 签名

年 月 日

14

实验三 选择结构程序设计

实验三 选择结构程序设计(2学时)

目的要求

(1)掌握C语言的条件选择结构的编程(if、switch语句)。

(2)了解C语言表示逻辑量的方法(0代表逻辑\"假\",1代表逻辑\"真\")。 (3)学会正确的使用逻辑运算符和逻辑表达式。

(4)通过简单程序的编写进一步熟悉、巩固所学的理论知识。

上机内容

一般示例

【例1】下面的程序读入任意两个整数x、y,然后将两个数中的大数保存在x中,小数保存在y中。你能将程序中的空行补充完整吗?

# include void main( ) { int x,y,t; printf(\"input x,y:\"); scanf (\"%d,%d\" , ) ; if (x; ; ; } printf (\"result:%d\%d\\n\}

【小提示】本题中要用到2个数的交换算法。这是一种常用算法,希望你能够理解、记住并加以灵活运用。

【例2】 已知三个数a,b,c,找出最大值放于max中。

分析:由已知可得在变量定义时定义四个变量a,b,c和max,a,b,c是任意输入的三个数,max是用来存放结果最大值的。第一次比较a和b,把大数存入max中,因a,b都可能是大值,所以用if语句中if-else 形式。第二次比较max和c,把最大数存入max中,用if语句的第一种形式if形式。max即为a,b,c中的最大值。

#include \"stdio.h\" void main() { int a,b,c,max; /*define four integer varibles*/ scanf(―a=%d,b=%d,c=%d‖,&a,&b,&c); if (a >= b) max = a; /*a>=b*/

15

实验三 选择结构程序设计

else max = b; /*a max) max = c; /*c is the max*/ printf(\"max=%d\}

若分别输入下列数据,分析程序的执行顺序并写出运行结果 (1)a=1,b=2,c=3 (2)a=2,b=1,c=3 (3)a=3,b=2,c=1 (4)a=3,b=1,c=2 (5)a=3,b=3,c=2 (6)a=2,b=1,c=2

【例3】输入某学生的成绩,经处理后给出学生的等级,等级分类如下: 90分以上(包括90): A 80至90分(包括80):B 70至80分(包括70):C 60至70分(包括60):D 60分以下: E 【方法一】用if嵌套

分析:由题意知如果某学生成绩在90分以上,等级为A;否则,如果成绩大于80分,等级为B;否则,如果成绩大于70分,等级为C;否则,如果成绩大于60分为D;否则,如果成绩小于60分,等级为E;但当我们输入成绩时也可能输错,出现小于0或大于100,这时也要做处理,输出出错信息。因此,再用if嵌套前,应先判断输入的成绩是否在0~100之间。

#include\"stdio.h\" void main() {

int score; char grade;

16

实验三 选择结构程序设计

printf(\"\\nplease input a student score:\"); scanf(\"%d\ if (score>100 || score<0) printf(\"\\ninput error!\"); 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(\"\\nthe student grade:%c\ } }

输入测试数据,调试程序。测试数据要覆盖所有路径,注意临界值,例如此题中得100分,60分,0分以及小于0和大于100的数据。 【方法二】用switch语句

分析:switch 语句是用于处理多分支的语句。注意,case后的表达式必须是一个常量表达式,所以在以用switch语句之前,必须把0~100之间的成绩分别化成相关的常量。所有A(除100以外),B,C,D类的成绩的共同特点是十位数相同,此外都是E类。则由此可得把score除十取整,化为相应的常数。

#include\"stdio.h\" void main() {

int g,s; char ch;

printf(\"\\ninput a student grade:\"); scanf(\"%d\s = g / 10;

if(s < 0 || s > 10)

printf(\"\\ninput error!\"); else { switch (s) {

17

实验三 选择结构程序设计

case 10:

case 9: ch = 'A'; break; case 8: ch = 'B'; break; case 7: ch = 'C'; break; case 6: ch = 'D'; break; default: ch = 'E'; }

printf(\"\\nthe student scort:%c\ }

}

输入测试数据,同【方法一】一样调试程序并写出结果。

【思考】通过本题,你能将if 语句和switch语句的用法好好总结一下吗?好好学习编程,将来,老师希望能用你编的程序来判定咱们班同学的成绩! 你的测试数据是: 编程作业

1.本题是要练习短路求值。

int a = 0,b = 0,x;

x = 0 && (a = b = 777); printf(―%d %d %d\\n‖,a,b,x); x = 777 || (a = ++ b);

printf(―%d %d %d\\n‖,a,b,x);

这段程序将输出什么?首先手工模拟运行,得到结果,然后编写一个测试程序,进行检验。 手工模拟运行结果是: 【思考】教材中有很多相关知识点的小程序段,你会编程进行测试、运行吗?通过自己编程来测试这些小程序段,你会理解的更深刻,掌握的更牢固!

2.鸡兔同笼

一个笼子里关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外)。已经知道了笼子里面脚的总数nFeets(nFeets<32768),问笼子里面至少有多少只动物,至多有多少只动物?

【小提示】这是一个简单的计算问题。解决简单计算问题的基本过程包括将一个用自然语言描述的实际问题抽象成一个实际问题,继而编程实现计算过程,并将计算结果还原成对原来问题的解答。因此,首先要读懂问题,搞清输入和输出数据的含义,并通过输入输出的

18

实验三 选择结构程序设计

实际数据来验证自己的理解是否正确。

程序流程图 void main() { }

3.编写程序,根据输入的x,求下面的分段函数的值。

xy2x13x11

(x1)(1x10)(x10)

程序流程图 void main() { } 19

实验三 选择结构程序设计

选做题

1.自守数(同构数)是其平方后尾数等于该数自身的自然数。例如:

25*25=625 76*76=5776

任意输入一个自然数,判断是否自守数并输出:如: 25 yes 25*25=625

【思考】你考虑过如何求出一个给定的自然数N(如N=100)以内的所有的同构数吗?该怎样实现呢?学习了下一章循环之后,你就可以编出功能更加强大的程序了!不过,你得先把前面的基础打好!

2.某托儿所收2岁到6岁的孩子,2岁、3岁孩子进小班(Lower class);4岁孩子进中班(Middle class);5岁、6岁孩子进大班(Higher class)。编写程序(用switch语句),输入孩子年龄,输出年龄及进入的班号。如:输入:3,输出:age:3,enter Lower class。

3.给一个不多于5位的正整数,要求:①求出它是几位数;②分别打印出每一位数字;③按逆序打印出各位数字,例如原数为321,应输出123。(习题5.7)

好的编程习惯

1.稍复杂的表达式中要积极使用括号,以免优先级理解上的混乱以及二义性。

n = k++ + j; /*not good*/ n = (k++) + j; /*good*/

2.不很容易理解的表达式应分几行写。如:

n = (k++) + j; 应该写成: n = k + j; k++;

3.嵌套的if – else 语句要多使用{ }。

知识点描述及编程体会

实验成绩 签名

年 月 日

20

实验四 循环结构程序设计

实验四 循环结构程序设计(4学时)

目的要求

(1)掌握C语言for、while、do…while循环编程。

(2)掌握在程序设计过程中用循环的方法实现各种算法(如穷举、迭代、递推等)。 (3)巩固所学理论知识的同时锻炼C语言编程能力。

上机内容

一般示例

【例1】e是自然对数的底数,是一个无限不循环小数2.71828……。e在科学技术中用的非常多。学习了高等数学之后,就会知道,许多结果和它有紧密联系,以e为底,许多式子都是最简的,用它是最“自然”的,所以叫自然对数。下面是一个计算e的近似值(使误差小于给定的δ)的程序。

#include void main() { double e=1.0,x=1.0,y,delta; int i = 1; printf(\"\\n please input enter an delta: \"); scanf(\"%lf\ y = 1 / x; while(y >= delta) { x = x * i; y = 1 / x; e = e + y; ++ i; } printf(\"%12.10lf\\n\}

(1)阅读上面的程序,写出程序所依据的计算公式。

(2)为了能知道程序循环了多少次,应该在程序中增加一条什么样的语句?

21

实验四 循环结构程序设计

(3)原程序中while语句中的y >= delta,分别换成y > delta,y = delta, y < delta,y <= delta,观察程序运行将会有什么变化。

(4)把原程序中while语句之前的y=1/x语句去掉,观察程序的运行将会发生什么样的变化。

(5)把原程序中的while结构改写成do—while结构,再分别按上述的(2)、(3)两步进行实验。

(6)把原程序改为用for循环来实现。

/*compute e by for statement*/

22

实验四 循环结构程序设计

【例2】求5!你能不能对程序进行修改,使之能求n!? n从键盘输入。 /*compute 5!*/ #include void main() { int n,t; n = 1; t = 1; while(t <= 5) { n = n * t; t = t + 1; } printf(―%d\\n‖,n); } /* compute n!*/ 【例3】求和s=1!+2!+3! 你能不能对程序进行修改,使之能求1!+2!+3!+……+n!? n从键盘输入。

/*compute s=1!+2!+3!*/ #include void main() { int n,s = 0,t = 1; for(n = 1;n <= 3;n ++) { t = t * n; s = s + t; } printf(―%d‖,s); } /* compute s=1!+2!+3!+…+n!*/ 23

实验四 循环结构程序设计

【例4】求和s=1!+3!+5!。 你能不能对程序进行修改,使之能求1!+3!+5!+…+(2*n-1)!? n从键盘输入。

/*compute s=1!+3!+5!*/ #include void main() { int s = 0,t,i,j; for(i = 1;i <= 3;i ++) { t = 1; for(j = 1;j <= 2 * i-1;j ++) t = t * j; s = s + t; } printf(―%d‖,s); } /* compute s=1!+3!+5!+…+(2*n-1)!*/

【例5】求和s= 3+33+333. 你能不能对程序进行修改,使之实现教材中P129习题6.3要求的功能。要求n,a从键盘输入。 /*compute s= 3+33+333*/ #include void main() { int s=0,t=3,i; for(i=1;i<=3;i++) { s=s+t; t=10*t+3; } printf(―%d‖,s); } /* compute s=a+aa+aaa+…… */ 24

实验四 循环结构程序设计

【例6】有一数列:2/1,3/2,5/3,8/5,…求出这个数列的前10项之和。运行并分析程序,然后画出程序流程图。

#include void 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); } 程序流程图

【例7】水仙花数是指一个n(>=3)位数字的数,它等于每个数字的n次幂之和。在1000以内的水仙花数共有4个,分别为:153、370、371、407。运行并分析程序,然后画出程序流程图。

#include void main() { int i,j,k,n; for(n = 100;n <= 1000;n ++) { i = n/100; j = n/10-i*10; k = n%10; if(n== i*i*i+j*j*j+k*k*k) printf(― %d ‖,n); } } 程序流程图 25

实验四 循环结构程序设计

【例8】 如果一个自然数等于除它自身以外的各个正因子之和,则这个数叫做完全数。从1644年至1957年9月,经过许多著名数学家的辛勤劳动,共找到了十八个完数,第十八个完数约2000位。运行并分析程序,然后画出程序流程图。 6 its factors are 1,2,3

#include void main() { int n,s,j; for(n = 1;n <= 1000;n ++) { s = 0; for(j = 1;j < n;j ++) if (n % j == 0) s = s + j; if (s == n) { printf(―%d its factors are ‖,s); for (j = 1;j < n;j ++) if (n % j == 0) printf(―%d ―,j); printf(―\\n‖); } } }

程序流程图 编程作业

下面的作业均要求画出程序流程图和写出源程序代码,并在电脑上运行通过。 1.辗转相除法又名欧几里德算法(Euclidean algorithm),是求两个正整数m,n(m>n)的最大公约数的算法。描述如下:

为什么余数里面一定就包含了两个正整数的最大公约数? 首先,假设m和n的最大公约数为q,那么m=aq,n=bq(m>n)

m=n*k+r,则r=m-nk=q(n-bk),因为n-bk>0 ,所以余数里面一定就包含了两个正整数的最大公约数。 请你编程实现利用辗转相除法求两个正整数m,n(m>n)的最大公约数,并求出最小公倍数。希望你的程序能实现不论m和n为何值(包括负整数),都能有正确的输出结果。

nm%n0gcd(m,n)gcd(n,m%n)m%n!026

实验四 循环结构程序设计

2.请你编写一个交互式程序,请求用户从键盘上输入3个整数k,m,n(k>1)。程序要计算出在m和n之间的所有能被k整除的整数之和。

3.班上有学生n名,从键盘上输入每名学生的年龄(整数),求班上所有学生的平均年龄,并保留到小数点后两位数字。

27

实验四 循环结构程序设计

选做题

1.输入一行字符,分别统计出其中的英文字母、空格、数字和其它字符的个数。(习题6.2)

【思考】你能否修改程序使之能分别统计大小写字母、空格、数字和其它字符的个数? 2.猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,只剩一个桃子了。请编程求第一天共摘了多少桃子。(习题6.10)

【思考】如果题目改为猴子每天吃了前一天剩下的一半后,再吃两个,那么程序该如何修改?

3.设计报选体育科目统计程序

设某学校在新生入学时,需报选体育选修科目。体育科目包括:篮球、排球、体操、兵乓球和网球。请为某班级(30人)统计报选各体育科目人数。

好的编程习惯

1.循环、分支层次最好不要超过5层。 2.一目了然的语句不要加注释。

3.注释可以与语句在同一行,也可以在上一行。

知识点描述及编程体会

实验成绩 签名

年 月 日

28

实验五 数组

实验五 数组(4学时)

目的要求

(1)掌握一维数组和二维数组的定义、赋值和输入输出的方法; (2)掌握字符数组和字符串函数的使用;

(3)掌握与数组有关的算法(特别是排序算法)。

上机内容

一般示例

【例1】编写程序,测试下列数组的定义方式是否正确。如果不正确,请将改正后的内容写在右侧空白处。 (1)

#include void main() { int n; scanf(―%d‖,&n); int a[n]; „„ } (2)

#include #define M 10 void main() { int a[M]; „„ } (3)

#include void main() {

int a[2 + 2*4]; „„ } (4)

#include #define M 2 #define N 8 void main()

29

实验五 数组

{ int a[M + N]; „„ }

通过这一实验,可以说明什么问题?

【例2】运行下面的C程序,根据运行结果,可以说明什么? #include void main( ) { int num[5] = {1,2,3,4,5}; int i;

for(i = 0;i <= 5;i ++) printf(―%d‖,num[i]); }

【例3】青年歌手参加歌曲大奖赛,有10个评委对她的进行打分,下面的程序求这位选手的平均得分(去掉一个最高分和一个最低分)。分析并运行该程序,然后画出程序流程图。 分析:这道题的核心是排序。将评委所打的10个分数利用数组按增序(或降序)排列,计算数组中除第一个和最后一个分数以外的数的平均分,其中排序部分这里用选择法排序来实现。 选择法排序:首先找出值最小的数,然后把这个数与第一个数交换,这样值最小的数就放到了第一个位置;然后,在从剩下的数中找值最小的,把它和第二个数互换,使得第二小的数放在第二个位置上。以此类推,直到所有的值从小到大的顺序排列为止。

30

实验五 数组

#include void main() { int i,j,min; float temp,ave = 0.0; float a[11]; printf(\"\\n输入评委所打的分数:\\n\"); for(i = 1;i <= 10;i++) scanf(\"%f\ for(i = 1;i <= 9;i ++) { min = i; for(j = i+1;j <= 10;j ++) if(a[min] > a[j]) min = j; temp = a[i]; */ } a[i] = a[min]; 程序流程图 a[min] = temp; } for(i = 2;i <= 9;i ++) /*注意i值的变化范围 ave = ave + a[i]; printf(\"选手所得最后分数:%6.1f\printf(\"\\n\");

【思考】你会用我们所学的冒泡法排序来实现该题吗?试试看! 【例4】求矩阵下三角形元素之和。 #include #define N 5 void main() { int i,j,sum=0; int a[N][N]={0}; printf(\"input 5×5 data:\\n\"); for(i=0;i31

实验五 数组

{ for(j=0;j【思考】操作符&用以求一个变量的地址,这在函数scanf()中已经使用过了。现在,请你设计一个程序,用来返回一个m*n的二维数组各元素的地址,并由此说明二维数组中各元素是按什么顺序存诸的。

【例5】下面程序的功能是输入一串字符,计算其中空格的个数。运行并分析该程序,然后请你在此题的基础上实现教材P153习题7.10。 #include /*exercise 7.10*/ #include void main( ) { char c[30]; int i,spa=0; gets(c); for(i=0;c[i]!='\\0';i++) if(c[i]==' ') spa=spa+1;

printf(\"空格数为%d \\n\}

32 实验五 数组

编程作业

下面的作业均要求画出程序流程图和写出源程序代码,并在电脑上运行通过。

1. 编写一个程序,定义一个含有30个整数的数组,一次赋予从2开始的奇数,然后将按顺序每5个的平均值放在另一个数组中,并按每行3个输出结果。

2.有15个数存放在一个数组中,请先用一种排序方法(选择法或者冒泡法)进行排序(升序或者降序),然后输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。然后,将该数按照原来的排序规律插入到该数组中,并将新的数组输出。15个数用赋初值的方法在程序中给出。要找的数用scanf函数输入。

33

实验五 数组

3.下面是一段密文:

Asf Glmt Cfv Nvm Wlf Mvmt Xsvmt Dvr Yrzm Xsvmt Tzl Hslf! 请你将该段密文破解,并输出。

加密规律为:英文第1个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。

34

实验五 数组

选做题

1.找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点。(习题7.8) 应当至少准备两组测试数据: ①二维数组有鞍点

9 80 205 40 90 -60 96 1 210 -3 101 89 ②二维数组没有鞍点 9 80 205 40 90 -60 196 1 210 -3 101 89 45 54 156 7 用scanf函数从键盘输入数组各元素的值,检查结果是否正确。题目并未指定二维数组的行数和列数,程序应能处理任意行数和列数的数组。因此,从理论上来说,应当准备许多种不同行数和列数的数组数据,但这样的工作量太大,一般来说不需要这样做,只需准备典型的数据即可。 如果已指定了数组的行数和列数,可以在程序中对数组元素赋初值,而不必用scanf()函数。请同学们修改程序以实现之。 2.学生成绩排名

(1)定义一个数组a[11],用以存放学生的成绩; (2)从键盘输入10个学生成绩;

(3)采用冒泡法,将学生成绩按照从高到低进行排序;

(4)再输入一个学生的成绩,将此成绩按照排序规律插入原学生成绩数组;

(5)将排好序的成绩单进行反序存放,即原来是从高到低,现在改为从低到高排列; (6)将以上每一步骤的结果均打印输出,验证程序是否正确实现题目要求

知识点描述及编程体会

实验成绩 签名

年 月 日

35

实验六 函数

实验六 函数(4学时)

目的要求

(1)掌握定义函数的方法;

(2)掌握函数实参与形参的对应关系以及“值传递”的方式; (3)掌握函数的嵌套调用方法;

(4)掌握全局变量和局部变量动态变量、静态变量的概念和使用方法。 (5)学习对多文件程序的编译和运行。

上机内容

一般示例

【例1】上机调试下面的程序,记录系统给出的出错信息,并指出出错原因。

#include void main() {

int,y;

printf(―%d\\n‖,sum(x+y)); int sum(a,b) { int a,b; return(a+b); } }

【例2】写一个判断素数的函数,在主函数中输入一个整数,输出是否素数的信息。 源程序如下: #include /*此函数用于判别素数*/ #include int prime( ) int prime(int); { void main() { int number; printf(\"请输入一个正整数:\\n\"); scanf(\"%d\ if (prime(number)) printf(\"\\n%d是素数.\\n\ else printf(\"\\n%d不是素数.\\n\ } } 36

实验六 函数

【提示】判断素数的算法,我们在以前学习循环的时候已经学过了,在这里只是把这个算法用函数的形式表示出来。这里我们要注意函数的定义、声明的方法和格式。 【例3】写一函数,是给定的一个二维数组(N×N)转置,即行列互换。请你总结数组作为函数参数时的用法。 源程序如下: #include #define N 4

void convert(int arr[N][N]); void main() { int i,j; int array[N][N]; printf(\"输入数组元素:\\n\"); for (i=0;i数组作为函数参数用法总结:

void convert( ) { } 37

实验六 函数

【例4】写两个函数,分别求两个正数的最大公约数和最小公倍数,用主函数调用这两个函数并输出结果。两个正数由键盘输入。 源程序如下: #include int hcf( ) Int hcf(int ,int ); { int lcd(int u,int v,int h); { return(u*v/h); } void main() { int u,v,h,l; scanf(\"%d %d\ h=hcf(u,v); printf(\"H.C.F=%d\\n\ l=lcd(u,v,h); printf(\"L.C.D=%d\\n\ } int lcd(int u,int v,int h) { } return(u*v/h); }

你能不能用全局变量的方法,分别用两个函数求最大公约数和最小公倍数?请将程序写在下面。

38

实验六 函数

【例5】写一函数,用“冒泡法”对输入的10个字符按由小到大顺序排序。 源程序如下: /*冒泡法排序*/ #include #include #define N 10 void sort( ) void sort(char str[]); { void main() { int i,flag=1; char str[N]; while(flag) { printf(\"\\n输入字符串,长度为10:\\n\"); gets(str); if (strlen(str)>N) printf(\"超过长度,请重输!\"); else flag = 0; } printf(\"%s\\n\ sort(str); printf(\"\\n排序结果:\"); } for (i=0;i【例6】编写程序,从键盘分别输入年、月、日,计算出该天时这年中的第几天。 示例输出:

Input year_month_day: 2005 12 12 是这年的第346天。 请按下面程序中的提示完成整个程序。 #include ―stdio.h‖ Int day_tab[2][13]={

{0,31,28,31,30,31,30,31,31,30,30,31}, {0,31,29,31,30,31,30,31,31,30,30,31}}; /*统计天数函数的头部*/ { int i,j;

/*判断该年是否是闰年,并将其逻辑值赋给变量i*/

39

实验六 函数

for(j=1;j/*返回总的天数*/ }

void main( ) {

int y,m,d;

/*提示输入年月日*/

/*分别输入年月日*/

printf(―是这年的第%d天\\n‖,day_year(y,m,d)); }

【思考】

a. 不使用二维数组存放每个月的天数,用两个一维数组分别存放闰年和非闰年的天数,重

新编写程序。

b. 用if语句对年、月、日的正确性进行验证,若不符合年、月、日的要求就退出程序。 c. 将存放每个月天数的二维数组说明为局部数组,要如何修改程序?

编程作业

1.定义一个函数,功能是计算n个学生的成绩中,高于平均成绩的人数,并作为函数值。用主函数来调用它,统计50个学生成绩中,高于平均成绩的有多少人?

40

实验六 函数

2.编写一个对n个数据从大到小的排序C函数,再编写一个计算最后得分的C函数,计算方法是:去除一个最高分,去除一个最低分,其余的平均分为参赛选手的最后得分。并在主函数中调用它们对有n个评委评分,m个选手参赛的最后得分,从大到小排序输出。

3.用一个函数来实现将一行字符串中最长的单词输出。此行字符串从主函数传递给该函数.(习题8.10)

【注意】此题要求实现两个版本,第一个版本要求把两个函数放在同一个程序文件中,作为一个文件进行编译和运行。第二个版本把两个函数分别放在两个程序文件中,作为两个文件进行编译、连接和运行。

41

实验六 函数

选做题

1.编写一个程序,包括主函数和如下子函数。

(1) 输入10个无序的整数; (2) 用冒泡法从大到小排序;

(3) 要求输入一个整数,用折半查找法找出该数,若存在,在主函数中输出其所处的位置,否则,插入适当位置。

【提示】用input函数完成10个整数的录入,sort函数完成冒泡法排序,search函数完成输入数的查找。

2.根据条件进行学生成绩排名

(1)在函数中进行10个学生成绩从高到低排名 sort(int a[10]);

(2)改进第一步的函数为sort(int a[],int n),进行n个学生成绩从高到低排名;

(3)改进第二步的函数为sort(int a[],int n, char style), 将n个学生成绩从高到低排名,排名方式根据sort()函数的style参数进行,如style为‘a’按升序排,style为’d’按降序排;(a:ascending 升,d:descending 降)

(4)在main() 函数中调用它们,实现完整的功能。

知识点描述及编程体会

实验成绩 签名

年 月 日

42

实验七 指针

实验七 指针(4学时)

目的要求

(1)掌握指针的概念,会定义和使用指针变量。 (2)基本掌握指针的C程序设计。

(3)学会使用数组指针和指向数组的指针变量。 (4)学会使用字符串指针和指向字符串的指针变量。 (5)结合数组、函数调用进行复杂的编程。

(6)巩固所学的理论知识,培养锻炼进行复杂C程序设计的能力。

上机内容

一般示例

【例1】调试下列程序,使之具有如下功能:用指针法输入12个数,然后按每行4个数输出。并指出程序错在什么地方,用到了哪些知识点。 #include

void main() {

int j,k,a[12],*p;

for(j = 0;j < 12;j ++) scanf(―%d‖,p ++); for(j = 0;j < 12;j ++) {

printf(\"%d\; if(j%4 == 0) printf(\"\\n\"); } }

【例2】上机调试程序,请修改下面程序中不正确的地方,写出错误原因。 (1)

void main( ) {

int x = 10,y = 5,*px,*py; px = py; px = &x; py = &y;

printf(―*px=%d,*py=%d,*px,*py); } (2)

#include void main( )

43

实验七 指针

{

char *p; char s[80];

scanf(―%s\\n‖,s); p = s[0];

printf(―%s\\n‖,p); }

【例3】下面程序的功能是:从键盘上面输入3个整数,按由小到大的顺序输出。完善程序中的空缺行。 #include void main() {

void swap( ); int n1,n2,n3; int p1,p2,p3;

printf(\"请输入三个整数n1,n2,n3:\"); scanf(\"%d,%d,%d\ p1=&n1; p2=&n2; ; if(n1>n2) swap( ); if(n1>n3) swap(p1,p3); if(n2>n3) swap(p2,p3);

printf(\"排序后三个整数为:%d,%d,%d\\n\}

void swap( ) {

int p; p=*q1;

; *q2=p; }

【例4】下面程序求一个字符串的长度,程序中标有\"*\"行有错,请改正。 #include void main() { int length( ); int len ;

char *str[20];

printf(\"请输入一个字符串:\"); scanf(\"%s\

* len=length(*str);

printf(\"字符串长度为%d\}

44

实验七 指针

* int length(*p) {

int n=0;

* while(p!= '\\0') { n++; p++; }

return(n); }

编程作业

下面的作业均要求画出程序流程图和写出源程序代码。并在电脑上运行通过。

1.编写一个函数,分别对double型数组的下标为偶数的元素和下标为奇数的元素求和。依据元素下标是奇数还是偶数,把各元素计算机到相应的和中。并在主函数中验证你编写的函数是否正确。函数定义格式应该如下:

void sum(double a[],int n,double *even_index_sum_ptr,double *odd_index_sum_ptr) /*n is the size of a[]*/

45

实验七 指针

2.编写一个自己的库函数strcmp(),用来实现实现两个字符串的比较,函数原型为:int strcmp (char * p1, char * p2);

设p1指向字符串s1,p2指向字符串s2,要求当s1=s2时,函数返回值为 0, 如果sl≠s2,则返回它们二者第一个不相同字符的ASCII码差值(如“BOY”与“BAD”的第二个字母不相同,“O”与“A”之差为79—65=14);如果sl>s2,则输出正值;如果sl3.编写程序,输入三个整数,按由小到大的顺序输出。

然后将程序改为:输入三个字符串,按由小到大顺序输出。(习题l0.1、10.2)

46

实验七 指针

选做题

1.将一个3×3的矩阵转置,用一函数实现之。(习题10.9) 在主函数中用scanf函数输入以下矩阵元素: l 3 5 7 9 11 13 15 19

将数组名作为函数实参,在执行函数的过程中实现矩阵转置,函数调用结束后在主函数中输出已转置的矩阵。

2.有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。(习题10.5)

3.用指向指针的指针的方法对n个整数排序并输出。要求将排序单独写成一个函数。n和各整数在主函数中输入,最后在主函数中输出。(习题10.21) 4.用指针优化学生成绩排名

(1)定义一个数组stu[10]存放10个学生的成绩,从键盘输入数据,要求用指针实现 (2)将数组stu[10]的内容输出到屏幕上,要求用指针实现 (3)将成绩数组按照从高到低进行排序,要求用指针实现

(4)将第三步内容放在函数中实现,在主函数中调用实现排序,用指针实现,输出排序后的成绩单

(5) 采用指针方法,输入字符串“student score ”,复制该字符串并输出(复制字符串采用库函数或用户自定义函数)

知识点描述及编程体会

实验成绩 签名

年 月 日

47

实验八 结构体和文件操作

实验八 结构体和文件操作(4学时)

目的要求

(1)掌握结构体类型变量的定义和使用; (2)掌握结构体类型数组的概念和使用;

(3)掌握链表的概念,初步学会对链表进行操作; (4)掌握文件以及缓冲文件系统、文件指针的概念; (5)学会使用文件打开、关闭、读、写等文件操作函数; (6)学会用缓冲文件系统对文件进行简单的操作。

上机内容

一般示例

【例1】 上机运行程序,观察运行结果。 #include struct st { int x; 运行结果为: int *y; } *p;

int s[]={10,20,30,40};

struct st a[]={1,&s[0],2,&s[1],3,&s[2],4,&s[3]}; void main( ) {

p=a;

printf(―%d\\n‖,p->x); printf(―%d\\n‖,(++p)->x); printf(―%d\\n‖,*(++p)->y); printf(―%d\\n‖,++(*(++p)->y)); }

【例2】 试利用结构体类型编写程序,有5个职工的姓名、基本工资和补贴,计算每个职工

实发工资并输出。

#include void main( ) { int i;

/*结构体类型struct worker 的定义,其成员有姓名、基本工资、补贴和实发工资*/

struct worker s[5]={{―li‖,2000,120},{―ma‖,2020,45},

48

实验八 结构体和文件操作

{―lin‖,3211,234},{―wang‖,4567,900},{―deng‖,6467,861}}; for i=0;i<5;i++)

/*计算每个人的实发工资*/

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

/*用printf()语句输出每个人的姓名和实发工资*/ }

【思考】

a. 改写程序,利用循环语句从键盘逐个输入数据,给struct worker 类型的数组元素赋值。 b. 重新编写程序,增加相应的变量,将所有人的基本工资、补贴和实发工资分别累加起来,

并输出。 【例3】下面的程序对data.dat文件写入10条记录。通过此题,请总结文件操作的一般规律。 #include

void main()

{

FILE *fp; int i; float x;

fp = fopen(\"date.dat\for(i = 1;i <= 10;i ++) {

scanf(\"%f\fprintf(fp,\"%f\\n\}

fclose(fp); }

编程作业

下面的作业均要求画出程序流程图和写出源程序代码。并在电脑上运行通过。

1.定义一个结构体类型,包含用户的姓名(含6个字符的字符串)和电话号码(含8个字符的字符串)。编写函数getUser用于读入n位用户的数据到结构体数组中;编写函数sortUser用于将数组中的用户按姓名的字母顺序重新排列;编写函数outUser用于输出数据。 部分程序如下,请完善程序。 #include ―stdio.h‖ #include ―string.h‖ #define N 5 struct User {

char name[7],tel[9]; };

49

实验八 结构体和文件操作

/*以下是getUser函数*/

/*以下是sortUser函数*/

/*以下是outUser函数*/

void main( ) {

struct User user[N]; getUser(user,N); sortUser(user,N); outUser(user,N); }

2.建立一个链表,每个结点包括的成员为:职工号、工资。用一个creat()函数来建立链表,用list()函数来输出数据。5个职工号为101,103,105,107,109。在此基础上,新增加一个职工的数据,按职工号的顺序插入链表,新插入的职工号为106。写一函数insert来插入新结点。然后再写一函数delete,用来删除一个结点。要求删除职工号为103的结点。打印出删除后的链表。

50

实验八 结构体和文件操作

3.用记事本软件建立一个名为“d1.txt”的文本文件存入磁盘,文件中有18个数。请你编写一个程序,你的程序能从磁盘上读入该文件,并用文件中的前9个数和后9个数分别作为两个3*3矩阵的元素。求这两个矩阵的和,并把结果按每行3个数据写入文本文件“d2.txt”。你可以用DOS命令TYPE显示“d2.txt”文件中的内容。

51

实验八 结构体和文件操作

选做题

1.建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。(习题11.11) 2.学生成绩单制作

(1)定义一个结构体数组,存放10个学生的学号,姓名,三门课的成绩 (2)从键盘输入10个学生的以上内容

(3)输出单门课成绩最高的学生的学号、姓名、以及该门课程的成绩 (4)输出三门课程的平均分数最高的学生的学号、姓名及其平均分

(5)将10个学生按照平均分数从高到低进行排序,输出结果,格式如下所示: number name math Chinese English average 103 tom 90 90 100 95 101 alice 90 80 70 80 3.学生成绩文件管理

(1)定义一个结构体数组,存放10个学生的学号,姓名,三门课的成绩 (2)从键盘输入10个学生的以上内容,存入文件stud.dat,关闭文件 (3)打开stud.dat文件,将数据读出,查看是否正确写入,关闭文件。

(4)打开文件stud.dat文件,读出数据,将10个学生按照平均分数从高到低进行排序, (5)分别将结果输出到屏幕上和另一文件studsort.dat中。

(6)从studsort.dat 文件中读取第2,4,6,8,10个学生的数据。

知识点描述及编程体会

实验成绩 签名

年 月 日

52

因篇幅问题不能全部显示,请点此查看更多更全内容