第3章
上 机 实 验




实验1顺序结构程序设计
【实验目的】

1. 熟悉C编译系统集成环境及基本操作方法,掌握在该系统上如何编辑、编译、连接和运行一个C程序。
2. 掌握表达式的运算以及表达式语句的用法。
3. 掌握各种类型数据的输入、输出方法,正确使用各种格式说明。
4. 掌握顺序结构程序设计方法及程序调试方法。
5. 掌握数学函数的使用。
【实验内容】
1. 进入C编译系统集成环境,熟悉集成环境界面和有关菜单的使用方法。
2. 运行下面程序,并分析输出结果。
(1) 请将以下程序段补充完整。

char c;

int a;

long m;

float f;

double d;

c='a';	//e1

a=61;				

m=50000;

f=333.3456789; 				

d=123456789.123456789;		  //e2

printf("c=%c\na=%d\nm=%d\n",c,a,m);

printf("f=%f\nd=%15.6f\n",f,d);

(2) 编译、连接、运行此程序,记录并分析结果。
(3) 完成以下修改。
① 请用/*…*/将e1行至e2行之间的赋值语句注释起来,改用scanf函数输入数据,添加scanf函数如下: 

scanf("%c%d%ld%f%lf", &c, &a, &m, &f, &d);

编译、连接、运行此程序。
数据按照如下方式输入: 

a 61 50000 333.3456789 123456789.123456789↙

记录并分析结果。
② 若要求输入数据之间用逗号分隔,请用//将上述scanf函数注释起来,重写scanf函数。
③ 删去输入项表列中的&,运行程序,观察并分析运行结果。
(4) 请将步骤(3)scanf函数中的%ld和%lf分别改为%d和%f,运行程序,观察并分析运行结果。
(5) 思考。
对照程序和运行结果,回答如下问题: 
① 若漏写scanf函数输入项表列中的取地址运算符&,会出现什么情况?
② 举例说明调用scanf函数输入数据时,数据间应该怎样分隔。
3. 编写程序,上机编译、连接、运行程序并分析结果。
(1) 从键盘输入一个小写英文字母,将其转换为大写字母后,输出转换后的大写字母及其十进制的ASCII值。
(2) 从键盘输入圆的半径,计算并输出圆的周长、圆的面积和圆球的体积(保留2位小数)提示: 圆的周长l=2πr,面积s=πr2,球体积v=43πr3。
(3) 定义两个整数,通过键盘输入两个整数的值,计算它们的和、差、积、商,并输出。


第
3
章上机实验


C语言程序设计学习指导(第2版)

实验2选择结构程序设计
【实验目的】


1. 利用if语句及if语句的嵌套实现选择结构程序设计。
2. 利用switch语句实现选择结构程序设计。
3. 能够编写选择结构的程序,解决实际问题。
4. 学会调试程序的方法。
【实验内容】
1. 运行实现以下分段函数的程序,并分析输出结果。
y=x4+1(0<x<5)

0(x=0)

|x|+4其他

#includestdio.h

#includemath.h

int main(void)

{

int x,y;

scanf("%d",&x);

if(0x5)  

y=pow(x,4)+1;

else if(x=0);

y=0;

else 

y=fabs(x)+4;

printf("x=%df,y=%d\n",x,y);  

return 0;

}

(1) 对源代码进行编译,解读相关的编译信息; 修改程序的语法错误与逻辑错误; 分析数学表达式与C语言表达式之间的联系与区别。
(2) 分别测试当x为2.2,0,-3.2时程序的运行结果。
(3) 单步调试程序,分析if语句的执行过程。
2. 已知平面上三个点的坐标分别是(2,4)、(4,8)和(-1,-2),判断这三点是否共线。
3. 从键盘输入平面上三个点的坐标A(x1,y1)、B(x2,y2)、C(x3,y3),检验它们能否构成三角形。若不能,则输出相应的信息; 若能,则输出三角形的面积和周长。
(1) 程序分析: 已知两点的坐标,可以使用两点间距离公式计算两点间距离。组成三角形的条件是三角形两边之和大于第三边。已知三条边的长度,可以根据海伦公式求面积。注意表达式的书写和分支条件的设定。
(2) 对源代码进行编译,若存在编译错误,根据提示修改源代码。运行测试用例数据,如表31所示,若结果有误,则设置断点,利用断点调试运行。


表31测试用例


序号输入输出


1点A坐标: 4,5

点B坐标: 6,9

点C坐标: 7,8周长=10.13,面积=3.00
2点A坐标: 4,6

点B坐标: 8,12

点C坐标: 12,18这三个点不能组成三角形

4. 输入任意一个字母,作为中间字母,输出三个相邻的字母。假设字母z与字母a是相邻的。若输入z,则输出yza; 若输入a,则输出zab; 若输入c,则输出bcd。
5. 模拟两个人的输入(石头、剪刀、布),判断谁是胜利者。
实验3循环结构程序设计
【实验目的】


1. 熟练使用for、while和dowhile语句实现循环程序设计。
2. 理解循环条件和循环体,以及for、while和dowhile语句的相同及不同之处。
3. 掌握循环嵌套结构的使用; 掌握分支结构、循环结构的综合应用。
4. 掌握break和continue语句的使用。
【实验内容】
1. 编程求∑ni=1i!的值。
(1) 用二重循环实现求和。
(2) 用一重循环实现求和。
(3) 分析结果: 
① 输入一个较小的正整数,分析程序执行结果。
② 输入0或一个负数,分析程序执行结果。
③ 输入一个较大的正整数,分析程序执行结果。思考: 存放阶乘、阶乘和的变量应该用什么类型的数据?
④ 修改程序,当输入数据非法时,给出一个恰当提示。
2. 找出1000以内的所有“完数”。“完数”就是这样一个整数,它恰好等于它的因子之和。例如,6的因子为1、2、3,而6=1+2+3,则6是完数。

#includestdio.h

int main(void)

{

int n,m,k;

for(n=1;n=1000;n++)

{

k=0;

for(m=1;mn;m++)

if(n%m==0)

①

if(n==k)

printf("%d ",n);

}

return 0;

}

(1) 请填空,使程序完整,分析其执行过程。
(2) 还能再修改“for(m=1;m<n;m++)”循环条件以减少循环次数吗?
(3) 思考: 语句“k=0;”能在变量赋初值部分给出吗(多重循环要注意变量赋初值的位置)?
(4) 若不仅输出完数,还输出其各个因子,如输出“6的因子有1、2、3”,如何修改程序?
3. 思考以下程序的运行结果,并上机验证,体会break与continue的区别。

#includestdio.h

int main(void)

{

int n,m;

for(n=1;n=10;n++)

{

if(n==5)

break;

printf("%d",n);

}

printf("\n");



for(m=1;m=10;m++)

{

if(m==5)

continue;

printf("%d",m);

}

return 0;

}

4. 给定1、2、3、4四个数字,请输出所有由它们组成的无重复数字的三位数。输出整数的顺序要求从小到大排列,每行六个整数。
问题分析: 这个问题可以通过穷举每一位和每个允许的数字的排列来解决。可以采用三重循环,每重循环对应三位数中的一位,每重循环循环四次(1、2、3、4)。

5. 用公式π/4≈1-13+15-17+…+(-1)n-112n-1求π的值。当最后一项的绝对值小于10-4时可认为达到了精度要求。

实验4数组
【实验目的】


1. 掌握一维数组的定义及使用。
2. 掌握二维数组的定义及使用。
3. 掌握字符数组的定义及使用。
【实验内容】
1. 运行以下程序: 

#includestdio.h

int main(void)

{

char s[20];

gets(s);

puts(s);

return 0;

}

(1) 从键盘输入“How are you”,观察输出结果。
(2) 将gets(s)改为scanf("%s",s),重新运行程序,观察输出结果有什么不同,分析原因。
(3) 如果用%c格式符输入/输出字符串,程序该如何修改?
2. 以下程序的功能是从键盘输入十个数,检查3是否包含在这些数中,若包含,则输出第一个3出现的位置。检验程序是否正确,若有错误,请找出并改正。

#include stdio.h

int main(void)

{

int a[10];

i=0;

while(i10)

scanf("%d",a[i]);

i++;

for(i=0;i10;i++);

if(a[i]=3)  

printf("%d\n",i);  

continue;

if(i=10)  

printf("not found!\n");

return 0;

}

3. 以下程序的功能是将字符串中的数字字符删除。检验程序是否正确,若有错误,请找出并改正。

#includestdio.h

int main(void)

{

char a[10];

int i,j;

gets(a);

for(i=0,j=0;a[i]!='\0';i++,j++)

if(a[i]0 || a[i]9)  

a[j]=a[i];

puts(a);

return 0;

}

4. 编写程序,将某数插入到一维数组中某处,如将8插入到数组2,3,5,0,9,6的第3个位置,插入后数组为2,3,8,5,0,9,6。要插入的数及其插入位置由键盘输入。
5. 编写程序,将4行、5列的二维数组的第0行与第2行对调。
6. 输入元素个数n(n≤10),再输入n个整数,存放在一个数组中,计算这n个数的平均数和中位数。中位数的计算方法是: 把数据按大小排序,如果数据个数是奇数,则中间那个数就是中位数; 如果数据个数是偶数,则中间两个数的平均值就是中位数。
实验5函数
【实验目的】


1. 掌握函数的定义方法。
2. 掌握函数的调用方法。
3. 掌握函数的实参与形参的对应关系。
【实验内容】
1. 写出以下程序的运行结果,然后上机验证。
(1) 

#includestdio.h

int x=20;

void f1(int x)

{

x+=10;

printf("f1: %d\n",x);

}

void f2()

{

x+=10;

printf("f2: %d\n",x);

}

int main(void)

{

int x=10;

f1(x);

f2();

printf("main: %d\n",x);

return 0;

}

(2) 

#includestdio.h

int fun(int a)

{

int b=0;

static int c=0;

b++;

c++;

return a+b+c;

}

int main(void)

{

int i;

for(i=0;i3;i++)

printf("%d\n",fun(i));

return 0;

}

思考: 如果将程序中的static删除,运行结果会有什么不同?为什么?
2. 下面add函数的功能是求两个参数之和并将其作为函数返回值。请检验函数是否正确,若有错误,请改正并将主函数补充完整。

#includestdio.h

void add(int a,int b);

{

int c;

c=a+b;

}

int main(void)

{

int x,y,z;

scanf("%d%d",&x,&y);

z=①;//调用函数,计算x、y之和

printf(②); //输出x、y之和

return 0;

}

3. 下面程序的功能是统计一维数组中负数的个数。检验程序是否正确,若有错误,请找出并改正。

#includestdio.h

int main(void)

{

int x[6],i,y;

for(i=0;i6;i++)  scanf("%d",&x[i]);

sum(int x[],6);

printf("%d\n",y);

return 0;

}

void sum(int a[],int n)

{

int i,m;

for(i=0;in;i++)

if(a[i]0)  m++;

return m;

}

4. 编写一个函数,功能是求两个正整数的最大公约数。数据的输入与输出在主函数中完成。用递归与非递归两种方法完成。
5. 素数是只能被1和自身整除的正整数。试实现一个判断素数的函数,并利用该函数验证哥德巴赫猜想,即任何一个大于6的偶数均可表示为两个奇素数之和。
6. 用一维数组作函数参数,实现学生成绩管理系统。
(1) 输入每个学生的学号和一门课的成绩。
(2) 计算平均成绩及高于平均分的人数。 
(3) 按成绩由高到低排出名次表。
(4) 按学号查询学生成绩。
(5) 输出每个学生的学号、成绩。
实验6指针
【实验目的】


1. 掌握指针的概念、定义方法及基本操作。
2. 掌握通过指针操作数组元素的方法。
3. 掌握通过指针操作字符串的方法。
4. 掌握指针数组和指向指针的指针的概念、定义方法及使用方法。
【实验内容】
1. 程序改错。

#includestdio.h

int  main(void)

{

float *p;

scanf("%f",p);

printf("%f\n",*p);

return 0;

}

运行该程序,找出程序出错原因。改正错误,运行程序,得到正确结果。
2. 输出数组a的10个元素。以下程序正确吗?若有错,请改正并上机验证。

#includestdio.h

int  main(void)

{	

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

for(i=0;i10;i++)

{

printf("%d  ",*a);

a++;

}

return 0;

}

3. 分析以下程序运行后的输出结果,并上机验证。

#includestdio.h

int  main(void)

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

char  *q="abcde";

b=*++p;

printf("\n%d",b);

printf("\n%d  %d  %d  %d",*a,*(a+2),*(p+1),p[1]);

printf("\n%d  %c  %s  %s",*q,q[3],q+3,q);

return 0;

}

4. 输入3个整数,按由小到大的顺序输出。请补充并且修改程序,运行该程序,得到正确的结果。

#includestdio.h

int main(void) 

{   	

int a,b,c;

int *pa=&a, *pb=&b,*pc=&c;

printf("input 3 integer a,b,c:");

scanf("%d,%d,%d",&a,&b,&c); //e1

if (ab)//e2

{pt=pa; pa=pb; pb=pt;}

if (*pa*pc)	{①; pa=pc; pc=pt;}

if (*pb*pc)	{pt=pb;②;pc=pt;}

printf("%d,%d,%d\n",a,b,c);        	  //e3

return 0;

}

解决以下问题:  
(1) 程序e1行的输入语句是否可以改为“scanf("%d,%d,%d",pa,pb,pc);”?
(2) 程序e2行的if语句中的条件是否可以改为“*pa>*pb”?
(3) 程序e3行的输出语句是否正确?如果不正确应如何修改?
(4) 仿照上面程序,编写输入3个字符串并按由小到大的顺序输出的程序。
(5) 比较分析这两个程序,用指针处理整数与字符串有什么不同?例如: 
① 如何得到指向整数或字符串的指针?
② 如何比较两个整数或字符串的大小?
③ 如何交换两个整数或字符串?
5. 输入10个数,按与输入时相反的顺序将其输出。
实验7指针与函数
【实验目的】

1. 掌握指针变量作函数参数的使用方法。
2. 掌握返回值为指针的函数的概念、定义方法及使用方法。
3. 掌握指向函数的指针的概念、定义方法及使用方法。
4. 掌握指针数组作main()函数参数的使用方法。
【实验内容】
1. 输入3个整数,按由小到大的顺序输出。请补充并运行以下程序,得到正确的结果。

#includestdio.h

int main(void) 

{

int a,b,c;