C编程例题

更新时间:2023-09-25 15:04:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《C语言程序设计》习题集

第1章 C语言概述

1.1 c语言程序的总体结构是怎样的。

解:一个完整的c语言程序,是由一个、且只能由一个main()函数(又称主函数)和若 干个其他函数结合而成的,或仅由一个main()函数构成。

1.2 c语言程序的基本单位是什么?它的结构又如何? 解:函数是c语言程序的基本模块单元。

任何函数(包括主函数main())都是由函数说明和函数体两部分组成。其一般结构如下: [函数类型] 函数名(函数参数表)

{ 说明语句部分;

执行语句部分; }

1.3主函数main()在程序中的地位如何。程序总是从哪个函数开始执行,到哪个函数执行完后结束? 解:main()函数的作用相当于其他高级语言中的主程序;其他函数的作用相当于子程序。 一个c语言程序,总是从main()函数开始执行,而不论其在程序中的位置。当主函数执 行完毕时,亦即程序执行完毕。习惯上,将主函数main()放在最前头。 1.4 c语言的语句分为哪几类?

解:按照语句功能或构成的不同,可将c语言的语句分为五类。 控制语句、函数调用语句、表达式语句、空语句和复合语句。

1.5执行一个c语言程序的一般过程是什么? 解:运行一个c语言程序的一般过程,如下图所示。

逻辑错误

启动TC 编辑或修改源程序 编译 连接 运行 退出TC(结束) 语法错误

1)启动Tc,进入Tc集成环境。 2)编辑(或修改)源程序。

3)编译。如果编译成功,则可进行下一步操作;否则,返回2)修改源程序,再重新编译,直至编译成功。 4)连接。如果连接成功,则可进行下一步操作;否则,根据系统的错误提示进行相应修改,再重新连接,直至连接成功。

5)运行。通过观察程序运行结果,验证程序的正确性。 6)退出Tc集成环境,结束本次程序运行。

1.6在Tc集成环境下,下列操作的快捷键分别是什么

解:存盘:F2;编译与连接:F9;运行:nF9;查看运行结果:Alt+F5。

第2章 数据类型、运算符与表达式

2.1 指出下列变量名中,哪些是合法的,哪些是非法的。如果非法,为什么? Int,char,345,ABdf,c&d,string*,_322,alpf_beat,JOHN.smith,3ab 解:ABdf,_322,alpf_beat合法,其它的非法

1

Int,char非法是因为它们都是C语言关键字;

345,3ab非法是因为变量名不能以阿拉伯数字开头;

c&d,string*,JOHN.smith非法是因为变量名中只能由字母、数字和下划线组成。 2.2 计算下列表达式的值

(1)a+b%3*(int)(a-b)/4 (设a=13.6,b=8) (2)(x+y)/2+(int)x%(int)y (设x=4.5,y=2.5) (3)z*=3+6,z/z=z/2,z+=z-=z*=z (设z=6) 解:(1) 15.600000;(2)3.500000;(3)0。

第3章 顺序结构程序设计

3.1 若a=3,b=4,c=5,x=1.2,y=2.4,z=-3.6,u=51274,n=128765, c1=‘a’,c2=‘b’。想得到以下输出格式和结果,请写出程序(包括定义变量类型和设计输出)。 a=□3□□b=□4□□c=□5

x=1.200000,y=2.400000,z=-3.600000 x+y=□3.600□□y+z=-1.20□□z+x=-2.40 c1=ˊaˊ□or□97(ASCII) c2=ˊbˊ□or□98(ASCII) (□表示空格,下同)

参考源程序如下: main()

{int a=3,b=4,c=5;

long int u=51274,n=128765; float x=1.2,y=2.4,z=3.6; char c1='a',c2='b';

printf(\ printf(\

printf(\ printf(\

printf(\ printf(\ }

3.2用scanf下面的函数输入数据,使a=3,b=7,x=8.5,y=71.82, c1=ˊAˊ,c2=ˊaˊ,问在键盘上如何输入?

main() {

int a,b;float x,y;char c1c2; scanf(\,&a,&b); scanf(\,&y); scanf(\,&c1,&c2); }

输入方法如下:

a=3□b=7

□x=8.5□y=71.82 □c1=A□c2=a

2

3.2 设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。用scanf输入数据,输出计算结果,输出时要求文字说明,取小数点后两位数字。请编程序。

参考源程序: main()

{float r,h,C1,Sa,Sb,Va,Vb; scanf(\ C1=2*3.14*r; Sa=3.14*r*r; Sb=4*Sa;

Va=4*3.14*r*r*r/3; Vb=Sa*h;

printf(\

printf(\ }

3.3输入一个华氏温度,要求输出摄氏温度。公式为参考源程序如下: main()

{float F,c;

scanf(\ c=5*(F-32)/9;

printf(\输入的华氏温度为:%.2f,}

3.4 已知三角形的三边长,求其面积。解:假设输入的三边能构成三角形,三角形的面积公式为: Area=s(s?a)(s?b)(s?c)

其中S=(a+b+c)/2。

参考源程序如下:

#include “math.h” Main() {

Float a,b,c,s,area;

Printf(“请输入三角形的三边Scanf(“%f,%f,%f”,&a,&b,&c); S=(a+b+c)/2.0;

Area=sqrt(s*(s-a)*(s-b)*(s-c));

Printf(“三角形的三边为:Prinft(“三角形的面积为: }

4.1 写出下面表达式的值(设a=1,b=2,c=3,x=4,y=3)

c=5(F-32)/9,输出要求有文字说明,取位2小数。 %.2f\

”,a,b,c);

3

则摄氏温度为

:”); %7.2f, %7.2f, %7.2f\\n%7.2f\\n”,area);

第4章 选择结构程序设计(1)a+b>c&&b==c

(2)!a=x+y)?c-a:y-x (4)!(x=a)&&(y=b)&&0 (5)!(a+b)+c-1&&b+c/2 (6)a||1+’a’&&b&&’c’

解:(1)0;(2)1;(3)2;(4)0;(5)1;(6)1。

4.2有三个整数a、b、c,由键盘输入,输出其中最大的数。 参考源程序: main()

{int a,b,c,t;

scanf(\ if(a>b)

if(a>c) t=a; else t=c;

else if(b>c) t=b; else t=c;

printf(\ }

4.3给出一百分制成绩,要求输出成绩等级'A'、'B'、'C'、'D'、'E'。90分以上为'A',80~89分为'B',70~79分为'C',60~69分为'D', 60分以下为'E'。

参考源程序: main()

{int number,md;char c1; scanf(\ md=number/10; switch(md) {

case 10:

case 9: c1='A';break; case 8: c1='B';break; case 7: c1='C';break; case 6: c1='D';break; case 5: case 4: case 3: case 2: case 1:

case 0: c1='E';break; }

printf(\ }

4.4给一个不多于5位的正整数,要求:①求出它是几位数;②分别打印出每一位数字;③按逆顺序打印出各位

4

数字,例如原来为321,应输出123。

参考源程序: main()

{int a,b,c,d,e,n;long m; scanf(\ a=0.0001*m;

b=10*(0.0001*m-a);

c=100*(0.0001*m-a-0.1*b);

d=1000*(0.0001*m-a-0.1*b-0.01*c);

e=m-10000*a-1000*b-100*c-10*d;

if(a!=0)

n=5,printf(\

else if(b!=0) n=4,printf(\ else if(c!=0) n=3,printf(\ else if(d!=0) n=2,printf(\ else n=1,printf(\ }

4.5企业发放的奖金根据利润提成。利润(I)低于或等于10万元的,奖金可提10%;利润高于10万元,低20万元(10000010000000时,超过100万元的部分按1%提成。从键盘输入当月利润I,求应发奖金总数。 要求:⑴用if语句编程序;⑵用switch语句编程序。 ⑴用if语句编程序: main()

{int a,b,c,d,e;float d1=0.01,d2=0.015,d3=0.03,d4=0.05,d5=0.075,d6=0.10;

double jj,k;long i; scanf(\

k=0.00001*i;a=k-10;b=k-6;c=k-4;d=k-2;e=k-0; if(a<0) a=0; if(b<0) b=0; if(c<0) c=0; if(d<0) d=0;

jj=a*d1+(b-a)*d2+(c-b)*d3+(d-c)*d4+(e-d)*d5+(k-e)*d6; printf(\ }

⑵用switch语句编程序: main()

{ int a,b,c,d,e,n,x;

float d1=0.01,d2=0.015,d3=0.03,d4=0.05,d5=0.075,d6=0.10;

double jj,k;long i; scanf(\

k=0.00001*i;a=k-10;b=k-6;c=k-4;d=k-2;e=k-0;x=k; switch(x)

{case 0:e=0;

5

case 1:d=0; case 3:c=0; case 5:b=0;

case 9:a=0; default:n=0;

}

jj=a*d1+(b-a)*d2+(c-b)*d3+(d-c)*d4+(e-d)*d5+(k-e)*d6; printf(\ }

4.6输入四个整数,要求按大小顺序输出。 参考源程序:

main()

{ int a,b,c,d,t;scanf(\ if(a

printf(\ }

4.7有四个圆塔,圆心分别为(2,2),(-2,2),(-2,-2),(2,-2),圆半径为1。见下图。这四个塔的高度为10米,塔外无建筑物。今输入任一点的坐标,求该点的建筑物高度(塔外高度为零)。

参考源程序:

#include\ main()

{ float x,y,n,m,r;int h; scanf(\ n=fabs(x);m=fabs(y);

r=sqrt((n-2)*(n-2)+(m-2)*(m-2)); if(r>1) h=0; else h=10;

printf(\ }

第5章 循环结构程序设计

5.1求∑n!(n=1->20),(即求1!+2!+3!+4!+5!+?+20!) 参考源程序: main()

{ int n,i=1;long sum=0,s=1; scanf(\ while(i<=n)

{s=s*i;sum=sum+s;i++;}

6

printf(\

}

5.2输入两个正整数m和n,求其最大公约数和最小公倍数。 main()

{long m,n,i=1,j,s;

scanf(\ for(;i<=m&&i<=n;i++)

{if(m%i==0&&n%i==0) s=i;} if(m>=n) j=m; else j=n;

for(;!(j%m==0&&j%n==0);j++); printf(\ }

5.3输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。 参考源程序:

#include\ main()

{char c;int i=0,j=0,k=0,l=0; while((c=getchar())!='\\n')

{if(c>=65&&c<=90||c>=97&&c<=122) i++; else if(c>=48&&c<=57) j++; else if(c==32) k++; else l++;

}

printf(\ }

5.4求Sn=a+aa+aaa+?+aa?aaa(有n个a)之值,其中a是一个数字。例如:2+22+222+2222+22222(n=5),n由键盘输入。

参考源程序:

#include\ main()

{ int n,sum=0,i=1,s=2; scanf(\ while(i<=n)

{sum=sum+s;s=s+2*pow(10,i);i++;} printf(\ }

5.5打印出所有\水仙花数\,所谓\水仙花数\是指一个三位数,其各位数字立方和等于该本身。例如:153是一个水仙花数,因为153=1^3+5^3+3^3。

参考源程序:

#include\ main()

{ int x=100,a,b,c;

7

while(x>=100&&x<1000)

{a=0.01*x;b=10*(0.01*x-a);c=x-100*a-10*b;

if(x==(pow(a,3)+pow(b,3)+pow(c,3))) printf(\

x++; }

}

5.6一个数如果恰好等于它的因子之和,这个数就称为\完数\。例如,6的因子为1、2、3,而6=1+2+3,因此6是\完数\。编程序找出1000之内的所有完数,并按下面格式输出其因子:

6 its factors are 1、2、3 参考源程序: main()

{int m,i,j,s;

for(m=6;m<10000;m++) {s=1;

for(i=2;i

{printf(\ printf(\ } } 或 main()

{int m,i,j,s;

for(m=6;m<1000;m++) {s=m-1;

for(i=2;i

{printf(\ printf(\ } }

5.7有一分数序列:

2/1,3/2,5/3,8/5,13/8,21/13? 求出这个数列的前20项之和。 参考源程序: main()

{int i=1,n;double t,x=1,y=2,s,sum=0; scanf(\

while(i<=n) {s=y/x;sum=sum+s;t=y;y=y+x;x=t;i++;} printf(\ }

8

5.8一球从100米高度自由下落,每次落地后返回原高度的一半,再落下。求它在第10次落地时共经过多少米?次反弹多高?

参考源程序: main()

{int i,n;double h=100,s=100; scanf(\ for(i=1;i<=n;i++) {h*=0.5;

if(i==1) continue;s=2*h+s; }

printf(\ }

5.9猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩

参考源程序: main()

{int i=1,sum=0;

for(;i<=10; i++); sum=2*sum+1; printf(\ }

5.10用迭代法求x=a。求平方根的迭代公式为: Xn+1=(Xn+1/Xn)/2

0.00001参考源程序:

#include\ main()

{float x0,x1,a; scanf(\ x1=a/2; do

{x0=x1;x1=(x0+a/x0)/2;}while(fabs(x0-x1)>=0.00001); printf(\ }

5.11用二分法求方程在(-10,10)之间的根 2x3-4x2

+3x-6=0 参考源程序: main()

{double x1,x2,y1,y2;x1=-10;x2=10; do{y1=2*x1*x1*x1-4*x1*x1+3*x1-6;

x1=x1-y1/(6*x1*x1-8*x1+3);}while(y1!=0); do{y2=2*x2*x2*x2-4*x2*x2+3*x2-6;

10天早上想再吃时,见只剩9

第10下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。到第下一个桃子了。求第一天共摘多少桃子。

要求前后两次求出的得差的绝对值少于。

x2=x2-y2/(6*x2*x2-8*x2+3);}while(y2!=0); printf(\ }

5.12打印以下图案 * *** ***** ******* ***** *** *

参考源程序:

#include\ main()

{int i=1,k,l,m; for(;i<=49;i++)

{k=i%7;l=3-fabs((i-1)/7-3);m=fabs(i-4-7*((i-1)/7)); if(k==1) printf(\ if(m<=l) printf(\ else printf(\ printf(\ }

第6章 数组

6.1用筛选法求100以内的素数。 参考源程序: main()

{int i,j,a[100]; for(i=2;i<100;i++) {a[i]=i;

for(j=2;j<=i;j++)

{if(j

if(a[i]-j==0) printf(\

}

printf(\ } 或

#include\ main()

{static int i,j,k,a[98]; for(i=2;i<100;i++) {a[i]=i;k=sqrt(i); for(j=2;j<=a[i];j++)

10

if(j=k+1) printf(\ }

printf(\ }

6.2求一个矩阵对角线元素之和。

解:以3*3矩阵为例,参考源程序如下: main()

{int i=0,j=0,a[3][3],s1,s2; for(i=0;i<3;i++)

for(j=0;j<3;j++) scanf(\ s1=a[0][0]+a[1][1]+a[2][2]; s2=a[0][2]+a[1][1]+a[2][0]; printf(\ }

6.3一个已按从小到大的顺序排好的数组,今输入一个数要求按原来排序的规律将它插入数组中。 解:我们以一个10元素的数组为例,参考源程序如下: main()

{static int a[10]={1,7,8,17,23,24,59,62,101};int i,j,t; scanf(\ for(i=9;i>0;i--)

if(a[i]

printf(\

}

6.4将一个数组的值按逆序重新存放,例如,原来顺序为:8,6,5,4,1。要求改为:1,4,5,6,8。 参考源程序: main()

{int i,b[10];

for(i=0;i<10;i++) scanf(\ for(i=9;i>-1;i--) printf(\ printf(\

}

6.5 打印出以下杨辉三角形(要求打印出10行)。 1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

11

∶ ∶

参考源程序: main()

{static int m,n,k,b[15][15]; b[0][1]=1;

for(m=1;m<15;m++) { for(n=1;n<=m;n++)

{b[m][n]=b[m-1][n-1]+b[m-1][n]; printf(\

printf(\}

}

6.6找出一个二位数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小,也可能没有鞍点。 参考源程序: #define N 10 #define M 10 main() {

int I,j,m,n,flag1,flag2,a[N][M],max,maxj; /*输入二维数组array1*/

printf(“输入二维数组的行数:”); scanf(“%d”,&n);

printf(“输入二维数组的列数:”); scanf(“%d”,&m);

printf(“输入二维数组:\\n”); for(i=0;i

prinf(“请输入a[-][-]:”,I,j); scanf(“%d”,&a[i][j]); }

printf(“\\n”); /*输出数组*/

prinf(“二维数组为:\\n”); for(i=0;i

for(j=0;j

/*寻找鞍点*/

flag2=0; /*flag2作为数组中是否有鞍点的标志*/ for(i=0;i

max=a[i][0];

12

for(j=0;jmax) { max=a[i][j]; maxj=j; }

for(k=0,flag1=1;ka[k][maxjj])/*判断行中的最大值是否也是列中的是大值*/ flag1=0; if(flag1)

{ printf(“\\n第%d行第%d列的%d是鞍点\\n”,j,maxj,max); flag2=0; } }

if(!flag2) printf(“\\n无鞍点!\\n”); }

6.7 从键盘上输入多个字符,编程统计其中字母、空格、数字及其他字符的个数。 参考源程序:

#include “stdio.h” Main() {

char str[40];

int alphabet=0,digit=0,space=0,other=0,i=0; printf(“请输入一串字符:\\n”); gets(str);

while(str[i]!=’\\o’) {

if((‘A’<=str[i])&&(str[i]<=’Z’)||&&(‘a’<=str[i])&&(str[i]<=’z’)) ++alphabet;

else if(str[i]==’ ‘) ++space;

else if((str[i]<=’9’)&&(str[i]>=’0’)) ++digit; else ++other; }

Printf(“其中有%d个字母,%d个空格,%d个数字,%d个其他字符!”,alphabet,space,digit,other); }

6.8 有n个学生,学习m门课程,已知所有学生全部课程的成绩,要求输出每门课程最高分的学生学号、课程代号和成绩。

参考源程序: #define N 50 #define m 20 main() {

char a[N][10];

13

float score[N][M],max_score; int n,m,i,j,studid;

/*输入学生的学号和各门课程的成绩*/ printf(“请输入学生数n和课程数m;”); scanf(“%d,%d”,&n,&m); for(i=1;i<=n;i++)

{ printf(“请输入第%d位学生的学号:”,i); scanf(“%s”,a[i]);

printf(“请按课程顺序输入成绩:”); for(j=1;j<=m;j++)

scanf(“%f”,&score[i][j]); }

/*找出每门课程最高的学生学号、课程代号和成绩并输出*/ For(j=1;j<=m;j++) {

studid=1;max_score=score[1][j];

for(i=1;i<=n;i++)

if(score[i][j]> max_score) { max_score=score[i][j]; studid=i; }

Printf(“第%d门课程最高分的学生学号是:%s,成绩为:%.2f\\n”,j,a[studid],max_score); } }

第7章 函数

7.1 写出函数定义的一般形式,并说明各部分的意义。 解:(略)

7.2 函数调用有哪几种形式,各自有什么特点? 解:在C语言中,可以用以下几种方式调用函数: (1) 函数表达式。函数作为表达式的一项,出现在表达式中,以函数返回值参与表达式的运算。这种方式要

求函数是有返回值的。

(2) 函数语句。C语言中的函数可以只进行某些操作而不返回函数值,这时的函数调用作为一各独立的语句。 (3) 函数实参。函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,

因此要求该函数必须是有返回值的。

7.3写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。

解:参考源程序:

int maxyueshu(int m,int n) {int m,n; int i=1,t;

for(;i<=m&&i<=n;i++)

{if(m%i==0&&n%i==0) t=i;}

14

return(t); }

int minbeishu(int m,int n) {int m,n; int j;

if(m>=n) j=m; else j=n;

for(;!(j%m==0&&j%n==0);j++); return j; } main()

{int a,b,max,min;

printf(\ scanf(\ max=maxyueshu(a,b); min=minbeishu(a,b);

printf(\ }

2222

7.4 求方程ax+bx+c=0的根,用三个函数分别求当b-4ac>0、b-4ac=0和b-4ac<0时的根,并输出结果。从主函数输入a、b、c的值。 解:参考源程序:

#include\

2

/* 求b-4ac>0时的根*/

float yishigen(float m,float n,float k)

{ float m,n,k; float x1,x2;

x1=(-n+sqrt(k))/(2*m); x2=(-n-sqrt(k))/(2*m);

printf(\ }

2

/* 求b-4ac=0时的根*/

float denggen(float m,folat n)

{ float m,n; float x;

x1=x2=-n/(2*m);

printf(\ }

2

/* 求b-4ac<0时的根*/

float xugen(float m,float n,float k)

{ float m,n,k; float x,y; x=-n/(2*m);

y=sqrt(-k)/(2*m);

printf(\ }

15

main()

{float a,b,c,q;

printf(\ scanf(\ printf(\ q=b*b-4*a*c;

if(q>0) yishigen(a,b,q); else if(q==0) denggen(a,b); else xugen(a,b,q); }

7.5写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息。 解:参考源程序:

/*是素数返回1,否则返回0*/ int sushuis(int m)

{ int m; int i=2,t; for(;i<=m;i++)

if(m%i==0&&i

main()

{ int a,s;

printf(\ scanf(\ s=sushuis(a);

if(s==1) printf(\是素数!\\n\ else printf(\不是素数!\\n\ }

printf(\ printf(\ }

7.6编一个函数fun(char *s)把字符串中的内容逆置。例如:字符串中原有的内容为:gfedcba,则调用该函数后,串中的内容为:abcdefg。

解:程序分析:该题的算法是先分别找出字符串的两头,然后同时逐一往中间移动,每移动一次都进行两字符的位置对换,直到中间字符(用s+i

参考源程序:

#include #include #define N 81 fun(char *s)

16

{ int i=0,t,n=strlen(s); for(;s+i

{t=*(s+i);*(s+i)=*(s+n-1-i);*(s+n-1-i)=t;} }

main()

{ char a[N]; clrscr();

printf(\

printf(\fun(a);

printf(\

printf(\puts(a); }

7.7 编写一个函数实现两个字符串的连接(不使用库函数strcat())。 例如,分别输入下面两个字符串: This is t

he best program. 程序输出:

This is the best porgram. 解:参考源程序:

#include #include

void fun(char p1[],char p2[])

{ int i,j;

for(i=0;p1[i];i++) for(j=0;p2[j];j++) p1[i++]=p2[j]; p1[i]='\\0'; } main()

{ char s1[80],s2[80]; clrscr();

printf(\scanf(\printf(\printf(\

printf(\fun(s1,s2);

printf(\printf(\}

7.8自定义函数求3*3矩阵的转置矩阵。

17

解:程序分析

这题的关键在于进行行列下标转换的算法,由矩阵的对称性我们不难看出在进行行列互换时a[j]在好是与a[j][i]互换,因而只要我位让程序走完矩阵的左上角即可(用for(i=0;i<2;i++)再套for(j=i+1;j<3;j++)来完成左上角的走动。*/

参考源程序:

#include

int fun(int array[3][3]) { int i,j,t;

for(i=0;i<2;i++) for(j=i+1;j<3;j++)

{t=array[i][j];array[i][j]=array[j][i];array[j][i]=t;} }

main()

{ int i,j;

int array[3][3]={{100,200,300},{400,500,600},{700,800,900}}; clrscr();

for(i=0;i<3;i++)

{for(j=0;j<3;j++)

printf(\printf(\}

fun(array);

printf(\转置矩阵是:\\n\for(i=0;i<3;i++) {for(j=0;j<3;j++)

printf(\printf(\} }

7.9 用函数实现牛顿迭代法求一元三次方程的根。

-5

解:牛顿迭代法的公式是:x=x0-f(x)/f’(x),设迭代误差小于10时结束。 参考源程序:

#include

float solut(float a,float b,float c,float d) { float x=1,x0,f,f1; do{

x0=x;

f=((a*x0+b)*x0+c)*x0+d; f1=(3*a*x0+2*b)*x0+c;

x=x0-f/f1;}while(fabs(x-x0)>=1e-5); return(x); } main()

18

{ float a,b,c,d;

printf(“请输入一元三次方程的系数a,b,c,c:\\n”); scanf(“%f,%f,%f,%f”,&a,&b,&c,&d);

printf(“一元三次方程为:%5.2fx^3+%5.2fx^2+%5.2fx+%5.2f=0\\n”,a,b,c,d); printf(“该方程的根为:x=%7.2f\\n”,solut(a,b,c,d)); }

第8章 编译预处理

解:参考源程序:

{int c,d,s;

scanf(\ CHANGE(c,d,s);

} 三角形面积为:三角形的面积公式为:

s(s?a)(s?b)(s?c)

其中S=(a+b+c)/2。

S,一个用来求area,另一个宏用来求。写程序,在程序中用带实参的宏名来求面积AQRT(m,n,k) sqrt(SSS(m,n,k)*(SSS(m,n,k)-m)*(SSS(m,n,k)-n)*(SSS(m,n,k)-k)) 19

8.1定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的

两个值。 #define CHANGE(a,b,t) t=a;a=b;b=a main()

printf(\

8.2输入两个整数,求他们相除的余数。用带参的宏来实现,编程序。 #define Q(a,b) a%b main()

{int c,d,t;

scanf(\ t=Q(c,d);

printf(\ }

8.3 Area= 定义两个带参的宏area。 #include\

#define SSS(m,n,k) (m+n+k)/2

#define main()

{ float a,b,c,s,area;

scanf(\ s=SSS(a,b,c); area=AQRT(a,b,c);

printf(\ }

8.4给年份year定义一个宏,以判别该年份是否闰年。提示:宏名可以定义为LEAP_YEAR,形参为y。 解:参考源程序:

#define LEAPYEAR(y) y%4==0&&y0!=0||y@0==0 main() {int y;

scanf(\

if(LEAPYEAR(y)) printf(\ else printf(\ }

第9章 指针

9.1 输入三个整数,按由小到大的顺序输出。

解:参考源程序: main()

{int a,b,c,*p1,*p2,*p3,t; scanf(\ p1=&a;p2=&b;p3=&c;

if(*p1>*p2) {t=p1;p1=p2;p2=t;} if(*p1>*p3) {t=p1;p1=p3;p3=t;} if(*p2>*p3) {t=p2;p2=p3;p3=t;} printf(\ } 或 main()

{int a,b,c,*p1,*p2,*p3,t; scanf(\ p1=&a;p2=&b;p3=&c;

if(a>b) {t=*p1;*p1=*p2;*p2=t;} if(a>c) {t=*p1;*p1=*p3;*p3=t;} if(b>c) {t=*p2;*p2=*p3;*p3=t;} printf(\ }

9.2输入三个字符串,按由小到大的顺序输出 #define N 3 #define M 20 main()

{char str0[N][M],str1[M],*p,*q; int i,l,m,n; q=str0;

for(;p

l=strcmp(q,q+1);

20

str[i]=str[i]-32; fputc(str[i],fp); i++;} fclose(fp);

fp=fopen(\

fgets(str,strlen(str)+1,fp); printf(\fclose(fp); }

有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出 平均成绩,况原有的数据和计算出的平均分数存放在磁盘文件\中。 1.程序分析: 2.程序源代码:

#include \struct student { char num[6]; char name[8]; int score[3]; float avr; } stu[5]; main()

{int i,j,sum; FILE *fp; /*input*/

for(i=0;i<5;i++)

{ printf(\printf(\

scanf(\printf(\

scanf(\sum=0;

for(j=0;j<3;j++)

{ printf(\scanf(\sum+=stu[i].score[j]; }

stu[i].avr=sum/3.0; }

fp=fopen(\for(i=0;i<5;i++)

if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1) printf(\fclose(fp); }

26

本文来源:https://www.bwwdw.com/article/3hnd.html

Top