1、科技大学信息科学技术学院C语言程序设计实验指导书目录实验1 C语言入门与选择结构1实验1.1 Visual C+6.0开发环境1实验1.2 C程序快速入门8实验1.3算术运算与赋值运算12实验1.4逻辑运算与if语句18实验1.5 switch选择结构24实验2循环结构与数组(共8学时)28实验2.1 循环结构(2学时)28循环结构程序设计补充33实验2.2数组一:一维数组37实验2.3数组二:二维数组44实验2.4数组三:字符数组46实验3:函数与自定义数据类型50实验3.1函数一:函数的定义、调用和声明50实验3.2函数二:函数的参数传递256实验3.3函数三:函数的嵌套和递归258实验3
2、.4 自定义数据类型(2学时)60实验4:指针(共6学时)62实验4.1指针一:指针的定义与运算62实验4.2指针二:指向数组的指针68实验4.3指针三:用指针操作字符串27269 / 71实验1 C语言入门与选择结构实验1.1 Visual C+6.0开发环境一、实验目的1. 熟悉C语言的系统环境,掌握在集成环境中编辑、编译、连接和运行C语言程序的方法。2. 掌握C语言源程序的结构特点与书写规。二、实验学时数2学时三、实验步骤与任务(一) VC+6.0集成环境(1)运行VC+6.0a.双击桌面上的VC+6.0快捷方式,运行VC+6.0。b.双击C:Microsoft Visual Studi
3、oCommonMSDev98BinMSDEV.EXE,运行VC+6.0。(2)认识VC+6.0菜单栏标准按钮执行执行组建工作空间编译输出标题栏的左侧显示当前的文件名,右侧有最小化,最大化和关闭三个按钮。菜单栏包含了开发环境中几乎所有的命令,其中一些常用的命令还被排列在工具栏中。工具栏上的按钮提出和一些菜单命令相对应,提供了经常使用的命令的一种快捷方式。项目工作区窗口包含有Class View和File View两个页面。(3)建立C语言源文件,单击文件-新建,单击文件选项卡,新建一个C+ Source File,选择存储位置(新建建立的文件夹D:test),输入文件名“myhello.c”,进
4、入D:test,可以看到新建的文件myhello.c。(4)输入C语言源程序,在打开的程序编辑窗口输入C语言源程序。输入C语言源程序(5)编译点击组建-编译,或按ctrl+F7进行预编译,或用工具栏工具编译,编译成功生成.obj目标文件(myhello.obj),显示在输出窗口。编译工具编译结果 (6)连接点击组建-编译命令,或按F7,或点按连接按钮执行连接操作。连接成功生成扩展名为.exe的文件。连接工具连接结果(7)执行点击组建-执行命令,或按ctrl+F5,或点按执行按钮完成“执行”操作。完成后界面如下,到目前为止一个简单的C程序创建成功。执行工具结果输出窗体(8)关闭工作空间程序运行结
5、束后,如果想输入一个新程序,我们需要将当前的程序关闭,选择菜单栏中的“文件”“关闭工作空间”即可。(9)常用功能键与其意义为了使程序员能够方便快捷地完成程序开发,开发环境提供了大量快捷方式来简化一些常用操作的步骤。键盘操作直接、简单,而且非常方便,因而程序员非常喜欢采用键盘命令来控制操作。下面是一些最常用的功能键,希望在实验中逐步掌握。 操作类型功能键对应菜单含义文件操作Ctrl+NFile|New创建新的文件、项目等Ctrl+OFile|Open打开项目、文件等Ctrl+SFile|Save保存当前文件编辑操作Ctrl+XEdit|Cut剪切Ctrl+CEdit|Copy复制Ctrl+VEd
6、it|Paste粘贴Ctrl+ZEdit|Undo撤消上一个操作Ctrl+YEdit|Redo重复上一个操作Ctrl+AEdit|Select All 全选DelEdit|Del删除光标后面的一个字符建立程序操作Ctrl+F7Build| Compiler current file 编译当前源文件Ctrl+F5Build|Run exe 运行当前项目 F7Build|Build exe建立可执行程序F5Build|Start Debugging启动调试程序调试F5Debug|Go继续运行F11Debug|Step into 进入函数体部shift+F11Debug|Step out从函数体部运
7、行出来F10Debug|Step over执行一行语句F9设置/清除断点Ctrl+F10Debug|Run to cursor运行到光标所在位置shift+F9Debug|QuickWatch快速查看变量或表达式的值Shift + F5Debug|Stop debugging停止调试要求:请用最简单的语言描述如何新建一个C语言的源文件,如何编辑程序,如何编译程序,如何连接程序,如何运行程序,程序结果然后显示?(二)阅读程序要求:编辑下面源程序,并且读懂与分析运行程序,上机运行程序,并与分析结果相对比。1. 输入并运行以下程序,观察运行结果。(sy1.1.1.c)# includeint mai
8、n()printf(*n); printf( Hello world!n); printf(*n); return 0;分析结果运行结果思考:如何采用一个输出(printf)函数调用实现此输出结果。2输入并运行以下程序,观察运行结果。(sy1.1.2.c)# includeint main() int a,b,sum,minus; a=456;b=123; sum=a+b; minus=a-b;printf(a+b=%dna-b=%dn,sum,minus);return 0; 分析结果printf中删除a+b=和a-b=输出结果:printf中删除第一个n输出结果:运行结果printf中删除
9、a+b=和a-b=输出结果:printf中删除第一个n输出结果:(三)完成程序要求:依据题目要求,分析已给出的语句,填写空白。但是不要增行或删行,改动程序的结构。1求(a-b)c的值。(设a=33,b=22,c=11)(sy1.1.3.c)# includeint main( )int a,b,c;a=33; c=11;printf(%dn,(a-b)*c);return 0;2求圆的面积。(sy1.1.4.c)#include#define PI 3.14int main( ) float r,area;printf(n Enter r value:);scanf(%f,&r);area=P
10、I*r*r;printf( n area=%fn,); return 0;(四)调试程序要求:调试运行下列程序是否正确,若有错,写出错在何处?填写正确的运行结果。(sy1.1.5.c)行号 #include 1. int main( )2. int x;3. x=5,y=8;4. printf(n%d,%d,%dn,x,(x+5)*2,y);5. return 0;6. 错错误在行应改为:调试正确后的运行结果输出结果:(五)编写程序1.请用C程序告诉大家你来自哪里?有什么爱好?(sy1.1.6.c)2.输出以下图案: (sy1.1.7.c)*(六)分析与讨论.记下在调试过程中所发现的错误、系统
11、给出的出错信息和对策。分析讨论对策成功或失败的原因。.总结程序的结构和书写规则。实验1.2 C程序快速入门一、实验目的1.掌握标识符、变量与常量的定义;2.掌握C语言数据类型的种类和作用;3.熟悉如何定义一个整型、字符型、实型变量,以与对它们赋值的方法,了解以上类型数据输出时所用的格式转换符;4.掌握不同的类型数据之间赋值的规律;5.掌握输出、输入函数的使用与格式控制;6.进一步熟悉C程序语句和程序的结构特点,学习简单程序的编写方法。二、实验学时数2学时三、实验步骤(一)阅读程序1. 输入并运行以下程序,观察运行结果。#includeint main() char c1,c2; c1=97;c
12、2=98; printf(%c,%cn,c1,c2); return 0;(1)在第五行后面加入以下printf语句,并运行。printf(%d,%dn,c1,c2);分析结果字符型97,98对应a,b运行结果ab (2)在(1)的基础上,将第三行改为以下语句,并运行。 int c1,c2;分析结果运行结果仍为a,b若改为%d,则为97,98 (3)在(1)的基础上,将第四行改为以下语句,并运行。c1=321;c2=400;分析结果运行结果A,?2. 分析并运行此程序,当输入的数据为10时,下面程序的运行结果。#include int main() float x,y; scanf(%f,&x
13、); printf(n2.4*x-1/2=%f,2.4*x-1.0/2); printf(nx%2/5-x=%f,(int)(x)%2/5-x); printf(n(x-=x*10,x/=10)=%dn,(x-=x*10,x/=10); return 0;分析结果运行结果2.4*x-1/2=23.500000x%2/5-x=-10.000000(x-=x*10,x/=10)=0(二)完成程序要求:依据题目要求,分析已给出的语句,填写空白。但是不要增行或删行,改动程序的结构。1求任意输入字符的ASC码。#include int main( )char a; int b;/变量的定义printf(
14、“请输入一个字符:”);scanf(“%c”,&a);b=(int)a;printf(“nn%c的ASC码为%dn”,a,b); return 0;2、输出任意一个十进制数对应的八进制,十六进制数。#includeint main( )int a;scanf(“%d”,&a);printf(“n%d(10) ,%o(8), %x(16)n”,a,a,a); return 0;(三)调试程序要求:调试运行下列程序是否正确,若有错,写出错在何处?填写正确的运行结果。1.行号 #include 1 int main( )2 int u=v=89;3 printf(“u=%d,v=%dn”,u,v);
15、 4 return 0;5 错错误在 1 行应改为:调试正确后的运行结果输出结果:2.下面的程序试图计算由键盘输入的任意两个整数的平均值:行号#include 1int main()23int x,y,a;4scanf(%x,%y,&x,&y); 5a=(x+y)/2;6printf(The average is %d:n, a); 7 return 0;8 错错误在行应改为:调试正确后的运行结果输入数据2,61,4-1,-3-2,42,0输出结果:(四)编写程序1. 编写一个程序,从键盘输入某电视机的价格,再输出该价格打7折后的价格。分析:必须设计一个实型变量接受从键盘输入的值,输入、输出应
16、该有提示。#includeint main()double a,b;printf(电视机的价格:);scanf(%lf,&a);b=0.7*a;printf(打折后的价格:%lf,b);return 0;2. 编写一个程序, 求一元一次方程ax+b=0的根。分析:a、b的值从键盘输入,输入时a的值不能为0(无解),方程的根即x的值为:-b/a实验1.3算术运算与赋值运算一、实验目的1.掌握算术运算符和算术表达式。2.熟练掌握赋值运算符、复合的赋值运算符3.熟练掌握自增1和自减1运算符。4.熟练掌握顺序结构的程序设计,能够编写简单的应用程序。二、实验学时数2学时三、实验步骤(一)分析程序1.分析
17、以下程序运行的结果#include int main() int i,j,m,n ; i=8;j=10; m=+i; n=j+; printf(%d,%d,%d,%dn,i,j,m,n); return 0; 分析结果运行结果(2)将第6、7行改为:m=i+; n=+j;分析结果运行结果(3)程序改为:#include int main() int i , j , m=0 , n=0 ; i=8; j=10; m+=i+; n-=-j; printf(“%d,%d,%d,%dn”,i,j,m,n); return 0;分析结果运行结果1. 输入并运行以下程序,观察运行结果。#includein
18、t main( ) int a=17; float u=1234.567;printf(%d,%7d,%-7dn,a,a,a);printf(%f,%7.2fn,u,u); return 0;分析结果运行结果2. 输入并运行以下程序,观察运行结果。#includeint main( )int a,x,y;x=(a=2,6*2);y=a=2.6 *a;printf(“x=%d,y=%dn”,x,y);return 0;分析结果运行结果3.阅读以下程序,若输入的数据形式为25 13 10,输出结果为:#includeint main( ) int x,y,z; scanf(%d%d%d, &x,&
19、y,&z);printf(x+y+z=%dn, x+y+z); return 0;分析结果运行结果(二)完成程序要求:按照给定题目要求,参照出现的语句,填写程序空白处。1. 键盘输入任意一个小写字母,将其转换成大写字母,然后输出。#includeint main( )char c1,c2;c1=getchar( );c2=;putchar(n);putchar( );putchar(c2); putchar( ); return 0;2. 求的值。(设a=25,b=5)#includeint main( )float a=25,b=5;float c;c=;printf(c=%fn ,c);
20、return 0;(三)调试程序要求:分析下列程序是否正确,如有错误,指出错误所在,并改正;若正确,写出运行结果。1. 行号#include1 int main( )2 int i,k;3 i=8;4 k=5*I*I;5 printf(%dn,k); 6 return 0;7 错错误在行应改为:调试正确后的运行结果2该程序输入一个三位数,然后进行个位和百位的置换,如 234 ,转换成432行号#include1 int main( )2int n,a,b,c,m;3scanf(%d,n);4a=n%10;5b=(n/10)%10;6c=(n/100)%10;7m=100*a+10*b+c;8p
21、rintf(%d=%dn ,n,m);9 return 0;10 错错误在行应改为:调试正确后的运行结果(四)编写程序1.编程求出某学生期末三门课程的总分与平均分。结果保留小数点后一位。2.编程从键盘输入两个整数分别给变量a和b,分别写出不借助于其他变量和借助于其他变量的条件下,将变量a和b的值实现交换。1.编写一个程序,其功能为:从键盘上输入一个浮点数,然后分别输出该数的整数部分和小数部分。分析:若输入的浮点数存入fd变量,则可用强制类型转换运算符,将输入的该数的整数部分取出:zhs=(int)fd;2. 从键盘输入三角形的三条边a,b,c的值,计算三角形的面积,程序框架如下:#includ
22、e “sdtio.h”#include “math.h”main()定义变量 从键盘输入 a,b,c 三条边的值 计算 s 的值 计算三角形面积 输出结果1.编程序计算数学表达式:b2 -4ac,a,b,c的值从键盘输入。2. 编程序计算298秒是几分几秒。提示:设 int x=298; 再定义两个变量存放分(m)、秒(s)值; 则:m=x/60;s=x%60;3.从键盘输入一个三位数,求各位数字之和。例如,输入的三位数为358,则输出结果为3+5+8=16 。提示:题目的关键是要求出该数的个、十、百位上的数字,可利用C语言整数相除,结果仍为整数的特点。若设该数为data,它的个、十、百位为g
23、、s、b,则b=data/100 ;s=(data-b*100)/10;g=data%10(三)编写程序1.用赋值语句表达:a 的值为2,b的值比a多2,c 的值比b的值多2,并输出a,b,c的结果。请编出完整程序验证。2.假设变量a和b均为整型,以下语句可以不借助任何变量把a、b中的值进行交换。请先填空,再编出完整程序验证。a+=_;(a为a、b之和) b=a-_;a-=_; 实验1.4逻辑运算与if语句一、实验目的1.掌握关系、条件、逻辑运算符与关系、条件、逻辑表达式。2.掌握逗号运算符和逗号表达式。3.熟练掌握三种单分支、双分支和多分支if语句。4.掌握if语句的嵌套。二、实验学时数2学
24、时三、实验步骤(一)阅读程序1.分析程序运行结果:#include int main() int i , j , m=0 , n=0 ; i=8; j=10; m+=i+; n-=-j; printf(“%d,%d, n”,(i,j,m),n); return 0;分析结果运行结果2. 输入并运行以下程序,观察运行结果。#includeint main()int x=10,y=9,a,b,c;a=(-x=y+)?-x:+y;b=x+;c=y;printf(a=%d,b=%d,c=%dn,a,b,c);return 0;分析结果运行结果3、若x=12,则以下程序运行的结果是#includeint
25、 main()int x,y;scanf(%d,&x);y=x12?x+10:x-12;printf(y=%dn,y);return 0;分析结果运行结果三、实验步骤(一)阅读程序1. 输入并运行以下程序,观察运行结果。#includeint main() int a,b,c; a=10;b=60;c=30; if(ab) a=b;b=c; c=a; printf(a=%d,b=%d,c=%dn , a , b, c );return 0;分析结果运行结果2. 输入并运行以下程序,观察运行结果。#includeint main()int x=60,a=30,b=20;int v1=3,v2=8
26、;if (ab)if (b!=15) if (!v1)x=1;elseif (v2) x=10; x=-2;printf(“%dn”, x);return 0;分析结果运行结果(二)完成程序要求:按照给定题目要求,参照出现的语句,填写程序空白处。1. 输入一个字符,如果它是一个大写字母,则把它变成小写字母;如果它是一个小写字母,则把它变成大写字母;其他字符不变,请在_上填写正确容。#includeint main() char ch ; scanf(%c,&ch); if (_)ch=ch+32; else if (ch=a & ch=z ) _; printf(%cn ,ch); retur
27、n 0;2. 以下程序根据输入的三角形的三边判断是否能组成三角形,若可以则输出它的面积和三角形的类型,请在_上填写正确容。#include #include int main()float a, b , c ;float s , area ;scanf(“%f ,%f ,%f” , &a, &b ,&c);if (_) s=(a+b+c)/2;area= sqrt(s*(s-a)*(s-b)*(s-c);printf(“三角形的面积为:%fn”,area);if (_)printf(“等边三角形n”);else if (_)printf(“等腰三角形n”); else if(a*a+b*b=c
28、*c)| (a*a+c*c=b*b)| (c*c+b*b=a*a)printf(“直角三角形n”);else printf(“一般三角形n”);else printf(“不能组成三角形n”);return 0;(三)调试程序要求:分析下列程序是否正确,如有错误,指出错误所在,并改正;若正确,写出运行结果。1. 以下程序实现求分段函数。y= -1 x9x*(x+2) 3x=92*x-1x=3x-1x=-1#include int main()1 int x ,y ;2 scanf(“%d”,&x);3 if (3x=9) y=x*(x+2);4 else if (-1x=3) y=2*x;5 e
29、lse if (x=-1)y=x-1;6 else y=-1;7 printf(“%dn”, y);8 return 0;9 错错误在行应改为:调试正确后的运行结果输入数据:4 2 1 -3 10输出结果:2. 有一函数关系如下: x-3 x0 以下程序表示上面的函数关系行号#includeint main()1 int x ,y ;2 scanf(%d,&x);3 y=x-3;4 if (x!=0)5 if (x0) y=x+3;6 else y=x;7 printf(y=%dn , y); 8 return 0;9 错错误在行应改为:调试正确后的运行结果输入数据:5 0 -3输出结果:(四
30、)编写程序1. 输入某学生的成绩(成绩为100分制,可以为89.5,如果输入的成绩不在0-100之间,请给出出错提示。),经处理后给出学生的等级,等级分类如下: 90分以上(包括90): A 80至90分(包括80):B 70至80分(包括70):C 60至70分(包括60):D 60分以下: E2输入一个三位的正整数,判断该数是否为水仙花数。(水仙花数的是指一个三位数,其各位数字的立方各等于该数本身。例如:153是一个水仙花数,因为153=13+53+33) 1某邮局对邮寄包裹有如下规定:若包裹的长宽高任一尺寸超过1米或重量超过30千克,不予邮寄;对可以邮寄的包裹每件收取手续费0.5元,再加
31、上根据下表按重量weight计算的邮资,请编写程序计算某包裹的邮寄资费。2输入一个正整数n,再输入n个学生的成绩,计算平均分,并统计不与格成绩的个数。实验1.5 switch选择结构一、实验目的1.熟练掌握switch语句。2.掌握省略break的case语句的执行方式。3.比较if语句的嵌套与if、switch多路分支语句。二、实验学时数2学时三、实验步骤(一)阅读程序1. 输入并运行以下程序,观察运行结果。#includeint main() int i=1;switch(i) case 1:printf(%dt,i+);case 2:printf(%dt,i+);case 3:print
32、f(%dt,i+);case 4:printf(%dt,i+);printf(ni=%dn,i);return 0;分析结果运行结果(二)完成程序要求:按照给定题目要求,参照出现的语句,填写程序空白处。1. 以下程序实现的功能是: -1 x0#includeint main() int x,y;scanf(“%d”,&x);switch(x0)case 1:;break;case 0:switch(x=0) case 1;y=0;break; case 0:y=1;printf(“y=%dn”,y); return 0;2用switch结构编写一个处理四则运算的程序。#includeint m
33、ain() float v1,v2;char op;printf(“please type your expression:n”);scanf(“%f%c%f”,&v1,&op,&v2);switch()case +:printf(“%1.0f+%1.0f=%1.0fn”,v1,v2,v1+v2);break;case :printf(“%1.0f-%1.0f=%1.0fn”,v1,v2,v1-v2); break;case *:printf(“%1.0f*%1.0f=%1.0fn”,v1,v2,v1*v2); break;case /:if()printf(“除数为零n”);break;el
34、se printf(“%1.0f/%1.0f=%1.0fn”,v1,v2,v1/v2);break; default:printf(“运算符错误n”); return 0;3输入某年某月某日,判断这一天是这一年的第几天?程序分析:以3 月5 日为例,应该先把前两个月的加起来,然后再加上5 天即本年的第几天,特殊情况,闰年且输入月份大于3 时需考虑多加一天。#include int main()int day,month,year,sum,leap;printf(nplease input year,month,dayn);scanf(%d,%d,%d,_);switch(month)/*先计算
35、某月以前月份的总天数*/case 1:_;break;case 2:sum=31;break;case 3:sum=59;break;case 4:sum=90;break;case 5:sum=120;break;case 6:sum=151;break;case 7:sum=181;break;case 8:sum=212;break;case 9:sum=243;break;case 10:sum=273;break;case 11:sum=304;break;case 12:sum=334;break;default:printf(data error);break;sum=sum+d
36、ay; /*再加上某天的天数*/if(year%400=0|(_)/*判断是不是闰年*/leap=1;elseleap=0;if(_)/*如果是闰年且月份大于2,总天数应该加一天*/_;printf(It is the %dth day. n ,sum);return 0;(三)编写程序1. 以下4种水果(1苹果2梨3桔子4芒果)单价分别是2.0元/公斤,2.5元/公斤,3.0元/公斤,4.5元/公斤,请输入水果编号、重量,计算应付款。2从键盘输入1-7,显示输出该日期对应的英文日期(Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,sunda
37、y)名称。3.己知某公司员工的保底薪水为500,某月所接工程的利润p与利润提成的关系如下:(计量单位:元)(选作)p=1000 没有提成1000p=2000 提成10%2000p=5000提成15%5000p=10000提成20%10000p 提成25%1编写程序实现运输公司对用户计算运费。路程()越远,每公里运费越低。2考虑一个自动售货机,提供如下选择:1矿泉水2巧克力3爆米花4 果汁5 显示购买商品的数量6 退出系统实验2循环结构与数组(共8学时)实验2.1 循环结构(2学时)2.1.1 while循环和dowhile循环与二者比较2.1.2 for循环2.1.3循环嵌套一、实验目的1.
38、掌握while ,do-while,for循环语句的使用与区别;2. 掌握循环条件、循环体、循环终止等循环要素;4. 理解循环执行过程。5. 熟练使用循环语句编写程序。二、实验学时数2学时三、实验步骤(一)阅读程序1. #include int main()int a=2,b=8;while(b-0)b-=a ;a+ ;printf(“a=%d,b=%dn”,a,b); return 0;分析结果运行结果2. #includeint main() int x=2 ,y=6 , z=3;doy=y-1;while(z-0&+x5) ;printf(“x=%dty=%dtz=%dn”,x,y,z);return 0;分析结果运行结果3. #includeint ma