C语言程序设计实验教案_第1页
C语言程序设计实验教案_第2页
C语言程序设计实验教案_第3页
C语言程序设计实验教案_第4页
C语言程序设计实验教案_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 高级语言程序设计实验指导书 实验一 顺序结构程序设计一、实验目的及要求1. 掌握C语言中使用最多的一种语句赋值语句的使用方法。2. 掌握各种类型数据的输入输出的方法,能正确使用各种格式转换符。二、实验学时4学时三、实验任务1.以下程序多处有错。要按下面指定的形式输入数据和输出数据时,请对该程序做相应的修改。#include <stdio.h>void main ( ) double a,b,c,s,v; printf(input a,b,c:n); scanf("%d%d%d",a,b,c);s=a*b;v=a*b*c;printf("%d %d %

2、d",a,b,c);printf("s=%fn",s,"v=%dn",v);当程序执行时,屏幕的显示和要求输入形式如下: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)有时程序中一个错误会引发一系列错误信息,工作中不应被这种情况所迷惑,改正了一些错误后应及时对源程序重新进行编译;b)如果修改错误时增删了行,或是

3、一个行里有多个错误,更正前面错误时增删了字符,就可能导致系统对错误定位不准,此时应该重新编译;c)系统给出的警告信息一般都说明程序中有问题,因为系统发现了可疑情况。对于警告信息同样要逐个仔细分析。除非明确认定不是问题,否则绝不能简单地认为不是错误而不予理睬。实际上,很多警告都是因为程序中确实有严重的隐含错误。d) 在连接中发现新错误也需要仔细检查和修改程序。连接时发现的错误一般是由于函数名或外部变量名字写错,或者一些函数、外部变量没有定义引起的。系统不能对连接错误给以自动定位,只能提供有关的名字信息等。对于这类问题,可以借助编辑器的字符串查找命令进行定位。 正确调用scanf函数和printf

4、函数构成输入和输出语句。2.有以下程序 #include <stdio.h> void main() char c1,c2; int n1,n2; c1=getchar();c2=getchar();n1=c1-'0'n2= n1*10+(c2-'0'); printf("%dn",n2);程序运行时输入:12<回车>,执行后输出结果是什么?相关知识:getchar()函数用来输入两个字符分别赋给变量c1和c2;n1=c1-'0'相当于n1='1' -'0',字符1的AS

5、CII码值比0大一,所以n1中的值为1,c2-'0'相当于'2' -'0';把字符串转换为多位数的算法。3.若有以下程序#include <stdio.h>void main() int i,j; int x,y; scanf("i=%d,j=%d",&i,&j); scanf("%d%d",&x,&y); printf("i=%d,j=%dn",i,j); printf("%4d%4dn",x,y);要求给i赋值为10,j

6、赋值为20,则应该怎样从键盘输入数字?相关知识:在调用scanf()函数时在格式串中若包含有格式描述符之外的字符时,则要求在输入数据时在对应的位置上输入完全匹配的字符;scanf()函数只包含格式描述符时可用跳格键Tab、空格和回车分隔数据;在调用printf ()函数时在格式串中若包含有格式描述符之外的字符时,则在输出数据时在对应的位置上输出完全匹配的字符,%d之类的格式符位置输出对应输出项的值;故输出时要注意插入适当的非格式符以便区分各个输出结果。4. 计算定期存款本利之和设银行定期存款的年利率rate为2.25%,并已知存款期为n年,存款本金为capital元,试编程计算n年后的本利之和

7、deposit。要求定期存款的年利率rate、存款期n和存款本金capital均由键盘输入。四、实验重点、难点1. 符数据输入输出函数2. 格式输入输出函数五、操作要点按Alt+R可进入Run菜单, 其中Run:运行由Project/Project name项指定的文件名或当前编辑区的文件。如果对上次编译后的源代码未做过修改, 则直接运行到下一个断点(没有断点则运行到结束)。否则先进行编译、连接后才运行, 其热键为Ctrl+F9。User screen:显示程序运行时在屏幕上显示的结果。其热键为Alt+F5。六、注意事项1. 输入输出的数据类型与所用格式说明符不一致2. 输入变量时忘记使用地址

8、符号实验二 逻辑结构程序设计一、实验目的及要求1. 了解C语言表示逻辑量的方法(以0代表“假”,以非代表“真” )。2. 学会正确使用逻辑运算符和逻辑表达。3. 熟练掌握if语句和switch语句.4. 学习调试程序。二、实验学时6学时三、实验任务1 源程序中包含有一些错误,调试下列程序,使之具有如下功能:输入a、b、c三个整数,求最小值。# include “stdio.h” void main( )            int a,b,c;  

9、60;          scanf("%d%d%d",a,b,c);             if(a>b)&&(a>c)               if(b<c

10、)                 printf("min=%dn",b);               else             

11、     printf("min=%dn",c);             if(a<b)&&(a<c)               printf("min=%dn",a);  &#

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

13、      scanf("%d%d%d",&a,&b,&c);      if(a<b)&&(a<c)         printf("min=%dn",a)      else if(b<a)&&(b<c)   

14、60;     printf("min=%dn",b);      else if(c<a)&&(c<b)         printf("min=%dn",c);      else         printf("No

15、 find minimumn");     上述程序是按在三个数中仅有一个最小值时才称其为最小值进行设计的。另外,注意程序的书写格式,一定要采用缩进格式,即不同层次(分支)的语句左起的空格不同,这样可以有效地提高程序的可读性。相关知识:类似a<b<c表达式的表示方法;if语句的嵌套;调试工具的使用。求最值的简单算法。2.参考上一题,编写一个C程序,求a、b、c、d四个数中的最大者。编程点拨:多定义一个变量,并一开始令变量max=a;if(max<b) max=b;其余多个数据中求最值依此类推。3.输入4个整数,要求按由小到大顺

16、序输出。得到正确结果后,修改程序使之按由大到小顺序输出。相关知识:输入函数scanf()的使用;简单的排序算法;通过中间变量t交换a和b值的方法:t=a; a=b; b=t;。4.根据以下函数关系,对输入的每个x值,计算出相应的y值。当x取其他值时#include #include void main() float x,y; scanf("%f",&x); if ( ) y= ; else if( )y= ; else printf("x=%f,y=%f",x,y); 相关知识点:if语句的嵌套;数学函数的调用方式。5模仿第4题,写程序实现以下

17、函数: 用scanf函数输入x的值,求y值。运行程序,输入x的值(分别为x<1、1x<10、x10三种情况),检查输出的y值是否正确。相关知识:用if的嵌套实现分段函数;比较运算符的正确使用;算术运算符*的正确使用。6.阅读分析以下程序的功能。#include <stdio.h>void main( )int choice;int value;printf("Convert:n"); /* 显示菜单 */printf(" 1:decimal to hexadecimaln ");printf(" 2:hexadecima

18、l to decimaln ");printf(" 3:decimal to octaln "); printf(" 4:octal to decimaln");printf("enter your choice: ");scanf("%d",&choice);switch (choice) case 1: /* 选中1时处理 */printf("enter decimal value:");scanf("%d",&value);printf(&qu

19、ot;%d in hexadecimal is:%xn",value,value);break;case 2: /* 选中2时处理 */printf("enter hexadecimal value:");scanf("%x",&value);printf("%x in decimal is:%dn",value,value);break;case 3: /* 选中3时处理 */printf("enter decimal value:");scanf("%d",&val

20、ue);printf("%d in octal is:%on",value,value);break;case 4: /* 选中4时处理 */printf("enter octal value:");scanf("%o",&value);printf("%o in decimal is:%dn",value,value);break; 相关知识:用switch语句实现菜单的方法;数制转换的方法。7. 模仿第6题,要求对输入的数字17转换成文字星期几,对其它数字不转换。例如,输入5时,程序应该输出Friday

21、。 编辑、调试和运行该程序,然后输入4。其输出结果是什么?为什么是这样的结果? 该程序有哪些错误?如何修改?相关知识:switch语句的正确使用;break在switch语句中的作用。四、实验重点、难点1. 表达式2. 选择型程序设计语句3. 逻辑表达式五、操作要点按Alt+C可进入Compile菜单, Build all:重新编译项目里的所有文件, 并进行装配生成.EXE文件。该命令不作过时检查 。六、注意事项1. 误把“=”作为关系运算符“等于”2. 没有注意大写字母和小写字母代表不同的标识符3. 当一个复合语句中使用多层括号时,常出现大括号不配对的现象。实验三 循环控制一、实验

22、目的及要求1. 熟悉掌握用语句,语句和语句实现循环的方法。2. 掌握在程序设计中用循环的方法实现一些常用算法(如穷举、迭代、递推等)。二、实验学时6学时三、实验任务1. 下面程序求1+100,填空,实现该功能。#include <stdio.h>void main()int s,i;s=0; /* 第5行 */for( )s=s+i;printf("1+.+100=%dn",s);思考:(1)第5行能不能去掉?其作用是什么?(2)不用for语句,用while语句改写该程序,实现同样的功能。2. 比较下列两个程序。(验证)#include <stdio.h&

23、gt;void main() int i,n,sum=0;scanf("%d",&i);n=i;while(i<=10) sum+=i;i+;printf("%d+.+10=%d",n,sum);#include <stdio.h>void main() int i,n,sum=0;scanf("%d",&i);n=i;do sum+=i;i+; while(i<=10);printf("%d+.+10=%d",n,sum);分别运行这两题,若输入7,这两个程序的结果分别是多

24、少?若输入12,这两个程序的结果又分别是多少?比较为什么会有这样的区别?3. 预习下面程序,若输入12345,分析输出结果是多少?上机验证。#include <stdio.h>void main( ) long data; scanf("%ld",&data); while(data) printf("%ld,",data%10); data=data/10; 4. 下面程序实现求Fibonacci数列的前n个数。(验证、调试)运行程序,写出运行结果;采用单步跟踪技术运行该程序,观察一下变量的变化。#include <stdio

25、.h>void main( ) long int f1, f2; int i,n; printf("Input n:"); /* 第5行 */ scanf("%d",&n); /* 第6行 */f1=f2=1;for(i=1;i<n;i+) printf("%ldt%ldn",f1,f2); /* 第9行 */f1=f1+f2;f2=f2+f1; 思考:(1)f1、f2这两个变量为什么定义为long int 型?(2)第5行和第6行的相互作用,你会用这种方式来实现输入吗?(3)注意第9行的输出“%ld”中的“1”是

26、字母“L”的小写形式,不是数字1。5. 预习下面程序,写出预习结果并上机验证。(验证)#include <stdio.h>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=%dn", x); 思考:用一句话概括if(j%2)语句的作用。相关知识:嵌套for循环的执行过程及continue语句的作用。6.下面程序输入一批考试分数,用-1作为结束标志,若输入大于100分,则提示重新输入,然后计算最高分、最低分与平均

27、分。请调试、检查程序中的错误,并改正之。#include <stdio.h>void main( ) int mark; int n=0 ; sum=0 ; int max=100 ; min=0 ; for ( ; ; ) ; scanf("%d", &mark); if ( mark > 100 ) printf(" Mark > 100 , Please reinput n "); break; if ( mark=-1) break; n + ; sum=sum + mark ; if( mark > max

28、 ) max = mark ; if( mark < min ) min = mark ; sum=sum/ n ; printf("max =%d , min = %d, aver = %d n", max , min , sum); 提示:该程序有很多错误,下面给出某些错误的说明。当求一批数中的最大值时,若已知一批数的最小值,则将这个最小值作为最大值的初始值;当求最小值时,情况相反,即若已知这批数的最大值,则将这个最大值作为最小值的初始值。本例中求一批分数的最高分,则最高分的初始值应该设为0,然后在程序循环中逐渐地升高,直至求出最高分;本例中还要求这批分数的最低分

29、,则最低分的初始值设为100,然后在程序循环中逐渐地降低,直至求出最小值。实现“若输入大于100分,则提示重新输入”功能的语句有错;实现“用-1作为结束标志”功能的语句有错。思考:(1)“一批数据”是几个数据?输入的数据如何结束?程序中哪一行是实现结束这个要求的,写出该语句。(2)程序中哪个语句是实现”若输入大于100分,则提示重新输入”这个要求的,写出该语句。(3)写出您的测试数据及运行结果,注意输入的数据序列中最后一个应是-1。7.编程:输入20个190的整数,分类统计130、3160、6190的数各有多少个? 编程点拨:(1) count1计130的个数,count2计3160的个数,c

30、ount3计6190的个数。(2) 用for循环20次实现该程序的功能:输入一个整数x,判断该数所在的范围,若x是130,则count1加1;若x是3160,则count2加1;若x是6190,则count3加1。 (3) 最后,输出统计的结果。#include <stdio.h>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); /*补充完成程序*/* 输出统计结果 */补充完成该

31、程序。8.编程:素数是除了1和其本身以外,不能被其他自然数整除的自然数。从键盘输入一个数,判断该数是不是素数? 编程点拨:a) 输入这个数x。b) 用for循环2x-1,用2x-1的每一个数去除x,若有一个数整除x,则说明x不是素数;否则,x就是素数。c) 最后,将判断结果输出。#include <stdlib.h>void main( ) int i, x;printf("Enter one natural integer: ");scanf("%d ",&x);for(i=2;i<x-1;i+) /*补充完成该程序*/思考:

32、其实,只需要判断2之间的整数能否整除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) 利用一个循环,对100999

33、范围内的每个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是行号。四、实验重点、难点1. 循环语句2. 循环的嵌套3. break和con

34、tinue语句五、操作要点Run菜单中Go to cursor::调试程序时使用, 选择该项可使程序运行到光标所在行。光标所在行必须为一条可执行语句, 否则提示错误。其热键为F4。Trace into:在执行一条调用其它用户定义的子函数时, 若用Trace into项, 则执行长条将跟踪到该子函数内部去执行, 其热键为F7。六、注意事项1. 对应该有花括号的复合语句,忘记加花括号2. 在不该加分号的地方加了分号3. 引用数组元素时误用圆括号4. 引用数组元素超界5. 对二维或多维数组定义和引用的方式不对6. 误以为数组名代表整个数组7. 混淆字符数组与字符指针的区别实验四 数组一、实验目的及要

35、求1. 掌握一维数组和二维数组的定义、赋值和输入输出的方法;2. 掌握字符数组和字符串函数的使用;3. 掌握与数组有关的算法(特别是排序算法)。二、实验学时6学时三、实验任务1.调试下列程序,使之具有如下功能:输入10个整数,按每行3个数输出这些整数,最后输出10个整数的平均值。写出调试过程。#inclue <stdio.h>#define N 10void main( ) int i,aN,av;for(i=0;i<N;i+)      scanf("%d",ai);   &

36、#160; for(i=0;i<N;i+)         printf("%d",ai);           if(i%3=0)             printf("n");     &

37、#160;         for(i=0;i!=N;i+)         av+=ai;      printf("av=%fn",av);  上面给出的程序是完全可以运行的,但是运行结果是完全错误的。调试时请注意数组元素的输入问题、输出格式问题等。请使用前面实验所掌握的调试工具,判断程序中的错误并改正。相关知识:

38、数组元素值的输入;求和求平均值的相关变量初始化问题;输出格式符的正确使用。数组元素的格式化输出。2.下面程序是输入5个数据,然后求它们的和并输出结果。#include <stdio.h>void main( )int i, a5, sum = 0; scanf("%d,%d,%d,%d,%d", a ); for (i = 0; i <= 4; i +) sum += ai; printf("sum = %d n", sum);该程序中有哪些错误?如何修改?写出正确运行后的结果。相关知识:数组元素的输入和输出只能逐个元素操作,而不能以数

39、组名作整体操作。3.有一个3行4列的距阵,现要求编程求出其中最大的那个元素的值,以及它所在的行号与列号。下面程序的初始说明和输出语句如下所示,请补充完成该程序。#include <stdio.h>void main( )int i, j, row, colum, max;static int a34 = 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循环的双重循环逐行把

40、元素值与max值进行比较,比较结果如果元素值比max值大,则改变max值,同时改变row和colum的值。最后输出max,row和colum的值。相关知识:二维数组的定义和初始化;使用二重循环对二维数组元素的访问;求最值时相关变量初值的设定。4.数组中已存互不相同的10个整数,从键盘输入一个整数,输出与该值相同的数组元素下标。 编程点拨:输入要查找的变量x的值;使用循环将输入的数和数组元素逐个进行比较,若找到,则提前退出循环;根据循环是正常结束还是提前结束来判断是否找到x。部分源代码:#include <stdio.h>void main( ) int i, x, a10=1,2,

41、3,4,5,6,7,8,9,10; /*输入x变量的值 */ for ( i=0; i<10; i+ ) printf("%4d",ai); printf("n"); /* 循环查找与x相等的元素 */if ( ) printf("%dn",i); /* 输出查找结论 ,输出下标值 */else printf("Not found %dn",x);5.编写程序,任意输入10个整数的数列,先将整数按照从大到小的顺序进行排序,然后输入一个整数插入到数列中,使数列保持从大到小的顺序。编程点拨:定义数组时多开辟一个存

42、储单元;找合适的插入位置; 20 18 16 14 12 10 8 6 4 2a0123456789下标=10k15找合适的插入位置:j=3j=3j=0 aj k? 即20 15 ? 是 j+j=1 aj k? 即18 15 ? 是 j+j=2 aj k? 即16 15 ? 是 j+j=3 aj k? 即14 15 ? 不是,结束循环while( aj>=k && j<10 ) j+;找不到比k小的元素时也要退出循环 向右移动插入点后的元素;先把a9移到a10,a8移到a9,ai移到ai+1,直到把aj移到aj+1,即:i=j停止移动元素。 for(i=9;i>

43、;=j;i- ) ai+1=ai; 20 18 16 14 12 10 8 6 4 2a0123456789下标=10k15插入。部分源代码:#include <stdio.h>#define N 11void main() int i,j,aN; printf(“Please input 10 numbers:”); for (i=0; i<N-1; i+) scanf(“%d”,&ai); /*乱序输入10个整数*/ 相关知识:比较排序法、选择排序法和冒泡排序法;数据元素的插入。6.输入十个互不相同的整数并存在数组中,找出最大元素,并删除。 编程点拨:求最大值所在

44、元素下标:不必用max记住最大值,只要用k记住最大值所在的元素下标;删除最大值:从最大值开始将其后面元素依次前移一个位置。 2 8 16 14 1 10 8 16 4 20 6a0123456789下标=10部分源代码:k=0;if ( ak<a1 ) 真k=0; for ( i=1; i<10; i+ ) if ( ak<ai ) k=i;k=1; 执行if ( ak<a2 ) 假k=2; 不执行if ( ak<a3 ) 真k=3; 执行相关知识:删除数组元素的概念;移动数组元素的算法;求最大值位置的算法。7. 以下程序的功能是:从键盘上输入若干个学生的成绩,统

45、计计算出平均成绩,并输出低于平均分的学生成绩,用输入负数结束输入。请填空:#include <stdio.h>void main( ) float x1000, sum=0.0, ave, a; int n=0, i; printf ("Enter mark : n") ; scanf("%f", &a); while (a>=0.0 && n<1000) sum+= ; xn= ; n+; scanf("%f", &a); ave= ; printf ("Output

46、 : n"); printf ("ave = %fn", ave); for (i=0; i<n; i+) if ( ) printf("%fn", xi);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两个数

47、组中。然后把较短的字符串放在a数组,较长的字符串放在b数组。并输出。#include <stdio.h>#include <string.h> void main() char a10,b10; int c,d,k,ch; scanf("%s",&a); scanf("%s",&b); printf("a=%s,b=%sn",a,b); c=strlen(a); d=strlen(b); if(c>d) for(k=0;k<d;k+) ch=ak;ak=bk;bk=ch; print

48、f("a=%sn",a); printf("b=%sn",b); 相关知识:程序中的strlen()是库函数,功能是求字符串的长度,它的原型保存在头文件"string.h"中。调试时注意库函数的调用方法,不同的字符串输入方法,通过错误提示发现程序中的错误。10.阅读下面的程序,然后回答后面的问题:#include <stdio.h>#include <string.h> void main( ) char s180, s240; int i = 0, j = 0; printf(" n Please input string1:"); scanf("%s", s1); printf(" n Please input string2:"); scanf("%s", s2); while (s1i!= '0' )i+; while (s2j!= '0' )s1i+=s2j +; s1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论