}
③#include
voidmain()
{floatf=13.8;
intn;
n=(int)f%3;
printf(“n=%d\n”,n);
}
3.输入并运行以下程序:
#include
voidmain()
{inti=8,j=10,m,n;
m=++i;n=j++;
printf(“%d,%d,%d,%d\n”,i,j,m,n);
}
分别作以下改动并运行:
①将程序改为:
#include
voidmain()
{inti=8,j=10;
printf(“%d,%d\n”,i++,j++);(8,10)
}
②在①的基础上,将printf语句改为:
printf(“%d,%d\n”,++i,++j);(9,11)
③再将printf语句分别改为:
printf(“%d,%d,%d,%d\n”,i,j,i++,j++);(8,10,8,10)
printf(“%d,%d,%d,%d\n”,++i,++j,i,j);(9,11,8,10)
④程序改为:
main()
{inti=8,j=10,m=0,n=0;
m+=i++;
n-=--j;
printf(“i=%d,j=%d,m=%d,n=%d\n”,i,j,m,n);
}
(i=9,j=9,m=8,n=-9)
4.请将下列给出的两个程序段分别输入计算机后,分析其运行结果:
①voidmain()
{intnum;
num=32767;
printf(“num=%d\n”,++num);
}
②voidmain()
{inta=-2;
printf(“%d,%d\n”,a,a--);
}
实验二、输入输出函数的使用
一、实验目的
掌握数据的输入输出的方法,能正确使用各种格式转换符。
二、实验内容
1.上机输入以下程序:
#include
voidmain()
{
inta,b;
floatd,e;
charc1,c2;
doublef,g;
longm,n;
unsignedintp,q;
a=61;b=62;
c1='a';c2='b';
d=3.56;e=-6.87;
f=3157.890121;g=0.123456789;
m=50000;n=-60000;
p=32768;q=40000;
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=%x\n",f,g,m,n,p,q);
}
运行此程序并分析结果。
2.键盘输入与屏幕输出练习
问题1:
要使下面程序的输出语句在屏幕上显示1,2,34,则从键盘输入的数据格式应为以下备选答案中的哪一个?
#include
main()
{
chara,b;
intc;
scanf("%c%c%d",&a,&b,&c);
printf("%c,%c,%d\n",a,b,c);
}
A)1234B)1,2,34
C)’1’,’2’,34D)1234
问题2:
与上面程序的键盘输入相同的情况下,要使上面程序的输出语句在屏幕上显示1234,则应修改程序中的哪条语句?
怎样修改?
问题3:
要使上面程序的键盘输入数据格式为1,2,34,输出语句在屏幕上显示的结果也为1,2,34,则应修改程序中的哪条语句?
怎样修改?
问题4:
要使上面程序的键盘输入数据格式为1,2,34,而输出语句在屏幕上显示的结果为’1’,’2’,34,则应修改程序中的哪条语句?
怎样修改?
问题5:
要使上面程序的键盘输入无论用下面哪种格式输入数据,程序在屏幕上的输出结果都为’1’,’2’,34,则程序应修改程序中的哪条语句?
怎样修改?
第一种输入方式:
1234↙(以空格作为分隔符)
第二种输入方式:
1234↙(以Tab键作为分隔符)
第三种输入方式:
1↙
2↙
34↙(以回车符作为分隔符)
答案:
D
printf("%c%c%d\n",a,b,c);
scanf("%c,%c,%d",&a,&b,&c);
printf("%c,%c,%d\n",a,b,c);
scanf("%c,%c,%d",&a,&b,&c);
printf("'%c','%c',%d\n",a,b,c);
scanf("%d%d%d",&a,&b,&c);
printf("'%d','%d',%d\n",a,b,c);
3.编程:
由键盘输入学生三门课(英语、数学和程序设计)成绩,计算并输出总成绩、平均成绩。
【编程解析】
(1)程序的输入与输出:
输入三门课的成绩English、math、program,输出总成绩sum及平均成绩average。
(2)数据结构:
intEnglish,math,program,sum;floataverage;
(3)
解决问题的关键算法:
求总成绩:
三门课成绩相加;求平均成绩:
总成绩除以3。
#include
voidmain()
{
intenglish,math,program,sum;
floataverage;
printf("Enterthescoreofenglish,mathandprogram:
\n");
scanf("%d%d%d",&english,&math,&program);
sum=english+math+program;
average=sum/3.0;
printf("sum=%d\t",sum);
printf("average=%5.1f\n",average);
}
程序运行结果如下:
EnterthescoreofEnglish,mathandprogram:
806997↙
sum=246average=82.0
实验三:
选择结构程序设计
【实验目的】
1.了解C语句表示逻辑量的方法,0代表假和1代表真;
2.正确使用关系表达式和逻辑表达式表达条件。
3.熟练掌握if语句和switch语句。
1.有一个函数,定义如下。
用分支结构编写一程序,根据用户输入的自变量
的值,计算函数值。
【参考源程序】
#include"stdio.h"
voidmain()
{floatx;
pintf(“inputx:
\n”);
scanf(“%f”,&x);
if(x<0.0)
printf(“y=0\n”);
elseif(x>=0.0&&x<=50.0)
printf(“y=%f\n”,x);
else
printf(“y=%f\n”,x*x);
}
2.编写一个程序,要求输入一个字符并判断它是字母字符、数字字符、还是其他字符。
【编程解析】
(1)程序的输入与输出:
程序要求输入一个字符ch。
程序要求输出字符的类型,即字母(alpha)、数字(numeric)或其他字符。
(2)数据结构:
charch
(3)解决问题的关键算法:
判断字符的类别:
若字符在’a’到’z’之间或者在’A’到’Z’之间,则字符为字母字符;若字符在'0'到'9'之间,则为数字字符;否则,为其他字符。
【算法流程图】如图2-3所示。
【参考源程序】
#include
main()
{
charch;
printf("Enterancharacter:
");
scanf("%c",&ch);
if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')
printf("%cisanalpha\n",ch);
else
if(ch>='0'&&ch<='9')
printf("%cisanumeric\n",ch);
else
printf("%cisothercharacter\n",ch);
}
程序运行结果如下:
Enterancharacter:
a↙
aisanalpha
或者
Enterancharacter:
*↙
*isothercharacter
此问题求解是比较简单的分支问题,熟悉简单的分支语句就可以为解决复杂的分支语句奠定基础。
3.用switch语句编写程序:
某托儿所收2岁到6岁的孩子,2岁、3岁孩子进小班(Lowerclass);4岁孩子进中班(Middleclass);5岁、6岁孩子进大班(Higherclass)。
编写程序(分别用switch语句和IF语句两种方式编程),输入孩子年龄,输出年龄及进入的班号。
如:
输入:
3,输出:
age:
3,enterLowerclass。
【参考源程序】
#include
main()
{
intage;
printf("Entertheageofchild(2~6):
");
scanf("%d",&age);
switch(age)
{
case2:
case3:
printf(“age:
%d,enterlowerclass”,age);
break;
case4:
printf(“age:
%d,entermiddleclass”,age);
break;
case5:
case6:
printf(“age:
%d,enterhigherclass”,age);
break;
default:
printf(“theageerror\n”);
}
}
4.设计作业
输入整数a和b,若a2+b2大于100,则输入a2+b2百位以上的数字,否则输出两数之和。
实验四 循环结构程序设计
【实验目的】
1.学习循环语句for、while和do-while语句的使用方法;
2.学习用循环语句实现各种算法
3.进一步熟悉TC集成环境的使用方法。
【实验内容】
1.使用while循环求两个正整数的最小公倍数。
【参考源程序】
#include"stdio.h"
voidmain()
{intm,n,result;
printf(“inputtwointegers:
”);
scanf(“%d%d”,&m,&n);
result=mn:
m;
while(!
(result%m==0&&result%n==0))
result++;
printf(“Theleastcommonmultipleofmandnis%d\n”,result);
}
2.打印500以内的“水仙花数”。
“水仙花数”是一个三位数,其各位数立方和等于该数本身。
#include
voidmain()
{
inti,j,k,n;
for(n=100;n<=500;n++)
{
i=n/100;
j=n/10-i*10;
k=n%10;
if(n==i*i*i+j*j*j+k*k*k)
printf("%d\n",n);
}
}
3.编写一个程序,把用户输入的数据累加,直到输入零为止,输出累加的结果。
【编程解析】
(1)程序的输入与输出:
输入若干个数(正数或负数),以0结束输入。
输出输入数据的累加和。
(2)数据结构:
floatsum,d。
(3)关键算法:
求累加和,先将sum初始化为0,每输入一个数d,判断它是否为0,若为0就跳出循环,否则将其累加到sum中。
【算法流程图】如图2-4所示。
【参考源程序】
#include
voidmain()
{
floartsum=0,d;
printf("Enteraserialofnumbersendedby0:
\n");
for(;;)
{
scanf("%f",&d);
if(d==0)break;
sum+=d;
}
printf("sum=%g\n",sum);
}
程序运行结果如下:
Enteraserialofnumbersendedby0:
12 45.624.5306 9 0↙
sum=127.1
该程序实现了累加器的功能。
此思路可扩展到实现任意数的累加、连乘等功能。
4.编写一个程序,输入一个正整数n,求sum=1+(1+2)+(1+2+3)+…+(1+2+3+…+n)的值。
【编程解析】
(1)程序的输入与输出:
输入一个正整数n,输出1+(1+2)+(1+2+3)+…+(1+2+3+…+n)的值。
(2)数据结构:
inti,j,n,s1,sum
(3)解决问题关键算法:
求和。
采用两层循环求解,外层循环i从1到n,内层循环j从1到i。
【算法流程图】如图2-5所示。
【参考源程序】
#include
main()
{
inti,j,n,s,sum=0;
printf("Enteraninteger:
");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
s=0;
for(j=1;j<=i;j++)
s+=j;
sum+=s;
}
print("sum=%d\n",sum);
}
程序运行结果如下:
Enteraninteger:
10↙
sum=220
此题用到循环的嵌套。
多重循环中要处理好各循环之间的依赖关系。
5.设计作业
1键盘输入字符,分别统计字符(不分大小写)、数字、空格和其它符号的个数,遇!
号结束。
相关函数:
getchar()
2输出图案:
* ******
*********
***********
*********
*
实验五函数
【实验目的】
1.学习C语言中函数的定义和调用方法。
2.掌握通过参数在函数间传递数据的方法。
3.学习递归程序设计,掌握递归函数的编写规律。
4.熟悉包含函数调用的程序的调试方法。
5.实验目的:
掌握宏定义、宏调用,以及宏展的处理过程,掌握文件包含的概念和使用。
【实验内容】
程序示例:
功能:
fun函数是一个判断整数是否为素数的函数,使用该函数求1000以内的素数的个数以及它们的平均值。
#include"math.h"
main()
{inta=0,k;/*a保存素数之和*/
floatav;/*av保存1000以内素数的平均值*/
for(k=2;k<=1000;k++)
if(fun(k))/*判断k是否为素数*/
a+=k;
av=a/1000;
printf("av=%f\n",av);
}
fun(intn)/*判断输入的整数是否为素数*/
{inti,y=0;
for(i=2;iif(n%i==0)y=1;
elsey=0;
returny;
}
编程实现:
1.编制求两数相乘的函数。
【参考源程序】
#include"stdio.h"
floatmul(floatx,floaty)
{
floatz;
z=x*y;
return(z);
}
main()
{
floatx,y,z,m;
scanf("%f,%f",&x,y);
z=mul(x,y);
printf("Theresultis%f",&z);
}
2.写两个函数,分别求两个正数的最大公约数和最小公倍数,用主函数调用这两个函数并输出结果。
两个正数由键盘输入。
【参考源程序】
#include"stdio.h"
inthcf(intu,intv)
{
inta,b,t,r;
if(u>=v)
{
t=u;u=v;v=t;
}
a=u;b=v;
while((r=b%a)!
=0)
{
b=a;a=r;
}
return(a);
}
intlcd(intu,intv,inth)
{
return(u*v/h);
}
mian()
{
intu,v,h,l;
scanf("%d,%d",&u,&v);
h=hcf(u,v);
printf("H.C.F=%d\n",h);
l=lcd(u,v,h);
print("L.C.D=%d\n",l);
}
******3~4是递归调用练习*****
3.求x的n次方。
采用递归调用方法计算。
1当n=0时
xn=
x*xn-1当n>0时
本题比较简单,可以直接按照数学公式进行编写。
#include
#include
main()
{
intx,n;
scanf("%d%d",&x,&n);
printf("%d**%d=%d\n",x,n,power(x,n));
}
intpower(intx,intn)
{
if(n==0)
return
(1);
else
return(x*power(x,n-1));
}
4.倒序输出26个英文大写字母。
#include
voidprintletter(charc)
{
if(c>='A')
{
putchar(c);
c--;
printletter(c);
}
}
main()
{charc='Z';
printletter(c);
}
5.全局变量与局部变量,计算运行结果
#include
inta,b=5;
voidmain()
{
inta=10,c;
c=a+b;
printf(“%d%d%d”,a,c,b);
}
6.试分析以下宏替换后的形式,计算输出结果。
要求:
先计算运行结果,然后利用程序验证。
#include"stdio.h"
#defineCX(y)2.5+y
#definePR(a)printf("%d",(int)(a))
#definePR1(a)PR(a);putchar('\n')
main()
{intx=2;
PR1(CX(5)*x);
}
7.定义一个带参数的宏,使两个参数的值互换。
设计主函数调用宏将一维数组a和b的值进行交换。
#include
#definechang(x,y)t=x;x=y;y=t
voidmain()
{
intx,y,t;
printf("Inputtwonumbers:
");
scanf("%d%d",&x,&y);
chang(x,y);
printf("x=%d,y=%d\n",x,y);
}
实验六一维数组
【实验目的】
1.掌握一维数组的定义、赋值和输入输出的方法;
2.掌握字符数组和字符串处理函数的使用;
3.学习用数组实现相关的算法(如排序、求最大和最小值、对有序数组的插入等);
【实验内容】
1.调试程序实现功能:
青年歌手参加歌曲大奖赛,有10个评委对她的进行打分,试编程求这位选手的平均得分(去掉一个最高分和一个最低分)。
分析:
本题的核心是排序。
将评委所打的10个分数利用数组按增序(或降序)排列,计算数组中除第一个和最后一个分数以外的数的平均分,其中排序部分这里用选择法实现。
【参考源程序】
voidmain()
{
inti,j,min,max;
floattemp,ave=0;
floata[11];
printf("\n输入评委所打的分数:
\n");
for(i=1;i<=10;i++)
scanf("%f",a[i]);
for(i=1;i<=9;i++)
{
min=i;
for(j=i+1;j<=10;j++)
if(a[min]>a[j])
min=j;
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
for(i=2;i<=9;i++)/*注意i值的变化范围*/
ave=ave+a[i];
printf("选手所得最后分数:
%6.1f",ave/8);
printf("\n");
}
2.输入一串字符,计算其中空格的个数。
【参考源程序】
#include
main()
{charc[30];
inti,sum=0;
gets(c);
for(i=0;iif(c[i]=='')
sum=sum+1;
print("空格数为:
%d\n",&sum);
}
3.有一递推数列,满足:
。
使用数组编写程序,顺序打印出
的值。
【参考源程序】
#include"stdio.h"
voidmian()
{