C语言题解(4-9)

更新时间:2024-05-20 15:29:01 阅读量: 综合文库 文档下载

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

第4章

4.1 C语言中的语句有哪几类?C语句与其他语言中的语句有哪些不同?

(1) 控制语句 (2) 函数调用语句 (3) 表达式语句 (4) 空语句 (5) 复合语句

C语言允许一行写几个语句,也允许一个语句拆开写在几行上,书写格式无固定要求,而其他语言一般对书写格式有严格要求。

4.2 怎样区分表达式和表达式语句?C语言为什么要设表达式语句?什么时候用表达式,什么时候用表达式语句?

表达式没有分号,语句是有分号的,将表达式加上一个分号就成了表达式语句。两者最大的区别是,表达式只是一个值,而表达式语句是指令,完成指定的操作。

C语言设表达式语句的作用是用简短的指令代替了复杂的函数运算,程序运行效率高。 表达式是为了进行求值运算而设定的计算公式,用于语句中,但不构成完整的语句。如果要完成该运算,必须使用表达式语句。

4.3 C语言为什么要把输入输出的功能用函数来实现,而不作为语言的基本部分?

因为输入输出的对象是数据,而数据是以介质为载体的,因此进行输入输出就要与各种外部设备打交道。由于不同的系统进行输入输出的差异较大,所以必须使用函数和操作系统进行交互,以便存取不同的设备文件。

4.4 若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.60 y+z=-1.20 z+x=-2.40 u= 51274 n= 128765 c1=’a’ or 97(ASCII) c2=’b’ or 98(ASCII) int main() {

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

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

printf(\ printf(\

printf(\ printf(\

printf(\ printf(\ return 0;

}

4.5 请写出下面程序的输出结果: int main() {

int a=5,b=7;

float x=67.8564,y=-789.124; char c='A';

long n=1234567; unsigned u=65535; printf(\ printf(\ printf(\

printf(\

printf(\ printf(\

printf(\ printf(\ printf(\

printf(\ return 0; } 57 5 7

67.856400,-789.124023 67.856400 ,-789.124023

67.86, -789.12,67.8564,-789.1240,67.856400,-789.124023 6.785640e+001,-7.89e+002 A,65,101,41

1234567,4553207,12d687 65535,177777,ffff,65535 COMPUTER, COM

4.6 用下面的scanf函数输入数据,使a=3,b=7,x=8.5,7=71.82,c1=’A’,c2=’a’,问在键盘上如何输入? int main() {

int a,b; float x,y; char c1,c2;

scanf(\ printf(\ printf(\ printf(\ return 0; }

4.7 用下面的scanf函数输入数据,使a=10,b=20,c1=’A’,c2=’a’,x=1.5,y=-3.75,z=67.8,请问在键盘上如何输入数据? int main() {

int a,b; char c1,c2; float x,y,z;

scanf(\

printf(\

printf(\ printf(\ return 0; }

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

#define Pi 3.1415926 int main() {

double r,h;

scanf(\

printf(\圆的周长=%.2f\\n\ printf(\圆的面积=%.2f\\n\ printf(\圆球表面积=%.2f\\n\ printf(\圆球体积=%.2f\\n\ printf(\圆柱体积=%.2f\\n\ return 0; }

4.9 输入一个华氏温度的取值F,要求输出摄氏温度的取值C。公式为

C=5(F-32)/9

输出要有文字说明,取两位小数。 #include

double CentigradeTemperture(double Fahrenheit); int main() {

double F;

printf(\请输入华氏温度:\ scanf(\

printf(\摄氏温度为%.2f\\n\ return 0; }

double CentigradeTemperature(double Fahrenheit) {

return 5*(Fahrenheit-32)/9; }

4.10 编程序:用getchar函数读入两个字符c1,c2,然后分别用putchar函数和printf函数输出这两个字符,并思考以下问题:(1)变量c1,c2应定义为字符型还是整型,或二者皆可?(2) 要求输出c1和c2的ASCII码,应如何处理?用putchar函数还是printf函数?(3) 整型变量与字符变量是否在任何情况下都可以互相代替?如:

char c1,c2; 与 int c1,c2; 是否无条件等价? int main() {

char c1,c2; c1=getchar(); c2=getchar(); putchar(c1); putchar(c2);

printf(\ return 0; }

(1) 二者皆可。

(2) 用printf函数将printf(\改成printf(\即可。 (3) 不是,整型可以代替字符型,但字符无法完全替代整型。

第5章

5.1 什么是算术运算?什么是关系运算?什么是逻辑运算? 算术运算:+ - * / % ++ -- 关系运算:< > == >= <= != 逻辑运算:! && ||

5.2 C语言中如何表示真假?系统如何判断一个量的真假? C语言用整数1和0表示真假

5.3 写出下面各逻辑表达式的值,设a=3,b=4,c=5。 (1) a+b>c && b==c (2) a||b+c && b-c

(3) !(a>b) && !c && !1 (4) !(x=a) && (y=b) && 0 (5) !(a+b)+c-1 && b+c/2

(1) 0 (2) 1 (3) 0 (4) 0 (5) 1 5.4 有三个整数a,b,c,由键盘输入,输出其中最大的数。 int Max3(int a,int b,int c); int main() {

int a,b,c;

scanf(\

printf(\最大的数是%d\\n\ return 0; }

int Max3(int a,int b,int c) {

int temp; temp=a>b?a:b;

return temp>c?temp:c; }

5.5 有一函数:

?x?y??2x?1?3x?11??x?1??1?x?10? ?x?10?编写一程序,输入x,输出y值。 double funcy(double x); int main() {

double x,y;

scanf(\ y=funcy(x);

printf(\最大的数是%lf\\n\

printf(\其它字符个数为:%d\\n\ return 0; }

6.3 求Sn=a + aa + aaa + … + aa…a (n个a)之值,其中a是一个数字。 long int SumOfaa(int a,int k) {

if(a<1 || k<1) return 0; if(k==1) return a; else

return 10*(SumOfaa(a,k-1)-SumOfaa(a,k-2))+a+SumOfaa(a,k-1); }

206.4 求?n!(即求1!+2!+3!+…+20!)。

n?1long int SumOfRfact(int k) {

if(k<1) return 0; else

if(k<2) return 1; else

return k*(SumOfRfact(k-1)-SumOfRfact(k-2))+SumOfRfact(k-1); }

10050106.5 求?k?k?1?k?1k2??k?11k

long int SumOfk(int k) {

int i,sum=0;

if(k<1) return 0;

for(i=1;i<=k;i++) sum+=i; return sum; }

long int SumOfk2(int k) {

int i,sum=0;

if(k<1) return 0;

for(i=1;i<=k;i++) sum+=i*i; return sum; }

double SumOfk1(int k) {

int i;

double sum=0.0; if(k<1) return 0;

for(i=1;i<=k;i++) sum+=1.0/i; return sum; }

6.6 打印出所有“水仙花数”。所谓水仙花数是指一个三位数,其各位数字立方和等于该数

333

本身。例如,153=1+5+3。 int main() {

int i=0; int x,y,z;

for(x=1;x<10;x++) for(y=0;y<10;y++) for(z=0;z<10;z++)

if(x*x*x+y*y*y+z*z*z==x*100+y*10+z){ printf(\ i++; }

printf(\共有%d个水仙花数\\n\ return 0; }

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

int AllFactors(int a[],int k); int OverNum(int k); int main() {

int i,k=0;

for(i=1;i<=N;i++){ if(OverNum(i)){

printf(\ k++; } }

printf(\ return 0; }

/* 求k的所有因子,因子保存在数组a中,返回因子的个数 */ int AllFactors(int a[],int k) {

int i;

int m=1;/* 用以记录因子的个数 */ if(k<1) return 0; a[0]=1;

for(i=2;i

if(k%i==0){ /* i是因子 */

a[m++]=i; /* 因子送数组保存 */ } }

return m; }

int OverNum(int k) {

int a[100]; int j,m; int sum=0;

m=AllFactors(a,k);/* 记录因子个数 */

for(j=0;j

return 0; }

6.8 有一分数序列:

23581321,,,,,,… 1235813求出这个序列的前20项之和。 #define N 20

double SumFractions(int k); int main() {

printf(\ return 0; }

double SumFractions(int k) {

int i;

double sum=0.0;

double a=2.0,b=1.0,temp; for(i=0;i

return sum; }

6.9 一个球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下。求它在第

10次落地时,共经过多少米?第10次反弹多高?

double TotalDistance(double Height,double Times,double Ratio);

double ReboundingDistance(double Height,double Times,double Ratio); int main() {

double Height,Times,Ratio;

printf(\请输入小球的高度,反弹次数,反弹高度比例:\ scanf(\

printf(\反弹的总距离为%lf米\\n\ printf(\最后一次反弹的高度为%lf米\\n\ return 0; }

double TotalDistance(double Height,double Times,double Ratio) {

int i;

double sum=0.0; double h; h=Height;

for(i=0;i

return sum; }

double ReboundingDistance(double Height,double Times,double Ratio) {

int i; double h; h=Height;

for(i=0;i

return h; }

6.10 猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。已经每天早上都吃了前一天剩下的一半零一个。到第10天早上再想吃时,见只剩下一个桃子了。求第一天共摘多少桃子? int MonkeyEatPeach(int days); int main() {

int days;

printf(\请输入猴子吃桃的天数:\

scanf(\

printf(\猴子总共摘了%d个桃子\\n\ return 0; }

int MonkeyEatPeach(int days) {

int i,sum=1;

for(i=0;i

6.11 用迭代法求x=a的近似根。求平方根的迭代公式为

1?a??? ??xn?2?xn??-5

xn?1要求前后两次求出的x的误差的绝对值小于10。

double ApproximateSqrtRoot(double a,double precision); int main() {

double a,prec;

printf(\请输入欲求平方根的数及精度:\ scanf(\

printf(\的平方根近似为%lf\\n\ return 0; }

double ApproximateSqrtRoot(double a,double precision) {

double x1=a,x2; x2=(x1+a/x1)/2; if(a<0) exit(0);

while(fabs(x1-x2)>precision){ x1=x2;

x2=(x1+a/x1)/2; }

return x2; }

6.12 用牛顿迭代法求方程在1.5附近的根。

32

2x-4x+3x-6=0

/* 牛顿迭代法解方程 */

double NewtonSolvingEquation(double x,double precision) {

double x1,x2; x1=x;

x2=x1-func1(x1)/dfunc1(x1); while(fabs(x1-x2)>precision){ x1=x2;

x2=x1-func1(x1)/dfunc1(x1); }

return x2; }

double func1(double x)/* 方程f(x)=0的函数f(x) */ {

return 2*x*x*x-4*x*x+3*x-6; }

double dfunc1(double x)/* f(x)的导函数 */ {

return 6*x*x-8*x+3; }

6.13 用二分法求方程在(-10,10)之间的根。

32

2x-4x+3x-6=0 /* 二分法解方程 */

double BinarySolvingEquation(double x1,double x2,double precision) {

double a,b,c; a=x1; b=x2;

while(fabs(a-b)>precision){ c=(a+b)/2;

if(func1(c)*func1(a)<0) b=c; else a=c; }

return a; }

double func1(double x)/* 方程f(x)=0的函数f(x) */ {

return 2*x*x*x-4*x*x+3*x-6; }

6.14 输出出以下图案。

* *** ***** ******* ***** *** *

void ShowSpace(int k); int main()

{

int MaxStarNum; int i,j;

int bl,el;/* bl为起始位置,el为本行图案长度 */ scanf(\

if(MaxStarNum%2==0) return 0;/* 最大长度不是奇数,不符合题意退出 */ for(i=0;i

if(i<=MaxStarNum/2){/* 计算上半区每行图案起始位置和长度 */ bl=MaxStarNum/2-i; el=2*i+1; }

else{/* 计算下半区每行图案起始位置和长度 */ bl=i-MaxStarNum/2;

el=MaxStarNum-(2*(i-MaxStarNum/2)); }

ShowSpace(bl);/* 图案前的空格数 */

for(j=bl;j

return 0; }

void ShowSpace(int k) {

int i=0;

while(i++

6.15 两个乒乓球队进行比赛,每队各出三人。甲队为A,B,C三人,乙队为X,Y,Z三人。已抽签决定比赛名单。有人向队员打听比赛名单,A说他不和X比,C说他不和X,Z比,请编程序找出三对赛手的名单。 int main() {

char A,B,C;

for(A='X';A<='Z';A++) for(B='X';B<='Z';B++) for(C='X';C<='Z';C++)

if(A!='X' && C!='X' && C!='Z' && A!=B && B!=C && C!=A) printf(\ return 0; }

第7章

7.1 用筛选法求100之内的素数。 #include #include int main() { int i,j,m,a[101]; for(i=1;i<=100;i++) a[i]=i; for(i=2;i

7.2 用选择法对10个整数排序。 #include #define N 10 int main() { int i,j,min,temp,a[N+1]; printf(\ for(i=1;i<=N;i++){ printf(\ scanf(\ } printf(\ for(i=1;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; } printf(\ for(i=1;i<=10;i++) printf(\ return 0; }

7.3 求一个3×3矩阵的整型矩阵对角线元素之和。 #include #define N 3 int main() { int mat[N][N]; int i,j,sum=0; printf(\ for(i=0;i

7.4 有n个数已按由小到大的顺序排列好,要求输入一个数,把它插入到原有数列中,而且仍然保持有序。(对输出的数列,编程时应该考虑到插入的数的各种可能性:比原有的数都大;比原有的数都小;在最大数和最小数之间)。 int InsertArray(int x,int a[],int k) { int i,j; if(k<0 || k>MaxSize-1) return 0;/* 插入不成功返回0 */ if(k==0){ /* 数组为空,直接插入即可 */ a[0]=x; return 1; } i=0; while(a[i]

} for(j=k;j>i;j--){ /* 插入位置之后的元素依次后移 */ a[j]=a[j-1]; } a[i]=x; return 1; }

7.5 将一个数组中的值按逆序重新存放。例如,原来顺序为8,6,5,4,1,要求改为1,4,5,6,8。

int PutUpsideDownArray(int a[], int k) {

// 首尾进行交换即可 if(k<1) return 0; int i=0,x;

while(i++

a[i]=a[k-1-i]; a[k-1-i]=x; }

return 1; }

7.6 输出杨辉三角形。

解:杨辉三角形是(a+b)n展开后各项的系数。例如: (a+b)0展开后为1 (a+b)1展开后为a+b

(a+b)2展开后为a2+2ab+b2

(a+b)3展开后为a3+3a2b+3ab2+b3

(a+b)4展开后为a4+4a3b+6 a2b2+4ab3+b4

杨辉三角形各行的系数有以下的规律: (1) 各行第一个数都是1; (2) 各行最后一个数都是1;

(3) 从第3行起,除上面指出的第一个数和最后一个数外,其余各数是上一行同列和前一列两个数之和。 #include #define N 11 int main() { int i,j,a[N][N]; for(i=1;i

a[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=1;i

7.7 输出“魔方阵”。所谓“魔方阵”是指这样的方阵,它的每一行、每一列和对角线之和

2

均相等。要求打印出由1到n的自然数构成的魔方阵。 解:例如

8 1 6 3 5 7 4 9 2

魔方阵中各数的排列规律如下: (1) 将1放在第一行中间一列;

(2) 从2开始直到n×n止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1;

(3) 如果上一数的行数为1,则下一个数的行数为n(指最下一行)。例如1在第1行,则2应放在最下一行,列数同样加1;

(4) 当上一个数的列数为n时,下一个数的列数为1,行数减1。例如2在第3行最后一列,则3应放在第2行第一列;

(5) 如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已被占据,所以4就放在3的下面。 #include #define N 16 int main() { int a[N][N]; int i,j,k,p,n; p=1; while(p==1){/*如果输入不合法,重新输入*/ printf(\ scanf(\ if((n!=0) && (n<=N-1) && (n%2!=0)) p=0; } /* 初始化 */ for(i=1;i<=n;i++) for(j=1;j<=n;j++) a[i][j]=0; /* 建立魔方阵 */ i=1;

j=n/2+1; a[i][j]=1; /* 将1放在第一行中间一列 */ for(k=2;k<=n*n;k++){ if(i==1) i=n; else i--; if(j==n) j=1; else j++;/* 下一个数的位置当前行数减1,当前列数加1 */ if(a[i][j]==0) a[i][j]=k; else{/* 当前位置有数,下一个数放在前一个数的下面 */ if(i==n) i=2; else if(i==n-1) i=1; else i=i+2; if(j==1) j=n; else j--; a[i][j]=k; } } for(i=1;i<=n;i++){ for(j=1;j<=n;j++) printf(\ printf(\ } return 0; }

7.8 找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点。 #include #define M 10 #define N 10 int main() { int i,j,k,m,n,flag1,flag2,a[N][M],max,maxj; printf(\输入行数n:\ scanf(\ printf(\输入列数m:\ scanf(\ for(i=0;i

printf(\ printf(\ } flag2=0; for(i=0;imax){ max=a[i][j]; maxj=j; } for(k=0,flag1=1;ka[k][maxj]) flag1=0; if(flag1){ printf(\第%d行,第%d列的%d是鞍点\\n\ flag2=1; } } if(!flag2) printf(\矩阵中无鞍点!\\n\ return 0; }

7.9 有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。 #include #define N 15 void main() { void Sort(int a[],int n); int BinFind(int x,int a[],int n); int i,x,num,a[N]; printf(\请输入数组各元素值:\ for(i=0;i

void Sort(int a[],int n) { int i,j,t,temp; for(i=1;i

for(j=0;j<=t-1;j++) if(a[j]>a[j+1]){ temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } }

int BinFind(int x,int a[],int n) { int top=0,bot=n-1,mid; if(n<=0) return -1; mid=(top+bot)/2; while(x!=a[mid] && top<=bot){ if(a[mid]

7.10 有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。 #include void main() { int i,j; int Upper,Lower,Num,Space,Others; Upper=Lower=Num=Space=Others=0; char text[3][80]; for(i=0;i<3;i++){ printf(\请输入第%d行文字:\ gets(text[i]); }

for(i=0;i<3;i++) for(j=0; j<80 && text[i][j]!='\\0'; j++) { if(text[i][j]>='A' && text[i][j]<='Z') Upper++; else if(text[i][j]>='a' && text[i][j]<='z') Lower++; else if(text[i][j]>='0' && text[i][j]<='9') Num++; else if(text[i][j]==' ') Space++; else Others++; } printf(\大写字母个数为%d\\n\ printf(\小写字母个数为%d\\n\ printf(\数字个数为%d\\n\ printf(\空格个数为%d\\n\ printf(\其他字符个数为%d\\n\}

7.11 输出以下图案。 * * * * * * * * * * * * * * * * * * * * * * * * * #include #define N 10 int main() { int i,j,m; printf(\请输入阶数:\ scanf(\ for(i=0;i

7.12有一行电文,已按下面规律译成密码: A→Z a→z B→Y b→y

C→X c→x

即第1个字母变成第26个字母,第i个字母变成第(26-i+1)个字母。非字母字符不变。要求编程序将密码译回原文,并打印出密码和原文。 #include int main() {

int j,n;

char ch[80],tran[80];

printf(\ gets(ch);

printf(\ j=0;

while(ch[j]!='\\0'){

if((ch[j]>='A') && (ch[j]<='Z')) tran[j]=155-ch[j]; else

if((ch[j]>='a') && (ch[j]<='z')) tran[j]=219-ch[j]; else

tran[j]=ch[j]; j++; } n=j;

printf(\ for(j=0;j

putchar(tran[j]); printf(\ return 0; }

7.13 编一程序,将两个字符串连接起来,不要用strcat函数。 void main() { char s1[80],s2[40]; int i=0,j=0; printf(\ scanf(\ printf(\ scanf(\ while(s1[i]!='\\0') i++; while(s2[j]!='\\0') s1[i++]=s2[j++]; s1[i]='\\0'; printf(\}

7.14 编一个程序,将两个字符串s1和s2比较,若s1>s2,输出一个正数;若s1=s2,输出为0;若s1

7.15 编一程序,将字符数组s2中的全部字符复制到字符数组s1中,不要用strcpy函数。 #include void main() { char s1[80],s2[80]; int i; printf(\ scanf(\ for(i=0;i<=strlen(s2);i++); s1[i]=s2[i]; printf(\}

第8章

8.1 求两个正整数的最大公约数和最小公倍数。

int GreatestCommonDivisor(int m,int n) /*返回最大公约数*/ {

int u,v,r;

if(m==0 || n==0) return 0; u=m; v=n;

while(r=u%v){ u=v; v=r; }

return v; }

int LeastCommonMultiple(int m,int n) /* 返回最小公倍数 */ {

int u;

u=GreatestCommonDivisor(m,n); if(!u) return 0;

return u*(m/u)*(n/u); }

22

8.2 求方程ax+bx+c=0的根,用三个函数分别求当b-4a大于0、等于0和小于0时的根,并输出结果。从主函数输入a,b,c的值。 #include #include #include

void RealRoot(double,double,double); void EqualRoot(double,double,double); void ImageRoot(double,double,double); int main() { double a,b,c; scanf(\ if(b*b-4*a*c>0) RealRoot(a,b,c); else if(b*b-4*a*c==0) EqualRoot(a,b,c); else ImageRoot(a,b,c); return 0; }

void RealRoot(double a,double b,double c) { if(b*b-4*a*c<=0) exit(0);

printf(\ x2=%lf\\n\}

void EqualRoot(double a,double b,double c) { if(b*b-4*a*c) exit(0); printf(\ x2=%lf\\n\}

void ImageRoot(double a,double b,double c) { if(b*b-4*a*c>=0) exit(0); printf(\ x2=%lf-j%lf\\n\ (-b)/(2*a),sqrt(4*a*c-b*b)/(2*a), (-b)/(2*a),sqrt(4*a*c-b*b)/(2*a)); }

8.3 编写一个判断素数的函数。在主函数输入一个整数,输出是否素数的信息。 int prime(unsigned int number); int main() { int m; scanf(\ if(prime(m)) printf(\是素数!\\n\ else printf(\不是素数!\\n\ return 0; }

int prime(unsigned int number) { int f=1; unsigned int n; if(number<1) exit(0); for(n=2;n<=number/2;n++) if(number%n==0){ f=0; break; } return f; }

8.4 写一函数,使给定的一个二维数组(m×n)转置,即行列互换。 #include #define M 20 #define N 20

void Convert(int a[M][N],int m,int n); int main() {

int m,n;

int i,j; int a[M][N];

printf(\请输入矩阵的行数、列数:\ scanf(\

printf(\请输入矩阵的各元素:\\n\ for(i=0;i

scanf(\ }

Convert(a,m,n);

for(i=0;i

printf(\ }

return 0; }

void Convert(int a[M][N],int m,int n) {

int i,j,temp;

if(m<=n){/*行数小于列数*/ for(i=0;i

for(j=0;j

temp=a[i][j]; a[i][j]=a[j][i]; a[j][i]=temp; } } }

else{/*行数大于列数*/ for(i=0;i

for(j=0;jj){

temp=a[i][j]; a[i][j]=a[j][i]; a[j][i]=temp; } } } }

8.5 写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。 int InverseString(char a[], int k) {

// 首尾进行交换即可 if(k<1) return 0; int i=0; char temp; while(i++

8.6 写一函数,将两字符串连接。

void concatenate(char string1[],char string2[],char string[]) { int i,j; for(i=0;string1[i]!='\\0';i++) string[i]=string1[i]; for(j=0;string2[j]!='\\0';j++) string[i+j]=string2[j]; string[i+j]='\\0'; }

8.7 写一函数,将一个字符串中的元音字母复制到另一字符串,然后输出。 void cpy(char s[],char c[]) { int i,j; for(i=0,j=0;s[i]!='\\0';i++) if( s[i]=='a' || s[i]=='A' || s[i]=='e' || s[i]=='E' || s[i]=='i' || s[i]=='I' || s[i]=='o' || s[i]=='O' || s[i]=='u' || s[i]=='U') { c[j]=s[i]; j++; } c[j]='\\0'; }

8.8 写一个函数,输入一个4位数字,要求输出这4个数字字符,但每两个数字间空一个空格。如输入1990,应输出“1 9 9 0”。 void Insert(char str[]) { int i; for(i=strlen(str);i>0;i--) {

str[2*i]=str[i]; str[2*i-1]=' '; } printf(\}

8.9 编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输入字符串以及输出上述的结果。 void Count(char s[],int a[]) { int i; for(i=0; s[i]!='\\0'; i++) { if((s[i]>='A' && s[i]<='Z') || (s[i]>='a' && s[i]<='z')) a[0]++; else if(s[i]>='0' && s[i]<='9') a[1]++; else if(s[i]==' ') a[2]++; else a[3]++; } }

8.10 写一函数,输入一行字符,将此字符串中最长的单词输出。 #include #include

int LongestWord(char *p); int IsAlphabit(char c); int main() {

int m,i;

char str[100]; gets(str);

m=LongestWord(str);

for(i=m;IsAlphabit(str[i]);i++) printf(\ printf(\ return 0; }

int LongestWord(char *p) {

int len=0;/*用以记录当前单词长度*/ int length=0;/*用以保存前一单词长度*/ int place=0;/*记录最长单词的起始位置*/

int flag=1;/*如果flag=1,标志单词计数开始*/

int point;/*记录当前单词的起始位置*/ unsigned int i;

for(i=0;i<=strlen(p);i++){

if(IsAlphabit(p[i])){/*如果是英文字母*/ if(flag==1){ point=i; flag=0; }

else len++; }

else{/*如果不是英文字母*/ flag=1;

if(len>=length){ length=len; place=point; len=0; } } }

return place; }

int IsAlphabit(char c) {

if((c>='a'&&c<='z') ||(c>='A'&&c<='Z')) return 1; else

return 0; }

8.11 编写一个函数,用“起泡法”对输入的10个整数按由小到大的顺序排列。 void sort(int a[],int k) { int i,j; int t,temp;

for(i=1;i<=n-1;i++){ t=n-i; for(j=0;j<=t-1;j++) if(a[j]>a[j+1]){ temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } }

8.12用牛顿迭代法求根。方程为ax3+bx2+cx+d=0,系数a,b,c,d由主函数输入,求x

在1附近的一个实根。求出根后由主函数输出。 /* 牛顿迭代法解方程 */

double NewtonSolvingEquation(double a,double b,double c,double d,double x,double precision); double func1(double a,double b,double c,double d,double x);/* 方程f(x)=0的函数f(x) */ double dfunc1(double a,double b,double c,double x);/* f(x)的导函数 */

int main() { double a,b,c,d; scanf(\ printf(\方程的根为%lf\\n\}

double NewtonSolvingEquation(double a,double b,double c,double d,double x,double precision) { double x1,x2; x1=x; x2=x1-func1(a,b,c,d,x1)/dfunc1(a,b,c,x1); while(fabs(x1-x2)>precision){ x1=x2; x2=x1-func1(a,b,c,d,x1)/dfunc1(a,b,c,x1); } return x2; }

double func1(double a,double b,double c,double d,double x)/* 方程f(x)=0的函数f(x) */ { return a*x*x*x+b*x*x+c*x+d; }

double dfunc1(double a,double b,double c,double x)/* f(x)的导函数 */ { return 3*a*x*x+2*b*x+c; }

8.13用递归的方法求n阶勒让德多项式的值,递归公式为 ?1?? pn?x???x???2n?1?x?pn?1?x???n?1?pn?2?x???n??n?n?n?0??1? ?1?double LP(double x,int k); int main() { double x; int k; printf(\请输入x和勒让德多项式的阶次k:\

scanf(\ printf(\时的%d阶勒让德多项式的值为%lf\\n\ return 0; }

double LP(double x,int k) { if(k<0) exit(0); if(k==0) return 1; if(k==1) return x; else return ((2*k-1)*x-LP(x,k-1)-(k-1)*LP(x,k-2))/k; }

8.14输入10个学生5门课的成绩,分别用函数求:(1) 每个学生平均分;(2) 每门课的平均分;(3) 找出最高的分数所对应的学生和课程;(4) 求平均分方差:

??1n??2xi?????xi??,其中xi为某一学生的平均分。 n??2#define M 10

#define N 5 double a[M][N];

/*第k个学生的平均分*/

double OneStudentAverageScore(int k) { int i; double sum=0; for(i=0;i

/*第k门课的平均分*/

double OneCourseAverageScore(int k) { int i,sum=0; for(i=0;i

/*找出最高分数的学生和课程*/ int MaxScoreNum() { int i,j,m,k; double a=0; for(i=0;i

for(j=0;j/*求均方差*/ double Variance() { double x,sum1=0,sum2=0; int i,j; for(i=0;i

8.15 编写几个函数:(1) 输入10个职工的姓名和职工号;(2) 按职工号由小到大顺序排序,姓名顺序也随之调整;(3) 要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号并输出该职工的姓名。 struct Employee{ int num; char name[10]; };

void Enter(struct Employee a[],int k) { int i; if(k<1) return; for(i=0;i

void SortInNum(struct Employee a[],int k) { int i,j,t; struct Employee temp;

for(i=1;i

for(j=0;j<=t-1;j++) if(a[j].num>a[j+1].num){ temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } }

char *Find(struct Employee a[],int k,int x) { int top=0,bot=k-1,mid; if(k<=0) return NULL; mid=(top+bot)/2; while(x!=a[mid].num && top<=bot){ if(a[mid].num

8.16 编写一函数,输入一个十六进制数并输出相应的十进制数。 void HexToDec() { int x; scanf(\ printf(\}

8.17 用递归法将一个整数n转换成字符串。例如,输入483,应输出字符串”483”。n的位数不确定,可以是任意位数的整数。 int IntegerToString(int k,char s[]) { int k1,j,i=0; char str[20]; if(k<-32768 || k>32767) return 0; if(k<0) k1=-k;/*如果是负数,仅转换其数字部分*/ else k1=k; do{ str[i++]=k1+'0';

}while((k1/=10)>0); if(k<0) str[i++]='-'; for(i=i-1,j=0;j<=i;j++) s[j]=str[i-j]; s[j]='\\0'; return 1; }

8.18 给出年、月、日,计算该日是该年的第几天。 int DayNum(int year,int month,int day) { int i,sum=0; int a[12]={31,28,31,30,31,30,31,31,30,31,30,31}; if(IsLeap(year)) a[1]=29; for(i=0;i

int IsLeap(int year) { if(year%4==0 && year0!=0 || year@0==0) return 1; else return 0; }

第9章

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

#define SWAP(a,b) (a)=(a)+(b);(b)=(a)-(b);(a)=(a)-(b); 9.2 输入两个整数,求它们相除的余数。用带参的宏来实现,编程序。 #define SURPLUS(a,b) a%b 9.3三角形的面积为

area?s?s?a??s?b??s?c?

其中s?12?a?b?c?,a,b,c

为三角形的三边。定义两个带参数的宏,一个用来求s,

另一个用来求area。编写程序,在程序中用带实参数的宏名来求面积area。

#define S(a,b,c) (a+b+c)/2

#define AREA(a,b,c) sqrt(S*(S-a)*(S-b)*(S-c)) 9.4 给年份year定义一个宏,以判别该年份是否闰年。

#define ISLEAP(year) (year%4==0 && year0!=0 || year@0==0) 9.5 请分析以下一组宏所定义的输出格式:

#define NL putchar(‘\\n’)

#define PR(format,value) printf(“value=%format\\t”,(value)) #define PRINT1(f,x1) PR(f,x1); NL

#define PRINT2(f,x1,x2) PR(f,x1); PRINT1(f,x2) 如果在程序中有以下的宏引用:

PR(d,x);

PRINT1(d,x);

PRINT2(d,x1,x2);

写出宏展开后的情况,并写出应输出的结果,设x=5,x1=3,x2=8。 解:展开后为:

printf(“value=%format\\t”,x);

printf(“value=%format=\\t”,x); putchar(‘\\n’);

printf(“value=%format=\\t”,x1); printf(“value=%format\\t”,x2); putchar(‘\\n’): 如果运行以下程序: #include

#define NL putchar('\\n')

#define PR(format,Value) printf(\#define PRINT1(format,x1) PR(format,x1); NL

#define PRINT2(format,x1,x2) PR(format,x1); PRINT1(format,x2) int main() {

float x=5, x1=3, x2=8; PR(d,x); PRINT1(d,x);

PRINT2(d,x1,x2); return 0; }

输出结果如下:

value=5.000000ormat value=5.000000ormat value=3.000000ormat value=5.000000ormat

用Turbo C和Visual C进行宏代换时,字符串中的字符不予替换,一律保持原状。 9.6 请设计输出实数的格式,实数用”6.2f”格式输出。要求:(1) 一行输出一个实数;(2) 一行内输出两个实数;(3) 一行内输出三个实数。 解:

#define PR printf #define NL “\\n” #define Fs “%f” #define F “%6.2f” #define F1 F NL

#define F2 F “\\t” F NL

#define F# F “\\t” F “\\t” F NL

9.7 设计所需的各种各样的输出格式(包括整数、实数、字符串等)。用一个文件名“format.h”,把这些信息都放到此文件内,另编一个程序文件,用#include“format.h”命令以确保能使用这些格式。 /* format.h */

#define INTEGER(d) printf(“%d\\n”,d) #define FLOAT(f) printf(“%8.2f\\n”,f) #define STRING(s) printf(“s\\n”,s)

9.8 分别用函数和带参数的宏,从三个数中找出最大数。 int max(int x,int y,int z) {

int t;

t=(x>y?x:y); return t>z?t:z; }

#define MAX(a,b) ((a)>(b)?(a):(b)) MAX((a,b),c);

9.9 试述“文件包含”和程序文件的链接(link)的概念,二者有何不同: 解:“文件包含”是事先将程序中需要用到的信息分别存放在不同的“头文件”中,用户在编程序时,利用#include命令将该头文件的内容包含进来,成为程序中的一部分。特别应当注意的是,该头文件与它所在的源文件共同组成一个文件模块。在编译时它是作为一个文件进行编译的。

连接则与此不同,它的作用是将多个目标文件连接起来。如果有两个或多个源程序文件,应先对它们分别进行编译,得到两个或多个目标文件,在连接阶段,把这些目标文件与系统提供的函数库等文件连接成一个可执行的文件。 9.10 用条件编译方法实现以下功能:

输入一行电报文字,可以任选两种输出:一为原文输出;一为将字母变成其下一字母(如‘a’变成‘b’??‘z’变成‘a’。其他字符不变)。用#define命令来控制是否要译成

密码。例如:

#define CHANGE 1 则输出密码。若 #define CHANGE 0

则不译成密码,按原码输出。 #include #define MAX 80 #define CHANGE 1 void main() {

char str[MAX]; int i;

printf(\ gets(str); #if(CHANGE) {

for(i=0;i

if(str[i]!='\\0'

if(str[i]>='a'&&str[i]<'z'||str[i]='A'&&str[i]='Z') str[]+=1;

else if(str[i]=='z'||str[i]=='Z') str[i]-=25; } }

#endif

printf(\}

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

Top