您好,欢迎来到尚佳旅游分享网。
搜索
您的当前位置:首页《C语言》实验指导书-上机编程--湖北理工学院

《C语言》实验指导书-上机编程--湖北理工学院

来源:尚佳旅游分享网


《C语言程序设计》实验指导书

《C语言程序设计》实验指导书

实验一 顺序结构程序设计

一、实验目的及要求

1. 了解如何编辑、编译、连接和运行一个C程序; 2. 熟悉基本类型的变量的定义;

3. 掌握C语言中使用最多的一种语句——赋值语句的使用; 4. 掌握数据的输入输出的方法,能正确使用各种格式转换符。 二、实验任务

1.熟悉使用VC++6.0编辑、编译、连接和运行一个C程序的过程。

1)启动Visual C++,选择“文件”菜单中的“新建”命令,选择“文件”标签中的“C++ Source File”选项。

2)选择源程序存放的目录和输入源程序名,单击“确定”。 3)在编辑器中编写源程序。

4)单击F7或“编译”中的“重建全部”编译源程序,若编译通过,单击“执行”,在DOS屏上看结果,任按一键返回编辑器。

2. 输入并运行一个简单的程序。 输入下面的程序 #include void main() {

printf(“ This is a C program.\\n”); }

编译和连接该程序,观察屏幕上显示的编译信息。如果出现“出错信息”,则应找出原因并改正之,再进行编译。

如果编译无错误,运行该程序,观察分析运行结果。 3. 输入并编辑一个C程序。 输入以下程序 #include void main() { int a,b,sum; a=123;b=456; sum=a+b; print (“sum is %d、n”,sim); }

编译改程序,仔细分析编译信息窗口,可能显示有多个错误,逐个修改,直到不出现错误。

运行程序,分析运行结果。

4. 掌握各种格式转换符的正确使用方法。 a. 输入程序

#include void main( ) {int a,b; float d,e; char c1,c2;

1

《C语言程序设计》实验指导书

double f,g; long m,n;

unsigned int p,q; a=61; b=62;

f=3157.8901121; g=0.123456789; m=50000;n=-60000; p=32768;q=40000;

printf(“a=%d,b=%d\\nc1=%c,c2=%c\\nd=%6.2f,e=%6.2f\\n”,a,b,c1,c2,d,e);

printf(“f=%15.6f,g=%15.12f\\nm=%ld,n=%ld\\np=%u,q=%u,q=%u\\n”,f,q,m,n,p,q); }

b. 运行此程序并分析结果。

c. 在此基础上,修改程序的第8—13行:a=61;b=62;c1=a;c2=b;

f=3157.890121;g=0.123456789;d=f;c2=b;p=a=m=50000;q=b=n= -60000; 运行程序,分析结果。

d. 改用scanf函数输入数据而不用赋值语句,scanf函数如下: scanf(“%d,%d,%c,%c,%f,%f,%lf,%lf,%ld,%ld,%u,%u”, &a,&b,&c1,&c2,&d,&f,&g,&m,&n,&p,&q);

输入的数据如下:

61,62,a,b,3.56,-6.87,3157,890121,0.123456789,50000,-60000,37678,40000

(说明:lf和ld格式符分别用于输入double型和long型数据)分析运行结果。 e. 在d的基础上将printf语句改为:

printf(“a=%d,b=%d\\nc1=%c,c2=%c\\nd=%15.6f,e=%15.12f\\n”,ab.c1,c2,d,e) ; printf(“f=%f,g=%f\\nm=%d,n=%d\\np=%d,q=%d\\n”,f,g,m,n,p,q) ; 运行程序。

f.将p,q改用%o格式符输入。

g. 将scanf函数中的%lf和 %ld改为%f和%d,运行程序并观察分析结果。

5.以下程序多处有错。要按下面指定的形式输入数据和输出数据时,请对该程序做相应的修改。

#include void main ( )

{ double a,b,c,s,v; printf(input a,b,c:\\n); scanf(\"%d%d%d\s=a*b; v=a*b*c;

printf(\"%d %d %d\printf(\"s=%f\\n\}

当程序执行时,屏幕的显示和要求输入形式如下:

input a,b,c:1.0 2.0 3.0 此处的1.0 2.0 3.0是用户输入的数据 a=1.000000 b=2.000000,c=3.000000 此处是要求的输出格式 s=2.000000,v=6.000000

相关知识:① 检查程序错误时应注意几点:

a)有时程序中一个错误会引发一系列错误信息,工作中不应被这种情况所迷惑,改正

2

《C语言程序设计》实验指导书

了一些错误后应及时对源程序重新进行编译;

b)如果修改错误时增删了行,或是一个行里有多个错误,更正前面错误时增删了字符,就可能导致系统对错误定位不准,此时应该重新编译;

c)系统给出的警告信息一般都说明程序中有问题,因为系统发现了可疑情况。对于警告信息同样要逐个仔细分析。除非明确认定不是问题,否则绝不能简单地认为不是错误而不予理睬。实际上,很多警告都是因为程序中确实有严重的隐含错误。

d) 在连接中发现新错误也需要仔细检查和修改程序。连接时发现的错误一般是由于函数名或外部变量名字写错,或者一些函数、外部变量没有定义引起的。系统不能对连接错误给以自动定位,只能提供有关的名字信息等。对于这类问题,可以借助编辑器的字符串查找命令进行定位。

② 正确调用scanf函数和printf函数构成输入和输出语句。 6.有以下程序

#include void main() { char c1,c2; int n1,n2; c1=getchar(); c2=getchar();

n1=c1-'0';n2= n1*10+(c2-'0'); printf(\"%d\\n\}

程序运行时输入:12<回车>,执行后输出结果是什么?

相关知识:①getchar()函数用来输入两个字符分别赋给变量c1和c2; ②n1=c1-'0'相当于n1='1' -'0',字符1的ASCII码值比0大一,所以n1中的值为1,c2-'0'相当于'2' -'0';

③把字符串转换为多位数的算法。 7.若有以下程序 #include void main() { int i,j; int x,y;

scanf(\"i=%d,j=%d\ scanf(\"%d%d\ printf(\"i=%d,j=%d\\n\ printf(\"%4d%4d\\n\}

要求给i赋值为10,j赋值为20,则应该怎样从键盘输入数字?

相关知识:①在调用scanf()函数时在格式串中若包含有格式描述符之外的字符时,则要求在输入数据时在对应的位置上输入完全匹配的字符;

②scanf()函数只包含格式描述符时可用跳格键Tab、空格和回车分隔数据;

③在调用printf ()函数时在格式串中若包含有格式描述符之外的字符时,则在输出数据时在对应的位置上输出完全匹配的字符,%d之类的格式符位置输出对应输出项的值;故输出时要注意插入适当的非格式符以便区分各个输出结果。 8. 计算定期存款本利之和

3

《C语言程序设计》实验指导书

设银行定期存款的年利率rate为2.25%,并已知存款期为n年,存款本金为capital元,试编程计算n年后的本利之和deposit。要求定期存款的年利率rate、存款期n和存款本金capital均由键盘输入。 三、实验重点、难点

1. 符数据输入输出函数 2. 格式输入输出函数 四、操作要点

(1)编译

选择主菜单“编译(Build)”中的“编译(Compile)”命令,或单击工具条上的图标 ,系统只编译当前文件而不调用链接器或其它工具。输出(Output)窗口将显示编译过程中检查出的错误或警告信息,在错误信息处单击鼠标右键或双击鼠标左键,可以使输入焦点跳转到引起错误的源代码处大致位置以进行修改。

(2)构建

选择主菜单“编译(Build)”中的“构建(Build)”命令,或单击工具条上的图标 ,对最后修改过的源文件进行编译和连接。

程序构建完成后生成的目标文件(.obj),可执行文件(exe)存放在当前工程项目所在文件夹的“Debug” 子文件夹中。

(3)运行

选择主菜单“编译(Build)”中的“执行(Build Execute)”命令,或单击工具条上的图标 ,执行程序,将会出现一个新的用户窗口,按照程序输入要求正确输入数据后,程序即正确执行,用户窗口显示运行的结果。

对于比较简单的程序,可以直接选择该项命令,编译、连接和运行一次完成。 五、注意事项

1. 输入输出的数据类型与所用格式说明符不一致 2. 输入变量时忘记使用地址符号

实验二 逻辑结构程序设计

一、实验目的及要求

1. 了解C语言表示逻辑量的方法。

2. 学会正确使用逻辑运算符和逻辑表达。 3. 熟练掌握if语句和switch语句。 二、实验任务

1 源程序中包含有一些错误,调试下列程序,使之具有如下功能:输入a、b、c三个整数,求最小值。

# include “stdio.h” void main( ) { int a,b,c;

scanf(\"%d%d%d\; if((a>b)&&(a>c)) if(bprintf(\"min=%d\\n\; else

printf(\"min=%d\\n\; if((a4

《C语言程序设计》实验指导书

printf(\"min=%d\\n\; }

再次运行程序,输入为“2,1,3”,程序输出却是“min=2”。用单步执行的方法,马上发现变量a、b、c的值是不对的,原因是程序要求输入数据的分隔符是空格(还允许使用回车或键)。改正输入数据的分隔方式后,程序没有输出,还是用单步执行的方法,监视程序的执行过程,发现程序中条件设计有误,经过改正的程序如下: # include “stdio.h”

void main() { int a,b,c;

scanf(\"%d%d%d\; if((aprintf(\"min=%d\\n\ else if((bprintf(\"No find minimum\\n\"); }

上述程序是按在三个数中仅有一个最小值时才称其为最小值进行设计的。另外,注意程序的书写格式,一定要采用缩进格式,即不同层次(分支)的语句左起的空格不同,这样可以有效地提高程序的可读性。

相关知识:①类似a2.参考上一题,编写一个C程序,求a、b、c、d四个数中的最大者。 编程点拨:

①多定义一个变量,并一开始令变量max=a;

②if(max3.输入4个整数,要求按由小到大顺序输出。得到正确结果后,修改程序使之按由大到小顺序输出。

相关知识:①输入函数scanf()的使用;②简单的排序算法;③通过中间变量t交换a和b值的方法:t=a; a=b; b=t;。

4.根据以下函数关系,对输入的每个x值,计算出相应的y值。

ex1y|x|2sin(x2)#include #include void main() { float x,y;

scanf(\"%f\

if ( ) y= ;

0x13x4

当x取其他值时

5

《C语言程序设计》实验指导书

else if( )

y= ;

else printf(\"x=%f,y=%f\}

相关知识点:if语句的嵌套;数学函数的调用方式。 5模仿第4题,写程序实现以下函数:

x(x1) y2x1(1x10)

3x11(x10)用scanf函数输入x的值,求y值。运行程序,输入x的值(分别为x<1、1≤x<10、x>10三种情况),检查输出的y值是否正确。

相关知识:①用if的嵌套实现分段函数;②比较运算符的正确使用;③算术运算符*的正确使用。

6.阅读分析以下程序的功能。 #include void main( ) { int choice; int value;

printf(\"Convert:\\n\"); /* 显示菜单 */

printf(\" 1:decimal to hexadecimal\\n \"); printf(\" 2:hexadecimal to decimal\\n \"); printf(\" 3:decimal to octal\\n \"); printf(\" 4:octal to decimal\\n\"); printf(\"enter your choice: \"); scanf(\"%d\

switch (choice) { case 1: /* 选中1时处理 */ printf(\"enter decimal value:\"); scanf(\"%d\ printf(\"%d in hexadecimal is:%x\\n\ break;

case 2: /* 选中2时处理 */

printf(\"enter hexadecimal value:\"); scanf(\"%x\ printf(\"%x in decimal is:%d\\n\ break; case 3: /* 选中3时处理 */ printf(\"enter decimal value:\"); scanf(\"%d\ printf(\"%d in octal is:%o\\n\ break;

case 4: /* 选中4时处理 */

printf(\"enter octal value:\");

6

《C语言程序设计》实验指导书

}

}

scanf(\"%o\

printf(\"%o in decimal is:%d\\n\break;

相关知识:①用switch语句实现菜单的方法;②数制转换的方法。

7. 模仿第6题,要求对输入的数字1~7转换成文字星期几,对其它数字不转换。例如,输入5时,程序应该输出Friday。

① 编辑、调试和运行该程序,然后输入4。其输出结果是什么?为什么是这样的结果?

② 该程序有哪些错误?如何修改?

相关知识:①switch语句的正确使用;②break在switch语句中的作用。 三、实验重点、难点

1. 表达式

2. 选择型程序设计语句 3. 逻辑表达式 四、操作要点

选择主菜单“编译(Build)”中的“重建全部(Rebuild All)”命令,允许用户编译所有的源文件,而不管它们何时曾经被修改过。

选择主菜单“编译(Build)”中的“批构建(Batch Build)”命令,能单步重新建立多个工程文件,并允许用户指定要建立的项目类型。 五、注意事项

1. 误把“=”作为关系运算符“等于”

2. 没有注意大写字母和小写字母代表不同的标识符

3. 当一个复合语句中使用多层括号时,常出现大括号不配对的现象。

实验三 循环控制

一、实验目的及要求

1. 熟悉掌握用分for语句,while语句和do_while语句实现循环的方法。

2. 掌握在程序设计中用循环的方法实现一些常用算法(如穷举、迭代、递推等)。 二、实验任务

1. 下面程序求1+„+100,填空,实现该功能。 #include void main() {

int s,i;

s=0; /* 第5行 */ for( )

s=s+i;

printf(\"1+...+100=%d\\n\}

思考:(1)第5行能不能去掉?其作用是什么?

7

《C语言程序设计》实验指导书

(2)不用for语句,用while语句改写该程序,实现同样的功能。 2. 比较下列两个程序。(验证)

#include void main() { int i,n,sum=0;

scanf(\"%d\n=i;

while(i<=10) { sum+=i; i++; }

printf(\"%d+...+10=%d\}

#include void main() { int i,n,sum=0;

scanf(\"%d\n=i; do

{ sum+=i; i++;

} while(i<=10);

printf(\"%d+...+10=%d\}

分别运行这两题,若输入7,这两个程序的结果分别是多少?若输入12,这两个程序的结果又分别是多少?比较为什么会有这样的区别?

3. 预习下面程序,若输入12345,分析输出结果是多少?上机验证。

#include void main( )

{ long data;

scanf(\"%ld\ while(data)

{ printf(\"%ld,\ data=data/10; } }

4. 下面程序实现求Fibonacci数列的前n个数。(验证、调试)

1FnFn1Fn2n1或n2n3

运行程序,写出运行结果;采用单步跟踪技术运行该程序,观察一下变量的变化。

#include void main( )

{ long int f1, f2;

8

《C语言程序设计》实验指导书

int i,n;

printf(\"Input n:\"); /* 第5行 */ scanf(\"%d\ /* 第6行 */ f1=f2=1;

for(i=1;i{ printf(\"%ld\%ld\\n\ /* 第9行 */ f1=f1+f2; f2=f2+f1; } } 思考:(1)f1、f2这两个变量为什么定义为long int 型?

(2)第5行和第6行的相互作用,你会用这种方式来实现输入吗?

(3)注意第9行的输出“%ld”中的“1”是字母“L”的小写形式,不是数

字1。

5. 预习下面程序,写出预习结果并上机验证。(验证)

#include void main( ) { int i,j,x;

for(i=0,x=0;i<2;i++) { x++;

for(j=0;j<3;j++)

{ if(j%2) continue;

x++; } x++; }

printf(\"x=%d\\n\ }

思考:用一句话概括if(j%2)语句的作用。

相关知识:嵌套for循环的执行过程及continue语句的作用。

6.下面程序输入一批考试分数,用1作为结束标志,若输入大于100分,则提示重新输入,然后计算最高分、最低分与平均分。请调试、检查程序中的错误,并改正之。

#include void main( )

{ int mark;

int n=0 ; sum=0 ; int max=100 ; min=0 ; for ( ; ; ) ;

{ scanf(\"%d\ if ( mark > 100 )

{ printf(\" Mark > 100 , Please reinput \\n \"); break; }

if ( mark=-1)

9

《C语言程序设计》实验指导书

break; n ++ ;

sum=sum + mark ; if( mark > max ) max = mark ; if( mark < min )

min = mark ; }

sum=sum/ n ;

printf(\"max =%d , min = %d, aver = %d \\n\ }

提示:该程序有很多错误,下面给出某些错误的说明。当求一批数中的最大值时,若已知一批数的最小值,则将这个最小值作为最大值的初始值;当求最小值时,情况相反,即若已知这批数的最大值,则将这个最大值作为最小值的初始值。本例中求一批分数的最高分,则最高分的初始值应该设为0,然后在程序循环中逐渐地升高,直至求出最高分;本例中还要求这批分数的最低分,则最低分的初始值设为100,然后在程序循环中逐渐地降低,直至求出最小值。实现“若输入大于100分,则提示重新输入”功能的语句有错;实现“用1作为结束标志”功能的语句有错。

思考:(1)“一批数据”是几个数据?输入的数据如何结束?程序中哪一行是实现结束这个要求的,写出该语句。

(2)程序中哪个语句是实现”若输入大于100分,则提示重新输入”这个要求的,写出该语句。

(3)写出您的测试数据及运行结果,注意输入的数据序列中最后一个应是-1。

7.编程:输入20个1~90的整数,分类统计1~30、31~60、61~90的数各有多少个? 编程点拨:

(1) count1计1~30的个数,count2计31~60的个数,count3计61~90的个数。 (2) 用for循环20次实现该程序的功能:输入一个整数x,判断该数所在的范围,若x

是1~30,则count1加1;若x是31~60,则count2加1;若x是61~90,则count3加1。

(3) 最后,输出统计的结果。 #include void main( )

{ int count1=0,count2=0,count3=0; int i,x;

printf(“Please input 20 numbers:”); for(i=0;i<20;i++) { scanf(“%d”,&x);

„„„ /*补充完成程序*/ }

/* 输出统计结果 */ „„„„„ }

补充完成该程序。

8.编程:素数是除了1和其本身以外,不能被其他自然数整除的自然数。从键盘输入一

10

《C语言程序设计》实验指导书

个数,判断该数是不是素数?

编程点拨:

a) 输入这个数x。

b) 用for循环2~x-1,用2~x-1的每一个数去除x,若有一个数整除x,则说明

x不是素数;否则,x就是素数。 c) 最后,将判断结果输出。 #include void main( ) { int i, x;

printf(\"Enter one natural integer: \"); scanf(\"%d \

for(i=2;i思考:其实,只需要判断2~x之间的整数能否整除x就可以判断x是否为素数,此时,如何修改程序?

9.编程:显示所有的水仙花数。谓水仙花数,是指一个3位数,其各位数字立方和等于该数字本身。例,153是水仙花数,因为153=13+53+33 。有两种解题思路,选择其中之一编程实现:

(1) 利用三重循环,将这三个数通过一定的运算符连接成一个3位数,然后判断是

否是水仙花数。

for(i=1;i<=9;i++) for(j=0;j<=9;j++)

for(k=0;k<=9;k++)

注意,因水仙花是一个三位数,百位i是从1开始,不能从0开始,十位j和个数位k可以从0开始。

(2) 利用一个循环,对100~999范围内的每个3位数逐位分离后进行判断。

for(i=100;i<999;i++) { a=i/100;

b=(i-a*100)/10; c=i%10;

„„„ }

10.编程:输出下列图形。 * *** ***** *******

*********

分析:这是由星号构成的5行5列的三角形图形。每一行的星号数量为:1、3、5、7、9。考虑两点,一是每一行上星号的生成规则,二是每一行第一个星号字符的输出位置。每一行的星号与行号有关,即2*i+1,其中i是行号;每一行的输出位置比上一行少一个空格,可以这样实现:for(j=1;j<=40-i;j++) printf(“%c”, „ ‟),其中i是行号。 三、实验重点、难点

11

《C语言程序设计》实验指导书

1. 循环语句 2. 循环的嵌套

3. break和continue语句 四、操作要点

选择主菜单“编译(Build)”中的“开始调试(Start Debug)”命令,选择下一级提供的调试命令,或者在菜单区空白处单击鼠标右键,在弹出的菜单中选中“调试(Debug)”项。激活调试工具条,选择需要的调试命令,系统将会进入调试程序界面。同时提供多种窗口监视程序运行,通过单击“调试(Debug)”工具条上的按钮,可以打开/关闭这些窗口。 五、注意事项

1. 对应该有花括号的复合语句,忘记加花括号 2. 在不该加分号的地方加了分号 3. 引用数组元素时误用圆括号 4. 引用数组元素超界

5. 对二维或多维数组定义和引用的方式不对 6. 误以为数组名代表整个数组

7. 混淆字符数组与字符指针的区别

实验四 数组

一、实验目的及要求

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

3. 掌握与数组有关的算法(特别是排序算法)。 二、实验任务

1.调试下列程序,使之具有如下功能:输入10个整数,按每行3个数输出这些整数,最后输出10个整数的平均值。写出调试过程。

#inclue #define N 10 void main( ) { int i,a[N],av;

for(i=0;iprintf(\"\\n\"); }

for(i=0;i!=N;i++) av+=a[i];

printf(\"av=%f\\n\; }

上面给出的程序是完全可以运行的,但是运行结果是完全错误的。调试时请注意数组元素的输入问题、输出格式问题等。请使用前面实验所掌握的调试工具,判断程序中的错误并改正。

12

《C语言程序设计》实验指导书

相关知识:①数组元素值的输入;②求和求平均值的相关变量初始化问题;③输出格式符的正确使用。④数组元素的格式化输出。

2.下面程序是输入5个数据,然后求它们的和并输出结果。

#include void main( )

{int i, a[5], sum = 0;

scanf(\"%d,%d,%d,%d,%d\ for (i = 0; i <= 4; i ++) sum += a[i];

printf(\"sum = %d \\n\}

该程序中有哪些错误?如何修改?写出正确运行后的结果。 相关知识:数组元素的输入和输出只能逐个元素操作,而不能以数组名作整体操作。 3.有一个3行4列的距阵,现要求编程求出其中最大的那个元素的值,以及它所在的行号与列号。下面程序的初始说明和输出语句如下所示,请补充完成该程序。

#include void main( )

{ int i, j, row, colum, max;

static int a[3][4] = {{1,2,3,4}, {9,8,7,6}, {-10,10,-5,2}}; ……

printf(\" Max = %d, Row = %d, Colum = %d \\n\ max, row, colum); }

编程点拨:

① 初始化row、colum及max。 ② 使用for循环的双重循环逐行把元素值与max值进行比较,比较结果如果

元素值比max值大,则改变max值,同时改变row和colum的值。 ③最后输出max,row和colum的值。

相关知识:①二维数组的定义和初始化;②使用二重循环对二维数组元素的访问;③

求最值时相关变量初值的设定。

4.数组中已存互不相同的10个整数,从键盘输入一个整数,输出与该值相同的数组元素下标。

编程点拨:输入要查找的变量x的值;使用循环将输入的数和数组元素逐个进行比较,若找到,则提前退出循环;根据循环是正常结束还是提前结束来判断是否找到x。

部分源代码:

#include void main( )

{ int i, x, a[10]={1,2,3,4,5,6,7,8,9,10};

/*输入x变量的值 */ for ( i=0; i<10; i++ ) printf(\"%4d\ printf(\"\\n\");

/* 循环查找与x相等的元素 */ if ( ) printf(\"%d\\n\ /* 输出查找结论 ,输出下标值 */ else printf(\"Not found %d\\n\}

13

《C语言程序设计》实验指导书

5.编写程序,任意输入10个整数的数列,先将整数按照从大到小的顺序进行排序,然后输入一个整数插入到数列中,使数列保持从大到小的顺序。

编程点拨:

①定义数组时多开辟一个存储单元; ②找合适的插入位置;

j=3 3

下标=

a

0 1 2 4 5 6 7

8 9 10

20 18 16 14 12 10 8 6 4 2 k 15 找合适的插入位置:j=3

j=0 a[j] ≥k? 即20 ≥15 ? 是 j++ j=1 a[j] ≥k? 即18 ≥15 ? 是 j++ j=2 a[j] ≥k? 即16 ≥15 ? 是 j++

j=3 a[j] ≥k? 即14 ≥15 ? 不是,结束循环

while( a[j]>=k && j<10 ) j++;

找不到比k小的元素时也要退出循环

③向右移动插入点后的元素;先把a[9]移到a[10],a[8]移到a[9],…a[i]移到a[i+1],直到把a[j]移到a[j+1],即:i=j停止移动元素。

for(i=9;i>=j;i-- ) a[i+1]=a[i];

下标=

a 0 1 2 3 4 5 6 7 8 9 10

20 18 16 14 12 10 8 6 4 2 ④插入。 k 15 部分源代码:

14

《C语言程序设计》实验指导书

#include #define N 11 void main() { int i,j,a[N];

printf(“Please input 10 numbers:”); for (i=0; iscanf(“%d”,&a[i]); /*乱序输入10个整数*/ …… }

相关知识:①比较排序法、选择排序法和冒泡排序法;②数据元素的插入。 6.输入十个互不相同的整数并存在数组中,找出最大元素,并删除。 编程点拨:

求最大值所在元素下标:不必用max记住最大值,只要用k记住最大值所在的元素下标;删除最大值:从最大值开始将其后面元素依次前移一个位置。

下标=

a

0 1 2 3 4 5 6 7 8 9 10

2 8 16 14 1 10 8 16 4 20 6 部分源代码:

k=0;

if ( a[k]k=2; 不执行 if ( a[k]k=0;

for ( i=1; i<10; i++ ) if ( a[k]相关知识:①删除数组元素的概念;②移动数组元素的算法;③求最大值位置的算法。 7. 以下程序的功能是:从键盘上输入若干个学生的成绩,统计计算出平均成绩,并输出低于平均分的学生成绩,用输入负数结束输入。请填空:

#include void main( )

{ float x[1000], sum=0.0, ave, a; int n=0, i;

printf (\"Enter mark : \\n\") ; scanf(\"%f\

while (a>=0.0 && n<1000) { sum+= ;

x[n]= ;

n++;

scanf(\"%f\

}

15

《C语言程序设计》实验指导书

ave= ; printf (\"Output : \\n\"); printf (\"ave = %f\\n\ for (i=0; iif ( ) printf(\"%f\\n\}

8. 综合编程题:打印如下杨辉三角形

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1 编程点拨:

杨辉三角形有如下特点: 只有下半三角形有确定的值;

第一列和对角线上的元素值都是1;

其它元素值均是前一行同一列元素与前一行前一列元素之和。

9.调试下列程序,使之具有如下功能:任意输入两个字符串(如:“abc 123”和“china”),并存放在a,b两个数组中。然后把较短的字符串放在a数组,较长的字符串放在b数组。并输出。

#include

#include void main()

{ char a[10],b[10]; int c,d,k,ch; scanf(\"%s\ scanf(\"%s\

printf(\"a=%s,b=%s\\n\ c=strlen(a); d=strlen(b); if(c>d)

for(k=0;k{ ch=a[k];a[k]=b[k];b[k]=ch;} printf(\"a=%s\\n\ printf(\"b=%s\\n\ }

相关知识:程序中的strlen()是库函数,功能是求字符串的长度,它的原型保存在头文件\"string.h\"中。调试时注意库函数的调用方法,不同的字符串输入方法,通过错误提示发现程序中的错误。

10.阅读下面的程序,然后回答后面的问题: #include

#include void main( )

16

《C语言程序设计》实验指导书

{ char s1[80], s2[40]; int i = 0, j = 0;

printf(\" \\n Please input string1:\"); scanf(\"%s\

printf(\" \\n Please input string2:\"); scanf(\"%s\ while (s1[i]!= '\\0' ) i++;

while (s2[j]!= '\\0' ) s1[i++]=s2[j ++]; s1[i]= '\\0';

printf(\"\\n New string: %s\}

编辑、运行该程序,然后分别输入 Country 和side。请问: ① 程序执行的结果是什么? ② 该程序的功能是什么? 相关知识:① 串结束符‟\\0‟;② 自编写库函数。

11.填空完成下面程序,使其功能是对从键盘上输入的两个字符串进行比较,然后输出两个字符串中第一个不相同字符的ASCII码之差。例如:输入的两个字符串分别为abcdefg和abceef,则输出为-1。程序如下:

#include

void main ( )

{ char str1[100],str2[100]; int i,s;

printf(\"\\n Input string 1:\\n\");gets(str1); printf(“\\n Input string 2:\\n”);gets(str2); i= (1) ;

while((str1[i]==str2[i])&&(str1[i]!= (2) )) i++; s= (3) ; printf(\"%d\\n\ }

12.填空完成下面程序,使其的功能是统计从终端输入字符中每个大写字母的个数。用#号作为输入结束标志。程序如下:

#include #include void main ( )

{ int num[26],i; char c;

for (i=0;i<26;i++) num[i]=0;

while ( (1) != '#') /* 统计从终端输入的大写字母个数*/ if (isupper(c)) num[c-65] (2) ;

for (i=0;i<26;i++) /* 输出大写字母和该字母的个数*/ if (num[i])printf(\"%c:%d\\n\ (3) ,num[i]); }

17

《C语言程序设计》实验指导书

13.编写程序,输入若干个字符串,求出每个字符串的长度,并打印最长一个字符串的内容。以“stop”作为输入的最后一个字符串。

相关知识: ① 字符数组的输入输出可以有两种方法:

 逐个字符输入输出。用格式符“%c”输入或输出一个字符,此时输入输出函数

中的输入输出项是数组元素名,而不是字符数组名;

 将整个字符串一次输入或输出。用“%s”格式符,意思是输出字符串(string),

此时输入输出函数中的输入输出项是字符数组名,而不是数组元素名。写成下面这样是不对的:printf(\"%s\",c[0]);

② gets()函数和scanf()函数输入字符串的区别,puts()函数和printf()函数输出字符串

的区别; ③ 求每个字符串的长度函数strlen()的使用,字符串比较函数strcmp()的使用; ④ 二维数组处理多个字符串。

14.编写程序,输入字符串s1和s2以及插入位置f,在字符串s1•中的指定位置f处插入字符串s2。如:输入\"BEIJING\"、\"123\"和位置3,则输出:\"BEI123JING123\"。 三、实验重点、难点

1. 一维数组

2. 二维数组和多维数组 3. 字符数组 四、操作要点

可以通过单击调试(Debug)工具条上的按钮或按快捷键的方式选择多种单步执行命令。 ① 单步跟踪进入子函数(Step Into,F11),每按一次F11键或按 ,程序执行一条无法再进行分解的程序行,如果涉及到子函数,进入子函数内部; ② 单步跟踪跳过子函数(Step Over,F10),每按一次F10键,程序执行一行;Watch窗口可以显示变量名及其当前值,在单步执行的过程中,可以在Watch窗口中加入所需观察的变量,辅助加以进行监视,随时了解变量当前的情况,如果涉及到子函数,不进入子函数内部;

③ 单步跟踪跳出子函数(Step Out,Shift+F11),按键后,程序运行至当前函数的末尾,然后从当前子函数跳到上一级主调函数。 ④ 运行到当前光标处

当按下CTRL+F10后。程序运行至当前光标处所在的语句。 五、注意事项

1. 对应该有花括号的复合语句,忘记加花括号 2. 在不该加分号的地方加了分号 3. 引用数组元素时误用圆括号 4. 引用数组元素超界

5. 对二维或多维数组定义和引用的方式不对 6. 误以为数组名代表整个数组

7. 混淆字符数组与字符指针的区别

实验五 函数与编译预处理

一、实验目的及要求

1. 掌握函数定义的方法;

18

《C语言程序设计》实验指导书

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

4. 掌握全局变量和局部变量动态变量、静态变量的概念和使用方法; 5. 掌握预处理的定义与使用方法。 二、实验任务

1. 阅读下面程序,通过调试该程序,熟悉函数的调用方法及单步跟踪键F7和F8的不

同。

#include void main()

{ void fun(int i, int j, int k); int x,y,z; x=y=z=6; fun(x,y,z);

printf(\"%x=%d;y=%d;z=%d\\n\}

void fun(int i, int j, int k) { int t;

t=(i+j+k)*2;

printf(\"t=%d\\n\}

2. 阅读下面程序,注意在调试时F11和F10的区别,还要注意函数调用过程中形参、

实参的关系。 #include void main()

{ int x=10,y=20;

void swap (int ,int);

printf(\"(1)in main :x=%d,y=%d\\n\swap(x,y);

printf(\"(4)in main :x=%d,y=%d\\n\ }

void swap (int m,int n) { int temp;

printf(\"(2)in main :m=%d,n=%d\\nemp=m;m=n;n=temp;

printf(\"(3)in main :m=%d,n=%d\\n\}

把用户自定义函数swap()中的形式参数m和n对应改成x和y,使其与实参变量同名,再用F7跟踪程序的运行,看看有什么变化。

相关知识:形参具有“用之则建,用完则撤”的特点。在函数定义时,函数名后面圆括号内的参数称为形参;在函数调用时,函数名后面圆括号内的参数称为实参。对于实参,在调用函数中对其进行定义时,不仅指明它的类型,而且系统还为其分配存储单元。而对于形参,定义时仅仅只是指明它的类型,并不在内存中为它们分配存储单元,只是在调用时才为其分配临时存储单元,函数执行结束,返回调用函数时,该存储单元立即撤销。

3. 下面程序是实现求素数的,请填空完成该程序,并上机运行测试。

19

《C语言程序设计》实验指导书

#include #include void main() { int m;

; /* 申明求素数函数 */ printf(\"Please input a data m=:\"); scanf(\"%d\

; /* 调用求素数函数 */ }

void prime(int n) { int i,k; k=sqrt(n);

for(i=2;i<=k;i++)

if (n%i==0) break; if(i>=k+1)

printf(\"This is a prime number\"); else printf(\"This isn‟t a prime number\"); }

4. 下面程序的功能是从键盘上输入的若干个数并求出最大值。请填空完成该程序。

#include void main( ) { int i;

int s[10], max;

/* Findmax()函数的申明 */ ; printf(\"Input 10 number : \\n\"); /* 输入10个数据到s数组中 */ ; /* 调用Findmax函数 */ ; for (i=0;i<10; i++) printf(\"%4d\

printf(\"\\nthe max is %d \}

int Findmax( int x[ ], int n ) { int max,i; max=x[0];

for ( i=1; i相关知识:练习形参是数组的函数申明、调用格式;复习数组的输入方法。

5. 下面程序的功能是从键盘上输入的若干个数按升序排序。请调试检查该程序中的错

20

《C语言程序设计》实验指导书

误,程序如下:

#include void main( )

{ int i , k; float s[100], j ;

printf(\" Input number : \\n\"); for (i=0; scanf(\"%f\ s[i]=j; sort(s, i);

for (k=0; kvoid sort( int x[n], int n ) { int i, j, temp,min; for ( i=0; ifor(j=i+1;jif(min!=i)

{ temp=x[i]; x[i]=x[min]; x[min]=temp; } } }

错误提示:形参和实参的数据类型不一致;一般形参数组在说明时不指定数组的长度,而仅给出类型、数组名和一对方括号;用户自定义函数sort()没有申明过。 注意:for (i = 0; scanf(\"%f\这一行中for语句第二个表达式的使用形式,此处用了scanf()函数的出错来结束输出循环。请读者查一下教材后面的附录,看看什么时候scanf()函数返回0,此时就可以结束循环。

n6. 编写程序,实现由主函数输入m、n,按下述公式计算并输出Cm的值。

nCmm!

n!(mn)!提示:定义一个求阶层的函数,然后在主函数中调用三次即可求得。 7. 阅读如下递归程序,其功能是什么?上机调试。

#include void main( ) { int m, k;

void dtoo( int n ,int r );

printf(\"Pleae input the decimal number:\");

21

《C语言程序设计》实验指导书

scanf(\"%d\

printf( \"\\nPlease input a number in (2,8,16):\"); scanf(\"%d\ dtoo(m,k); }

void dtoo( int n ,int r ) { if(n>=r) dtoo(n/r,r); printf(\"%d\ }

8.预习下面程序,写出预习结果,上机验证并写出分析。 变量的作用范围

# define LOW 10 # define HIGH 5 # define CHANGE 2 int i = LOW ; #include void main( )

{ int workover ( int i ) , reset ( int i ); int i = HIGH ; reset ( i / 2) ;

printf(\" i = %d \\n \ reset ( i = i / 2) ;

printf(\" i = %d \\n \ reset ( i / 2) ;

printf(\" i = %d \\n \ workover ( i );

printf(\" i = %d \\n \ }

int workover ( int i )

{ i = ( i % i ) * (( i * i ) / ( 2 * i ) + 4) ; printf(\" i = %d \\n \ return ( i ); }

int reset ( int i )

{ i = i <= CHANGE ? HIGH : LOW ; return ( i ); }

相关知识:“变量用之不尽,一写就走”。在main()主函数中reset(i/2)和reset(i=i/2)不同,第一个reset的i没有被赋值到,所以该函数调用结束后还保持原来的值;而第二个reset的i被赋值了,所以函数调用结束后以前的值就没有。全局变量:在所函数外面定义的变量,其有效范围到整个源程序结尾;局部变量:在函数内部定义的变量或在函数头部定义的形参,其有效范围只在所定义的函数,局部变量具有“用之则建,用完则撤”的特点。在不同函数内定义的变量同名互不干扰。如果一个源程序中的局部变量和全局变量同名,则局部变量优先。

22

《C语言程序设计》实验指导书

9.上机调试下面程序,观察静态局部变量在调用过程中的变化。

#include void main( ) { int i ; int f(int);

for ( i = 1; i <= 5; i ++) printf( \"(%d):% d\\n\

printf(\" \\n\"); }

int f ( int n)

{ static int j = 1;

j = j * n; return( j ); } 相关知识:静态局部变量。如果希望在函数调用结束后仍然保留函数中定义的局部变量的值,则可以将该局部变量定义为静态局部变量(或称局部静态变量)。静态局部变量具有这样一些特点:①全局寿命:静态局部变量的数据存储在静态存储区的存储单元中,在函数调用结束后,它的值并不消失,直到整个应用程序执行结束,它的存储空间才被收回去。②局部可见性:其作用域只在定义它的函数内部,尽管它的值在函数调用结束后并不消失,但其他函数仍然不能访问它,在进入到它所在的函数内,它的值才可见。③初始化的特点:若在定义该局部变量时有赋初值的,则赋初值只在编译过程中进行,只赋值一次;若没有赋初值,则默认的初值为0(数值型)或空字符(字符型)。

10.预习下面程序,分析在程序运行前宏NUM的值,并上机运行,比较一下的预习结果和实际结果。

#include \"stdio.h\" #define N 2 #define M N+1

#define NUM (M+1)*M/2 main()

{ int i,n=0;

for (i=1; i<=NUM; i++) { n++ ; printf (\"%d\\n\ printf(\"\\n\"); }

11.分析下面程序的运行结果,上机验证。

#define POWER(x) ((x)*(x))

#define MAX(x,y) (x)>(y)?(x):(y) #define PR printf #include void main()

{ int a,b,c,d,x;

a=5;b=10;x=200; c=POWER(a+b); x=x/POWER(a+b);

23

《C语言程序设计》实验指导书

d=MAX(a+6,b);

PR( \" c=%d,d=%d,x=%d \\n\

}

三、实验重点、难点

1. 函数的定义

2. 函数的参数及返回值 3. 函数的调用

4. 数组作为函数参数 5. 局部变量和全局变量 6. 变量的存储类别 四、操作要点

设置断点的方法:

可以通过下述方法设置一个断点。首先把光标移动到需要设置断点的代码行上,然后按F9快捷键或者单击“编译”工具条上的按钮,断点处所在的程序行的左侧会出现一个红色圆点。选择主菜单“编译(Build)”中的“开始调试(Start Debug)”命令的下一级的“去(Go)”调试命令,或者单击“编译(Compile)”工具条上的 按钮,程序执行到第一个断点处程序将暂停执行,该断点处所在的程序行的左侧红色圆点上添加一个黄色箭头,此时,用户可方便地进行变量观察。继续执行该命令,程序运行到下一个相邻的断点。只需在代码处再次按F9或者单击“编译”工具条上的按钮。也可以打开“Breakpoints”对话框后,按照界面提示去掉断点。 五、注意事项

1. 所调用的函数在调用语句之后定义,但在调用之前没有说明 2. 误认为形参值的改变会影响实参的值 3. 函数的实参和形参类型不致。

实验六 指针

一、实验目的

1. 通过实验进一步掌握指针的概念,会定义和使用指针变量; 2. 能正确使用数组的指针和指向数组的指针变量;

3. 能正确使用字符串的指针和指向字符串的指针变量; 4. 能正确使用指向函数的指针变量;

5. 了解指向指针的指针的概念及其使用方法。 二、实验内容

编程序并上机调试运行程序(都要求用指针处理)。

1.上机验证以下程序的运行结果 #include void main() { int i,j,*pi,*pj; pi=&i; pj=&j; i=5; j=7;

printf(\"\\n%d\%d\%d\%d\

24

《C语言程序设计》实验指导书

printf(\"\\n%d\%d\%d\%d\

}

运行结果 : 5 7 -34 -32 -34 5 -32 7

相关知识:指针的值与指针指向的变量值的区别。在VC环境下,以上运行结果中的负数是另一个值。

2.上机验证以下程序的运行结果 #include void main()

{ int i,a[]={1,2,3},*p;

p=a;/*将数组a首地址赋给指针p*/ for (i=0;i<3;i++)

printf(\"%d,%d,%d,%d\\n\}

运行结果: 1,1,1,1 2,2,2,2 3,3,3,3

相关知识:①指针指向数组的方法;②指针表示数组元素的方法。③数组元素的多种表示方法。

3.调试下列程序,使之具有如下功能:用指针法输入12个数,然后按每行4个数输出。写出调试过程。 #include void main()

{ int j,a[12],*p=a; for(j=0;j<12;j++) scanf(\"%d\ p=a;

for(j=1;j<=12;j++) { printf(\"%4d\ if(j%4 == 0) printf(\"\\n\"); } }

相关知识:①调试时指针变量指向哪个目标变量;②区分指针的值和指针指向变量的值;③通过指针操作数组元素。

4.调试下列程序,使之具有如下功能:任意输入2个数,调用两个函数分别求: ⑴ 2个数的和, ⑵ 2个数交换值。 #include void main( )

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

void sum(int ,int ,int *);

25

《C语言程序设计》实验指导书

void swap(int * ,int * ); scanf(\"%d,%d\ sum(a,b,p); swap(&a,&b);

printf(\"sum=%d\\n\

printf(\"a=%d,b=%d\\n\}

void sum(int a,int b,int *c) { *c=a+b; }

void swap(int *a,int *b) { int *t; t=a; a=b; b=t; }

相关知识:①调试程序时注意参数传递的是数值还是地址。②指针作为参数;③利用指针得到多个返回值。

5.下面的程序是用来从键盘输入是个整数,然后求出其中的最小值。填写空缺部分。 #include int table[10];

void lookup(int *t,int *a,int n) { int k; *a=t[0];

for(k=1;kif( ) *a=t[k]; }

void main()

{ int k,min,*p=&min; for (k=0;k<10;k++) scanf(\"%d\lookup( , ,10); printf(\"min=%d\\n\}

相关知识:①用数组名加地址偏移量表示数组元素地址的方法;②数组名作为函数参数;③指针变量作为函数参数。

6.以下程序建立一个如下所示的二维数组,并按以下格式输出。请从对应的一组选择项中,选择正确的填入。

1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0

26

《C语言程序设计》实验指导书

1 0 0 0 1 #include void main()

{ int a[5][5]={0},*p[5],i,j; for(i=0;i<5;i++) p[i]= (1) ; for(i=0;i<5;i++)

{ *(p[i]+ (2) )=1; *(p[i]+5- (3) )=1; }

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

printf(\"%2d\ (4) ; } }

(1) A.&a[i][0] B.&a[i][1] C.&p[i] D.&a[0][i] (2) A.0 B.1 C.i D.(i+1) (3) A.0 B.1 C.i D.(i+1)

(4) A.putchar(\"\\n\"); B. putchar('\\n'); C. putchar(\\n); D.printf('\\n'); 相关知识:①二维数组与指针;②数组指针的概念和使用。

7.综合编程题:已知一个整型数组a[5],其各元素值为4,6,8,10,12。使用指针求该数组元素之积。

三、实验重点、难点

1. 指针的定义、引用 2. 指针与变量 3. 指针与数组 4. 指针与函数 四、操作要点

单击调试(Debug)工具条上的Watch按钮,就出现一个Watch窗口, 系统支持查看程序运行到当前指令语句时变量、表达式和内存的值。所有这些观察都必须是在断点中断的情况下进行。

观看变量的值最简单,当断点到达时,把光标移动到这个变量上,停留一会就可以看到变量的值。

五、注意事项

1. 不同类型的指针混用

2. 混淆数组与指针变量的区别

实验七 结构体和共用体

一、实验目的

1. 掌握结构体与共用体的使用方法。

2. 能够用结构体与共用体编写相应的程序。 二、实验内容

27

《C语言程序设计》实验指导书

编程序,然后上机调试运行。

1. 编写input( )和output( )函数,输入,输出5个学生的数据记录。 程序源代码如下: #define N 5 struct student { char num[6]; char name[8]; int score[4]; } stu[N]; input(stu)

struct student stu[]; { int i,j;

for(i=0;i{ printf(\"\\n please input %d of %d\\n\ printf(\"num: \");

scanf(\"%s\ printf(\"name: \");

scanf(\"%s\ for(j=0;j<3;j++)

{ printf(\"score %d.\

scanf(\"%d\ }

printf(\"\\n\"); } }

print(stu)

struct student stu[]; { int i,j;

printf(\"\\nNo. Name Sco1 Sco2 Sco3\\n\"); for(i=0;i{ printf(\"%-6s%-10s\ for(j=0;j<3;j++)

printf(\"%-8d\ printf(\"\\n\"); } }

main() {

input(); print(); }

运行结果:

28

《C语言程序设计》实验指导书

2. 有5个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入5个学生数据,要求打印出3门课总平均成绩,以及及最高分的学生的数据(包括学号、姓名、3门课的成绩、平均分数)。 程序源代码如下: #define N 5 struct student { char num[ 6 ]; char name[ 8 ]; int score[ 4 ]; float avr; } stu[N]; main()

{ int i,j,max,maxi,sum; float average;

for(i=0;i{ printf(\"\\n please input %d of %d\\n\ printf(\"num: \");

scanf(\"%s\ printf(\"name: \");

scanf(\"%s\ for(j=0;j<3;j++)

{ printf(\"score %d.\

scanf(\"%d\ }

printf(\"\\n\"); }

average=0; max=0; maxi=0;

for( i=0; isum = 0;

for( j=0; j<3; j++ )

sum+=stu[ i ].score[ j ] stu[ i ].avr=sum / 3.0; average+= stu[ i ].avr;

if( sum > max ) { max=sum; maxi=i; } }

average/=N;

printf(\"\\nNo. Name Sco1 Sco2 Sco3 average\\n\"); for(i=0; i{ printf(\"%-8s%-10s\ for( j=0; j<3; j++ )

/*print*/ 29

《C语言程序设计》实验指导书

printf (\"%-8d\ printf (\" %6.2f \\n \}

printf (\"average is %5.2f\\n\

printf (\"The best student is %s, total score is %d.\}

运行结果:

3. 上机验证以下程序的运行结果,并对结果进行分析。 #include \"stdio.h\" main() {

union{int x; char c;

struct{int a;int b;}s; }u; u.s.a=9; u.s.b=10;

u.c=u.s.a*u.s.b; u.x=u.s.a+u.s.b;

printf(\"u.x=%d u.c=%c\\

printf(\"u.s.a=%d u.s.b=%d\ }

运行结果: 分析:

三、实验重点、难点

结构体变量的定义和引用;结构体变量与指针 四、操作要点

结构体名(struct)用于标识一种新的数据类型,即结构体类型。注意区分结构体类型与基本数据类型的不同,它是复合数据类型。结构体成员变量与普通变量的定义一样,它还可以是结构体变量。 五、注意事项

混淆结构体类型与结构体变量的区别。

30

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

Copyright © 2019- shangjiatang.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务