C 语言程序设计
实
验
指
导
书
电子工程学院
2008-2
实验一 C程序的运行环境和编辑、调试、运行简单C程序
一、实验目的
1.了解 Turbo C 的基本操作方法,学会独立使用该系统。
2.掌握在该系统上如何编辑、编译、运行一个C程序。
二、实验内容及步骤
1.进入C的工作环境
1)在Windouws环境下:“开始”→“程序”→“MS-DOS”
屏幕上进入 MS-DOS窗口
2)在Dos环境下:键入命令c:\> cd c:\tc↙
c:\tc> tc↙
屏幕上出现Turbo C的工作环境
2.熟悉Turbo C的工作环境
了解Edit窗口与Message窗口
了解主菜单的8个菜单项
File Edit Compile Project Option Debug break/watch
3.输入并运行一个简单的程序
File→New
输入源程序:
main()
{
printf("This is a C program.\n");
printf("OK\n");
}
按F9进行编译和连接,观察屏幕上显示的编译信息。如果出现出错信息,则应找出原因并改正。
按Run→Run(或按Ctrl+F9) 编译、连接、运行一起完成。
按Run→User screen(或按Alt+F5) 察看运行结果。
按任一键从用户屏切换回TC窗口。
4.输入并编辑第二个C程序
File→New
输入源程序:
main ( )
{
int a,b,sum;
a=123; b=456;
sum=a+b;
printf("sum is %d\n", sum);
}
编辑、运行、调试该程序。
5.编辑、运行、调试自己编写的程序(至少一个程序)
如:输入上底、下底和高,计算梯形面积。
观察屏幕上显示的编译信息。如果出现出错信息,则应找出原因并改正。
用File→Save (或F2)保存程序(程序名为a1.c)
三、实验报告要求
写明:
1.实验目的
2.实验内容与步骤
3.编写的程序(题目,经调试、运行后正确的程序)
4.编译过程中出现的错误信息。
5.总结讨论本次实验的结果和收获。
实验二数据类型、运算符和表达式
一、实验目的
1.掌握C语言的各种类型及其定义方法,赋值方法。
2.掌握不同类型之间赋值的规律。
3.学会使用各种算术运算符,特别是自加自减运算符。
4.进一步熟悉C程序的编辑、编译、连接和运行的过程。
二、实验内容及实验步骤
1.练习一个有关字符和整型的程序。
main()
{
char c1,c2;
c1=97;
c2=98;
printf("%c %c\n",c1,c2); /*以字符形式输出*/
printf("%d %d\n",c1,c2); /*转换为整数形式输出*/
}
2.转义字符的练习。
main()
{
printf("---------------*\r*\n");
printf("\tOA\bK\n");
printf("#---------------#\n");
printf("\tABC\tDEF\tGHI\n");
printf("\t123\t456\t789\n");
}
对照输出,理解转义字符的含义。
3.自加自减程序的练习。
main()
{
int a=5,b=3,c1,c2;
a++;
--b;
c1=++a+b;
c2=c1---a/b;
b=++a+b+c1--+c2;
printf("a=%d\nb=%d\nc1=%d\nc2=%d\n",a,b,c1,c2);
}
4.各种类型混合运算的例子
main()
{
int a=7,b=3; char c1=’a’,c2=66;
float x=12.25;
double y=1.3333333333;
long d=5432789;
a=x+b*x+y/2-d%(c1-c2);
printf("a=%d, b=%d,c1=%c\n",a,b,c1);
printf("d=%ld, x=%f, y=%10.2f\n",d,x,y);
}
5.上机改错题:请指出以下C程序的错误所在
(1)
main();
float r,s;
r=5.0;
s=3.14159*r*r;
printf("%f\n",s)
(2)
main
{
float a,b,c,v;
a=2.0; b=3.0; c=4.0
v=a*b*c;
printf("%f\n",v)
}
6.调试、运行自己编写的程序。
(1)已知圆半径r=1.5,圆柱高h=3, 求圆周长,圆面积,圆球表面积,圆球体积,圆柱体积。(2)输入一个华氏温度,要求输出摄氏温度。公式为c=5/9*(f-32).
三、实验报告要求
写明
1.实验目的
2.实验内容及步骤
3.编写的程序(题目,经调试、运行后正确的程序)
4.编译过程中出现的错误信息。
5.总结讨论本次实验中的问题和收获
i++和 ++ i的区别,i--和 --i的区别
各种类型混合运算时的类型转换
实验三顺序和分支结构的程序设计
一、实验目的
1.掌握C语言中使用最多的一种语句——赋值语句的使用方法。
2.掌握各种类型数据的输入输出的方法,能正确使用各种格式转换符。
3.熟练掌握if语句和switch语句。
二、实验内容及实验步骤
1.掌握各种格式转换符的正确使用方法
(1)输入程序
main()
{
int a, b;
float d, e;
char c1, c2;
double f, g;
long m, n;
unsigned int p, q;
a = 61;
b = 62;
c1 = ’a’; c2 = ’b’;
f = 3157.890121;
g = 0.123456789;
d = f;
e = g;
p = a = m = 50000; q = b = n = -60000;
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\n", f, g, m, n, p, q);
}
(2)运行此程序并分析结果。
(3)改用scanf 函数输入数据而不用赋值语句,scanf 函数如下:
scanf("%d,%d,%c,%c,%f,%f,%lf,%lf,%ld,%ld,%u,%u",&a,&b,&c1,&c2,&d,&e,&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型数据)分析运行结果。
(4)在(3) 的基础上将printf语句改为:
printf("a=%d, b=%d\nc1=%c, c2=%c\nd=%15.6f, e=%15.12f\n", a, b, c1, c2, d,
e);
printf("f=%f, g=%f\nm=%d, n=%d\np=%d, q=%d\n", f, g, m, n, p, q);
运行程序。
2.字符的输入输出
#include
main()
{
char a,b;
a=’g’;
b=getchar();
putchar(a);
putchar(b);
}
3.以下程序多处有错。若指定必须按下面的形式输入数据,并且必须按下面指定的形式输出数
据,请对该程序做相应的修改。
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 %d",a,b,c);
printf("s=%f\n", s, "v=%d\n",v);
}
当程序执行时,屏幕的显示和要求输入形式如下:
input a,b,c:2.0 2.0 3.0 此处的2.0 2.0 3.0是用户输入的数据
a=2.000000,b=2.000000,c=3.000000 此处是要求的输出形式
s=4.000000,v=12.000000
4.编辑、运行、调试自己编写的程序
给出一个百分制成绩,要求输出成绩等级A、B、C、D、E。90分以上为A,80-89分为B,70-79分为C,60-69分为D,60分以下为E。
事先编好程序,要求分别用if语句和switch语句实现。运行程序,并检查结果是
否正确。
三、实验报告要求
写明:
1.实验目的
2.实验内容与步骤
3.编写的程序(题目,经调试、运行后正确的程序)
4.编译过程中出现的错误信息。
5.总结讨论本次实验的结果和收获。
实验四循环结构的程序设计
一、实验目的
1.熟练掌握while循环语句的应用。
2.熟练掌握do—while循环语句的应用。
3.熟练掌握for循环语句的应用。
4.理解三者的区别和联系。
二、实验内容及实验步骤
1.求5!
main()
{
int n,t;
n=1;
t=1;
while(t<=5)
{
n=n*t;
t=t+1;
}
printf("%d",n);
}
2.将以上程序用do—while语句改写。
3.求和s=1!+3!+5!
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);
}
4.求和s= 3+33+333
main()
{
int s=0,t=3,i;
for(i=1;i<=3;i++)
{
s=s+t;
t=10*t+3;
}
printf("%d",s);
}
5.打印下列图案
*
***
*****
*******
main()
{
int i,j;
for(i=1; i<=4;i++)
{
for(j=1;j<= 4-i;j++)
printf("");
for(j=1;j<=2*i-1;j++)
printf("*");
printf("\n");
}
}
6.测试、运行自己编写的程序。
(1)编写程序,求1-3+5-7+…-99+101的值。
(2)编写程序,求e的值,e≈1+1/1!+1/2!+1/3!+1/4!+…。
(3)编写程序,统计输入的一行中小写字母的个数。
(4)打印100-999之间所有的“水仙花数”。“水仙花数”是一个三位数,其各位数立方和等于该数本身。
(5)一个数如果恰好等于它的因子之和,这个数就称为完数。求1000之内的所有完数。
三、实验报告要求
写明:
1.实验目的
2.实验内容与步骤
3.编写的程序(题目,经调试、运行后正确的程序)
4.编译过程中出现的错误信息。
5.总结讨论本次实验的结果和收获。
实验五数组(一)
一、实验目的
1.掌握一维数组的定义、赋值和输入输出的方法。
2.掌握二维数组的定义、赋值和输入输出的方法。
二、实验内容及实验步骤
1.在键盘上输入N个整数,试编制程序使该数组中的数按照从大到小的次序排列。分析:C中数组长度必须是确定大小,即指定N的值。
#define N 10
main()
{
int a[N],i,j,temp;
printf("please input %d numbers\n",N);
for(i=0;i scanf("%d",&a[i]); for(i=0;i for(j=0;j { if(a[j] { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } printf("the array after sort:\n"); for(i=0;i printf("%5d",a[i]); } 2.有一个3×4的矩阵,要求输出其中值最大的元素的值,以及它的行号和列号。 main( ) { int max,i,j,r,c; static int a[3][4]={{123,94,-10,218},{3,9,10,-83},{45,16,44,-99}}; max=a[0][0]; for(i=0;i<3;i++) for(j=0;j<4;j++) if ( a[i][j]>max) { max=a[i][j]; r=i; c=j; } printf("max=%d ,row=%d ,colum=%d \n",max,r,c); } 3.测试、运行自己编写的程序。 (1)编写程序,将数组中所有奇数放在另一个数组中返回。 (2)输入若干有序数放在数组中。然后输入一个数,插入到此有序数列中,插入后,数组中的数仍然有序。请对插在最前、插在最后、插在中间三种情况运行程序,以便验证程序是否正确。(3)求两个矩阵之和。 三、实验报告要求 写明: 1.实验目的 2.实验内容与步骤 3.编写的程序(题目,经调试、运行后正确的程序) 4.编译过程中出现的错误信息。 5.总结讨论本次实验的结果和收获。 实验六数组(二) 一、实验目的 掌握字符数组的使用。 二、实验内容及实验步骤 1.输入一串字符,计算其中空格的个数。 #include "stdio.h" #include "string.h" main( ) { char c[30]; int i,sum=0; gets(c); for(i=0;i if(c[i]==' ') sum=sum+1; printf("The number of spaces is:%d\n",sum); } 2.测试、运行自己编写的程序。 (1)编写程序,将两个字符串连接起来,不要使用strcat函数。 (2)编写程序,将两个字符数组s2中的全部字符复制到字符数组s1中,不使用strcpy函数。复制时,’\0’也要复制过去。’\0’后面的字符不复制。 三、实验报告要求 写明: 1.实验目的 2.实验内容与步骤 3.编写的程序(题目,经调试、运行后正确的程序) 4.编译过程中出现的错误信息。 5.总结讨论本次实验的结果和收获。 实验七 C程序的函数(一) 一、实验目的 1.掌握自定义函数的一般结构及定义函数的方法。 2.掌握形参、实参、函数原型等重要概念。 3.掌握函数声明、函数调用的一般方法。 二、实验内容及实验步骤 1.求三角形面积函数。编写一个求任意三角形面积的函数,并在主函数中调用它,计算任意三 角形的面积。 参考程序 /* 定义和使用求三角形面积函数的程序 */ #include "math.h" #include "stdio.h" float area(float,float,float); main() { float a,b,c; printf("请输入三角形的三个边长值:\n") scanf("%f,%f,%f",&a,&b,&c); if(a+b>c&&a+c>b&&b+c>a&&a>0.0&&b>0.0&&c>0.0) printf("area=%-7.2f\n",area(a,b,c)); } /* 以下是计算任意三角形面积的函数 */ float area(float a,float b,float c) { float s,area_s; s=(a+b+c)/2.0; area_s=sqrt(s*(s-a)*(s-b)*(s-c)); return(area_s); } 2.上机调试下面的程序,记录系统给出的出错信息,并指出出错原因。 main() { int x,y; printf("%d\n",sum(x+y)); int sum(a,b); { int a,b; return(a+b); } } 3.测试、运行自己编写的程序。 (1)编写函数,对传送过来的三个数选出最大数和最小数,并通过形参传回调用函数。 (2)写出两个函数,分别求出两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。 (3)写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的信息。 三、实验报告要求 写明: 1.实验目的 2.实验内容与步骤 3.编写的程序(题目,经调试、运行后正确的程序) 4.思考题的解决方法。 5.总结讨论本次实验的结果和收获。 实验八 C程序的函数(二) 一、实验目的 1.掌握自定义函数的一般结构及定义函数的方法。 2.掌握形参、实参、函数原型等重要概念。 3.掌握函数声明、函数调用的一般方法。 二、实验内容及实验步骤 1.菜单程序。编写一个菜单程序,运行后首先在屏幕显示如下菜单, 当输入数值1后,调用显示“&”图案的函数程序;输入数值2后,调用显示“$”图案的函数程序;输入数值3后结束程序。 ********************************** * Menu section * * 1. Design(&) * * 2. Design($) * * 3. Exit * ********************************** 参考程序 /* 菜单程序 */ #include "stdio.h" void design1(); void design2(); main() { int op; /* 以下代码生成菜单 */ printf("\n*************************************"); printf("\n* Menu section *"); printf("\n* 1. Design(&) *"); printf("\n* 2. Design($) *"); printf("\n* 3. Exit *"); printf("\n*************************************"); printf("\nPlease enter selection:"); scanf("%d",&op); if(op==1) design1(); else if(op==2) design2(); } /* 以下是显示&图案的函数 */ void design1() { int i; char str[31]="&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"; for(i=1;i<10;i++) puts(str); } /* 以下是显示$图案的函数 */ void design2() { int i,j; for(i=1;i<10;i++) { for(j=1;j putchar(' '); for(j=1;j<30;j++) putchar('$'); printf("\n"); } } 2.测试、运行自己编写的程序。 (1)编写函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。 (2)编写函数,判断一个字符串是否是回文。若是回文函数返回值为1;否则函数返回值为0。回文是顺读和倒读都是一样的字符串。 (3)用递归法将一个整数n转换成字符串。 (4)写一函数,输入一个十六进制数,输出相应的十进制数。 三、实验报告要求 写明: 1.实验目的 2.实验内容与步骤 3.编写的程序(题目,经调试、运行后正确的程序) 4.思考题的解决方法。 5.总结讨论本次实验的结果和收获。 实验九编译预处理 一、实验目的 1.掌握宏定义的规则,领会带参数宏定义和函数调用的区别. 2.了解文件包含命令的功能和使用规则。 3.了解条件编译的特点和功能。 二、实验内容及实验步骤 1.调试运行下面的程序 (1)使用不带参数的宏定义 #include #define PI 3.1415926 void main() {float l,s,r,v; printf("input radius:"); scanf("%f",&r); l=2.0*PI*r; s=PI*r*r; v=4.0/3*PI*r*r*r; printf("l=%10.4f\ns=%10.4f\nv=%10.4f\n",l,s,v); } (2)在宏定义中引用已定义的宏名 #include #define R 3.0 #define PI 3.1415926 #define L 2*PI*R #define S PI*R*R void main() { printf("L=%f\nS=%f\n",L,S); } (3)使用带参数的宏 #include #define PI 3.1415926 #define S(r) PI*r*r void main() { float a,area; a=3.6; area=S(a); printf("r=%f\narea=%f\n",a,area); } (4)通过宏展开得到若干个结果 #include #define PI 3.1415926 #define CIRCLE(R,L,S,V) L=2*PI*R;S=PI*R*R;V=4.0/3.0*PI*R*R*R void main() {float r,l,s,v; scanf("%f",&r); CIRCLE(r,l,s,v); printf("r=%6.2f,l=%6.2f,s=%6.2f,v=%6.2f\n",r,l,s,v); } 2.利用条件编译实现:如果输入两个实数,则交换后输出;如果输入的是三个实数,则只输出其 中最大的数. 三、实验报告要求 写明: 1.实验目的 2.实验内容与步骤 3.编写的程序(题目,经调试、运行后正确的程序) 4.思考题的解决方法。 5.总结讨论本次实验的结果和收获。 实验十 C程序的指针(一) 一、实验目的 1.掌握指针和指针变量的概念。 2.掌握简单指针变量的定义和基本使用方法。 3.熟悉指针和一维数组的关系,掌握指向一维数组的指针变量的定义方法,熟练使用指针变量 访问一维数组元素。 4.了解指针和二维数组的关系,掌握用指针表示二维数组元素的方法。 5.了解指针与字符串的关系,能熟练使用指针处理字符串。 二、实验内容及实验步骤 1.用指针访问简单变量。从键盘输入三个整数,要求设三个指针变量p1,p2,p3,使p1指向三 个数的最大者,p2指向次大者,p3指向最小者,然后按由小到大的顺序输出这三个数。 参考程序 /* 用指针访问简单变量的程序 */ #include "stdio.h" main() { int a,b,c,temp; int *p1,*p2,*p3; printf("请输入三个整数值(a,b,c):\n"); scanf("%d,%d,%d",&a,&b,&c); p1=&a; /* 使指针p1指向简单变量a */ p2=&b; /* 使指针p2指向简单变量b */ p3=&c; /* 使指针p3指向简单变量c */ if(*p1<*p2) { temp=*p1;*p1=*p2;*p2=temp; } if(*p1<*p3) { temp=*p1;*p1=*p3;*p3=temp; } /* 至此p1指向了三个数中的最大数 */ if(*p2<*p3) { temp=*p2;*p2=*p3;*p3=temp; } /* 至此p3指向了最小数,p2指向了中间数 */ printf("%d,%d,%d\n",*p3,*p2,*p1); } ①运行程序,任意输入三个整数(之间以逗号分隔),察看并分析程序运行结果。 ②运行程序,按由小到大的顺序输入三个整数(之间以逗号分隔),察看并分析程序运行结果。 ③运行程序,按由大到小的顺序输入三个整数(之间以逗号分隔),察看并分析程序运行结果。 2.用指针法在一维有序数组中插入数据。如下是具有10个整数的升序数列,存储在一维数组 中,要求在其中插入任意一个整数后数列仍然有序。数列:10,20,30,40,50,60,70,80,90,99 参考程序 /* 用指针法在一维有序数组中插入数据程序 */ #include "stdio.h" #define M 10 main( ) { int a[M+1]={10,20,30,40,50,60,70,80,90,99}; int i,n,*p,*q; printf("请输入要插入的数据:\n"); scanf("%d",&n); a[M]=n; for(p=a,i=0;i<=M;i++) /* 确定要插入的位置p */ if(n<=*(p+i)) { p=p+i; /* p指向要插入数据的位置 */ break; } for(q=a+M-1;q>=p;q--) /* 元素后移 */ *(q+1)=*q; *p=n; /* 插入数据 */ printf("\n插入数据后的数列:\n"); for(p=a,i=0;i printf("%d ",*(p+i)); } 3.用指针实现选择法排序程序。输入20个整数,并用指针实现选择法升序排序。 参考程序 /* 用指针实现的选择法排序程序 */ #include "stdio.h" #define M 20 main( ) { int a[M],n,i,j,min,temp,*p,*q; printf("请输入排序数据:\n"); for(p=a;p scanf("%d",p); printf("排序前数列:\n"); for(p=a;p printf("%d ",*p);