1、20112012 学年 第 2 学期高级语言程序设计实验教案教 学 院 ( 部 ) 计算机学院 教 研 室 基础教研室 授 课 班 级 授 课 教 师 职 称 职 务 教 材 名 称 C 程序设计 谭浩强主编 2012 年 2 月 11 日1实验一 顺序结构程序设计一、实验目的及要求1. 掌握 C 语言中使用最多的一种语句赋值语句的使用方法。2. 掌握各种类型数据的输入输出的方法,能正确使用各种格式转换符。二、实验学时4学时三、实验任务1.以下 c30101.c 程序多处有错。要按下面指定的形式输入数据和输出数据时,请对该程序做相应的修改。#include void main ( ) doub
2、le 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 %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)有时程序中一个错误会引发一系列错误信息,工
3、作中不应被这种情况所迷惑,改正了一些错误后应及时对源程序重新进行编译;b)如果修改错误时增删了行,或是一个行里有多个错误,更正前面错误时增删了字符,就可能导致系统对错误定位不准,此时应该重新编译;c)系统给出的警告信息一般都说明程序中有问题,因为系统发现了可疑情况。对于警告信息同样要逐个仔细分析。除非明确认定不是问题,否则绝不能简单地认为不是错误而不予理睬。实际上,很多警告都是因为程序中确实有严重的隐含错误。d) 在连接中发现新错误也需要仔细检查和修改程序。连接时发现的错误一般是由于函数名或外部变量名字写错,或者一些函数、外部变量没有定义引起的。系统不能对连接错误给以自动定位,只能提供有关的名
4、字信息等。对于这类问题,可以借助编辑器的字符串查找命令进行定位。 正确调用 scanf 函数和 printf 函数构成输入和输出语句。2.有以下 c30102.c 程序#include 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 的 ASCII 码值比 0 大一,所以
5、n1 中的值为 1,c2-20相当于2 -0;把字符串转换为多位数的算法。3.若有以下 c30103.c 程序#include void main() int i,j;int x,y;scanf(“i=%d,j=%d“,scanf(“%d%d“,printf(“i=%d,j=%dn“,i,j);printf(“%4d%4dn“,x,y);要求给 i 赋值为 10,j 赋值为 20,则应该怎样从键盘输入数字?相关知识:在调用 scanf()函数时在格式串中若包含有格式描述符之外的字符时,则要求在输入数据时在对应的位置上输入完全匹配的字符;scanf()函数只包含格式描述符时可用跳格键 Tab、空
6、格和回车分隔数据;在调用 printf ()函数时在格式串中若包含有格式描述符之外的字符时,则在输出数据时在对应的位置上输出完全匹配的字符,%d 之类的格式符位置输出对应输出项的值;故输出时要注意插入适当的非格式符以便区分各个输出结果。4. 计算定期存款本利之和设银行定期存款的年利率 rate 为 2.25%,并已知存款期为 n 年,存款本金为 capital 元,试编程计算 n 年后的本利之和 deposit。要求定期存款的年利率 rate、存款期 n 和存款本金capital 均由键盘输入。四、实验重点、难点1. 符数据输入输出函数2. 格式输入输出函数五、操作要点按 Alt+R 可进入
7、Run 菜单, 其中 Run:运行由 Project/Project name 项指定的文件名或当前编辑区的文件。如果对上次编译后的源代码未做过修改, 则直接运行到下一个断点( 没有断点则运行到结束)。否则先进行编译、连接后才运行 , 其热键为 Ctrl+F9。User screen:显示程序运行时在屏幕上显示的结果。其热键为 Alt+F5。六、注意事项1. 输入输出的数据类型与所用格式说明符不一致2. 输入变量时忘记使用地址符号实验二 逻辑结构程序设计一、实验目的及要求1. 了解 C 语言表示逻辑量的方法(以 0 代表“假” ,以非代表“真” ) 。2. 学会正确使用逻辑运算符和逻辑表达。3
8、. 熟练掌握 if 语句和 switch 语句.4. 学习调试程序。二、实验学时6 学时三、实验任务1 源程序 c30105.c 中包含有一些错误,调试下列程序,使之具有如下功能:输入a、b、c 三个整数,求最小值。# include “stdio.h”void main( )3 int a,b,c;scanf(“%d%d%d“,a,b,c);if(ab)scanf(“%d%d%d“,int value;printf(“Convert:n“); /* 显示菜单 */printf(“ 1:decimal to hexadecimaln “);printf(“ 2:hexadecimal to d
9、ecimaln “);printf(“ 3:decimal to octaln “); printf(“ 4:octal to decimaln“);printf(“enter your choice: “);scanf(“%d“,switch (choice)case 1: /* 选中 1 时处理 */printf(“enter decimal value:“);scanf(“%d“,printf(“%d in hexadecimal is:%xn“,value,value);break;case 2: /* 选中 2 时处理 */printf(“enter hexadecimal valu
10、e:“);scanf(“%x“,printf(“%x in decimal is:%dn“,value,value);break;case 3: /* 选中 3 时处理 */printf(“enter decimal value:“);scanf(“%d“,printf(“%d in octal is:%on“,value,value);break;case 4: /* 选中 4 时处理 */printf(“enter octal value:“);scanf(“%o“,printf(“%o in decimal is:%dn“,value,value);break;相关知识:用 switch
11、 语句实现菜单的方法;数制转换的方法。7. 模仿第 6 题, ,要求对输入的数字 17 转换成文字星期几,对其它数字不转换。例5如,输入 5 时,程序应该输出 Friday。 编辑、调试和运行该程序,然后输入 4。其输出结果是什么?为什么是这样的结果? 该程序有哪些错误?如何修改?相关知识:switch 语句的正确使用;break 在 switch 语句中的作用。四、实验重点、难点1. 表达式2. 选择型程序设计语句3. 逻辑表达式五、操作要点按 Alt+C 可进入 Compile 菜单, Build all:重新编译项目里的所有文件, 并进行装配生成.EXE 文件。该命令不作过时检查 。六、
12、注意事项1. 误把“=”作为关系运算符“ 等于”2. 没有注意大写字母和小写字母代表不同的标识符3. 当一个复合语句中使用多层括号时,常出现大括号不配对的现象。实验三 循环控制一、实验目的及要求1. 熟悉掌握用语句,语句和语句实现循环的方法。2. 掌握在程序设计中用循环的方法实现一些常用算法(如穷举、迭代、递推等) 。二、实验学时6 学时三、实验任务1. 程序 c40101.c 求 1+100,填空,实现该功能。#include void main()int s,i;s=0; /* 第 5 行 */for( )s=s+i;printf(“1+.+100=%dn“,s);思考:(1)第 5 行能
13、不能去掉?其作用是什么?(2)不用 for 语句,用 while 语句改写该程序,实现同样的功能。2. 比较下列两个程序。 (验证)/* c40102_1.c */#include void main() int i,n,sum=0;scanf(“%d“,n=i;while(ivoid main() int i,n,sum=0;scanf(“%d“,n=i;do sum+=i;i+; while(ivoid main( ) long data; scanf(“%ld“, while(data) printf(“%ld,“,data%10); data=data/10;4. 程序 c40104.
14、c 实现求 Fibonacci 数列的前 n 个数。 (验证、调试)32121Fnn或运行程序,写出运行结果;采用单步跟踪技术运行该程序,观察一下变量的变化。#include void main( ) long int f1, f2; int i,n; printf(“Input n:“); /* 第 5 行 */ scanf(“%d“, /* 第 6 行 */f1=f2=1;for(i=1;ivoid main( ) int i,j,x;for(i=0,x=0;ivoid main( ) int mark;int n=0 ; sum=0 ;int max=100 ; min=0 ;for (
15、 ; ; ) ; scanf(“%d“, if ( mark 100 ) printf(“ Mark 100 , Please reinput n “);break; if ( mark=-1)break;n + ;sum=sum + mark ;if( mark max )max = mark ;if( mark void main( )8 int count1=0,count2=0,count3=0;int i,x;printf(“Please input 20 numbers:”);for(i=0;ivoid main( ) int i, x;printf(“Enter one natu
16、ral integer: “);scanf(“%d “,for(i=2;i#define N 10void main( ) int i,aN,av;for(i=0; ivoid main( )int i, a5, sum = 0;scanf(“%d,%d,%d,%d,%d“, a );for (i = 0; i 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, col
17、um);编程点拨: 初始化 row、colum 及 max。 使用 for 循环的双重循环逐行把元素值与 max 值进行比较,比较结果如果元素值比 max 值大,则改变 max 值,同时改变 row 和 colum 的值。最后输出 max,row 和 colum 的值。相关知识:二维数组的定义和初始化; 使用二重循环对二维数组元素的访问;求最值时相关变量初值的设定。4.数组中已存互不相同的 10 个整数,从键盘输入一个整数,输出与该值相同的数组元素下标。 编程点拨:输入要查找的变量 x 的值;使用循环将输入的数和数组元素逐个进行比较,若找到,则提前退出循环;根据循环是正常结束还是提前结束来判断
18、是否找到 x。c50104.c 部分源代码:#include void main( ) int i, x, a10=1,2,3,4,5,6,7,8,9,10;/*输入 x 变量的值 */for ( i=0; i=k i- ) ai+1=ai;20 18 16 14 12 10 8 6 4 2a0 1 2 3 4 5 6 7 8 9下标= 10k 15插入。c50105.c 部分源代码:#include #define N 11void main() int i,j,aN;printf(“Please input 10 numbers:”);for (i=0; ivoid main( ) flo
19、at x1000, sum=0.0, ave, a;int n=0, i;printf (“Enter mark : n“) ;scanf(“%f“, while (a=0.0 int c,d,k,ch;scanf(“%s“,scanf(“%s“, printf(“a=%s,b=%sn“,a,b);c=strlen(a);d=strlen(b);if(cd)for(k=0;k#include void main( ) char s180, s240;int i = 0, j = 0;printf(“ n Please input string1:“);scanf(“%s“, s1);print
20、f(“ n Please input string2:“);scanf(“%s“, s2);while (s1i!= 0 )i+;while (s2j!= 0 )s1i+=s2j +;s1i= 0;printf(“n New string: %s“, s1);编辑、运行该程序,然后分别输入 Country 和 side。请问: 程序执行的结果是什么? 该程序的功能是什么? 相关知识: 串结束符0; 自编写库函数。11.填空完成 c50203.c 程序,使其功能是对从键盘上输入的两个字符串进行比较,然后输出两个字符串中第一个不相同字符的 ASCII 码之差。例如:输入的两个字符串分别为abcde
21、fg 和 abceef,则输出为-1 。程序如下:#include void main ( ) char str1100,str2100;int i,s;printf(“n Input string 1:n“);gets(str1);printf(“n Input string 2:n”);gets(str2);i= (1) ;while(str1i=str2i)s= (3) ;printf(“%dn“,s);12.填空完成 c50204.c 程序,使其的功能是统计从终端输入字符中每个大写字母的个数。14用#号作为输入结束标志。程序如下:#include #include void main
22、( ) int num26,i; char c;for (i=0;ivoid 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=%dn“,x,y,z);void fun(int i, int j, int k) int t;t=(i+j+k)*2;printf(“t=%dn“,t);2. 阅读 c60102.c 程序,注意在调试时 F11 和 F10 的区别,还要注意函数调用过程中形参、实参的关系。#include void main() int x=10,y=20;vo
23、id swap (int ,int);printf(“(1)in main :x=%d,y=%dn“,x,y);swap(x,y);printf(“(4)in main :x=%d,y=%dn“,x,y);void swap (int m,int n) int temp;printf(“(2)in main :m=%d,n=%dn“,m,n);temp=m;m=n;n=temp;printf(“(3)in main :m=%d,n=%dn“,m,n);把用户自定义函数 swap()中的形式参数 m 和 n 对应改成 x 和 y,使其与实参变量同名,再用 F7 跟踪程序的运行,看看有什么变化。相
24、关知识: 形参具有 “用之则建,用完则撤 ”的特点。 在函数定义时,函数名后面圆括号内的参数称为形参;在函数调用时,函数名后面圆括号内的参数称为实参。对于实参,在调用函数中对其进行定义时,不仅指明它的类型,而且系统还为其分配存储单元。而对于形参,定义时仅仅只是指明它的类型,并不在内存中为它们分配存储单元,只是在调用时才为其分配临时存储单元,函数执行结束,返回调用函数时,该存储单元立即撤销。3. 程序 c60103.c 是实现求素数的,请填空完成该程序,并上机运行测试。#include #include void main() int m; /* 申明求素数函数 */printf(“Please
25、 input a data m=:“);scanf(“%d“,; /* 调用求素数函数 */16void prime(int n) int i,k;k=sqrt(n);for(i=2;i=k+1)printf(“This is a prime number“);else printf(“This isnt a prime number“);4. 程序 c60104.c 的功能是从键盘上输入的若干个数并求出最大值。请填空完成该程序。#include void main( ) int i;int s10, max;/* Findmax()函数的申明 */;printf(“Input 10 numb
26、er : n“);/* 输入 10 个数据到 s 数组中 */;/* 调用 Findmax 函数 */;for (i=0;ivoid main( ) int i , k;float s100, j ;printf(“ Input number : n“);for (i=0; scanf(“%f“, i+)si=j;sort(s, i);for (k=0; kvoid main( ) int m, k;void dtoo( int n ,int r );printf(“Pleae input the decimal number:“);scanf(“%d“,printf( “nPlease in
27、put 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“,n%r); 8.预习 c60201.c 程序,写出预习结果,上机验证并写出分析。变量的作用范围# define LOW 10# define HIGH 5# define CHANGE 2int i = LOW ;#include void main( ) int workover ( int i ) , reset ( int i );int i = HIGH ;reset ( i
28、 / 2) ;printf(“ i = %d n “, i );reset ( i = i / 2) ;printf(“ i = %d n “, i );reset ( i / 2) ;printf(“ i = %d n “, i );workover ( i );printf(“ i = %d n “, i ); int workover ( int i ) i = ( i % i ) * ( i * i ) / ( 2 * i ) + 4) ;printf(“ i = %d n “, i );return ( i );18int reset ( int i ) i = i void mai
29、n( ) int i ; int f(int);for ( i = 1; i (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);19x=x/POWER(a+b);d=MAX(a+6,b);PR( “ c=%d,d=%d,x=%d n“, c,d,x);12.编写:输入 10 个学生的 3 门课的成绩,分别用函数求:(1)每个学生的平均分。(2)每门课的平均分。(3)按学生平均分降序排列输出学生信息。(4)统计不及格学生,输出其相应信息。(5)编写一菜单主函数,菜单
30、内容包括以上 4 部分。分析:本题要求完成的操作有录入数据、求平均分、排序、统计。这些操作分别用函数来实现。先分析表示这些数据的数据结构,可用如下结构来表示学生的成绩:课程 1 课程 2 课程 3 平均分68 74 50 即 10 个学生的 3 门课程成绩可以登记在一个二维数组中 score104,其中最后一列用于保存平均分,学生的学号不单独记录,学生的序号用二维表的行号来表示。下面给出了主菜单的参考程序 c60205.c,其他功能的函数学生自己编写。#include #define N 10#define M 4void main() int scoreNM;char choice=1;vo
31、id input(int ,int,int);void aver_stu(int ,int,int);void aver_cour(int ,int,int);void orde_aver(int ,int,int);void failed(int ,int,int); input(score,N,M);/*显示主菜单*/ while(choice!=0) clrscr();printf(“ =the Score Processing System =n“);printf(“1.print each students averagen“);printf(“2.print each course
32、s averagen“);printf(“3.Order the students by students average decreasingly n“);printf(“4.print the failed student n“);printf(“0.Exit the system n“);printf(“=n“);printf(“Please choise (0-4): n“);choice=getchar();switch(choice)case 1:aver_stu(score,N,M); break;case 2:aver_cour(score,N,M); break;case 3
33、:orde_aver(score,N,M); break;case 4:failed(score,N,M); break;case 0:exit(0);default:printf(“Choice Error,Please select again(0-4).“);20四、实验重点、难点1. 函数的定义2. 函数的参数及返回值3. 函数的调用4. 数组作为函数参数5. 局部变量和全局变量6. 变量的存储类别五、操作要点按 Alt+D 可选择 Debug 菜单 , 该菜单主要用于查错, 它包括以下内容1. Evaluate1) Expression 要计算结果的表达式。2) Result 显示表
34、达式的计算结果。3) New value 赋给新值。2. Call stack:该项不可接触。而在 Turbo C debuger 时用于检查堆栈情况。3. Find function 在运行 Turbo C debugger 时用于显示规定的函数。4. Refresh display 如果编辑窗口偶然被用户窗口重写了可用此恢复编辑窗口的内容六、注意事项1. 所调用的函数在调用语句之后定义,但在调用之前没有说明2. 误认为形参值的改变会影响实参的值3. 函数的实参和形参类型不致。实验六 指针一、实验目的及要求1. 通用实验进一步掌握指针的概念,会定义和使用指针变量;2. 能正确使用数组的指针和
35、指向数组的指针变量;3. 能正确使用字符串的指针和指向字符串的指针变量;4. 能正确使用指向函数的指针变量;5. 了解指向指针的指针的概念及其使用方法。二、实验学时4 学时三、实验任务编程序并上机调试运行程序(都要求用指针处理) 。1.上机验证以下 c70101.c 程序的运行结果#include void main() int i,j,*pi,*pj;pi=pj=i=5;j=7;printf(“n%dt%dt%dt%d“,i,j,pi,pj);printf(“n%dt%dt%dt%d“,运行结果 :5 7 -34 -32-34 5 -32 721相关知识:指针的值与指针指向的变量值的区别。在
36、 VC 环境下,以上运行结果中的负数是另一个值。2.上机验证以下 c70102.c 程序的运行结果#include void main() int i,a=1,2,3,*p;p=a;/*将数组 a 首地址赋给指针 p*/for (i=0;ivoid main() int j,a12,*p=a;for(j=0;j void main( ) int a,b,c,*p=void sum(int ,int ,int *);void swap(int * ,int * );scanf(“%d,%d“,sum(a,b,p);swap(printf(“sum=%dn“,c);printf(“a=%d,b=%
37、dn“,a,b);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;22相关知识:调试程序时注意参数传递的是数值还是地址。指针作为参数;利用指针得到多个返回值。5.下面的 c70105.c 程序是用来从键盘输入是个整数,然后求出其中的最小值。填写空缺部分。#include int table10;void lookup(int *t,int *a,int n) int k;*a=t0;for(k=1;kvoid main() int a55=0,*p5,i,j;for(i=0;i m
38、ax ) max=sum; maxi=i; average/=N;printf(“nNo. Name Sco1 Sco2 Sco3 averagen“); /*print*/25for(i=0; iN; i+) printf(“%-8s%-10s“,stu i .num, stu i .name);for( j=0; j3; j+ )printf (“%-8d“, stu i .score j );printf (“ %6.2f n “, stu i .avr);printf (“average is %5.2fn“,average);printf (“The best student is %s, total score is %d.“,stumaxi.name,max);四、实验重点、难点结构体变量的定义和引用;结构体变量与指针五、操作要点结构体名(struct)用于标识一种新的数据类型,即结构体类型。注意区分结构体类型与基本数据类型的不同,它是复合数据类型。结构体成员变量与普通变量的定义一样,它还可以是结构体变量。六、注意事项混淆结构体类型与结构体变量的区别