admin 管理员组

文章数量: 1184232


2023年12月16日发(作者:sql注入会被发现吗)

如对您有帮助,请购买打赏,谢谢您!

第1章 C语言概述

【习题1-1】简述C语言的特点。

答:C语言的特点:C语言简洁、紧凑、使用灵活、方便;运算符丰富;数据结构丰富;C是结构式语言;C语法限制不太严格,程序设计自由度大;C语言允许直接访问物理地址;C语言程序生成代码质量高;C语言适用范围大,可移植性好。

【习题1-2】简述上机调试运行C程序的操作步骤。

答:上机运行C语言程序的操作步骤为:启动Visual C++ 6.0→建立工程→创建源程序文件→输入(编辑)源程序内容→保存源程序文件→编译源程序文件→连接目标程序→执行程序→开始另一个程序。

【习题1-3】上机运行本章的3个例题。

答:略。

【习题1-4】请从以下的4个选项中选择一个正确答案。

(1)A (2)A (3)C (4)B

【习题1-5】参照本章例题,编写一个C语言程序,输出以下信息:

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

Nice to meet you!

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

编写程序如下:

#include

void main()

{

printf("**************n");

printf("Nice to meet you!n");

printf("**************n");

}

第2章 基本数据类型和运算符

【习题2-1】上机编辑并调试本章所有例题。

答:略。

【习题2-2】下面哪些是合法的常量?

⑴20 0.5 012 13e5.1 E-5 8e4 5. 0x6a

⑵'mn' "OK" "a" '012' "a/b" ''

答:⑴合法的常量有:20 0.5 012 8e4 5. 0x6a

⑵合法的常量有: "OK" "a" '012' "a/b" ''

【习题2-3】下面的变量名中哪些是合法的?

A&b abc123 abc% AbC a_b_c

int _abc 123abc ab?c

a bc a*bc 'a'bc

答:合法的变量名有:abc123 AbC a_b_c _abc

【习题2-4】指出下面的变量定义哪些是正确的,哪些是不正确的,为什么?

⑴Int i,j;

⑵float a,b;

⑶int a,b;float a,b;

⑷float a,int b;

⑸char 'a';

如对您有帮助,请购买打赏,谢谢您!

答:⑴错误,因为关键字Int应该全为小写字母

⑵正确

⑶错,因为同一变量在程序的同一处不应该声明为不同的数据类型

⑷错,因为不同类型的变量要分别声明,其间应使用分号,而不是逗号

⑸错,'a'表示字符常量,不能用作变量名

【习题2-5】把下列数学式子写成C语言表达式。

x14(1)3.26e+(a+b)

3ab(2)2x

3sin(x)mm(3)g122

r2(4)2r+r+cos(45°)

rate(1rate)month(5)loan

(1rate)month1对应的C语言表达式分别为:

(1)3.26*exp(x)+1.0/3*pow(a+b,4)

(2)2*sqrt(x)+(a+b)/(3*sin(x))

(3)g*m1*m2/(r*r)

(4)2*3.14*r+3.14*r*r+cos(3.14/180*45)

(5)loan*rate*pow(1+ rate, month)/(pow(1+rate, month)-1)

【习题2-6】C语言中为什么要引入转义字符?

答:在字符集中,有一类字符具有这样的特性:当从键盘上输入这个字符时,显示器上就可以显示这个字符,即输入什么就显示什么。这类字符称为可显示字符,如a、b、$等。但另一类字符却没有这种特性。它们或者在键盘上找不到对应的一个键,或者当按键以后不能显示键面上的字符,为了解决这一问题,在C语言中引入了转义字符。

【习题2-7】逻辑表达式的值是什么?只能用1和0才能表示真值和假值吗?

答:逻辑表达式的值是一个逻辑量“真”或者“假”,不是只有用1表示真值,用0表示假值,在判断一个量为真假时,常以0表示假,以非0表示真。

【习题2-8】对于表达式(1+2)*(y=3),可以肯定(1+2)先计算,而(y=3)后计算吗?

答:不能。

【习题2-9】 “&&”和“‖”严格地执行运算符优先级的规则吗?它的规则是什么?

答:逻辑运算符不按照规定的优先级计算。在逻辑表达式的求值过程中,如果从“&&”或“‖”左边的运算对象部分已经能够确定整个逻辑表达式的值,则不再求右边运算对象的值,这样做提高了运算速度。具体地说:若“&&”的左运算对象值为0,则不再对右运算对象求值,因整个式子的结果必定为0。若“‖”的左运算对象值为非0,则不再对右运算对象求值,因整个式子的结果必定为1。以上所说的这种运算的规则是C对逻辑运算的特殊处理规则。它严格地执行从左到右运算的规则,不受运算符优先级所影响。

【习题2-10】字符常量和字符串常量有什么区别?

答:字符常量和字符串常量的区别:

① 从形式上看,字符常量使用单引号,而字符串常量使用双引号。

② 从内部存储来看,编译程序在每个字符串的尾部自动加上了一个空字符NULL(即‘0’)作为字符串的结束标志,而字符常量则不存在这种情况。

【习题2-11】将下面语句组进行简写。

如对您有帮助,请购买打赏,谢谢您!

⑴int i;

int j;

⑵x=0;

y=0;

⑶x=x+y;

⑷int x,y;

x=y-(y/10)*10;

⑸int x;

x=x+1;

⑹y=x;

--x;

对应的简写语句分别为:

(1)int a,b;

(2)x=y=0;

(3)x+=y;

(4)int x,y;

x=y%10;

(5)int x;

x++; 或 x+=1; 或 ++x;

(6)y=x--;

【习题2-12】写出下面程序运行后的结果。

⑴ 程序运行结果:

2,3

⑵ 程序运行结果:

y=5.000000

⑶ 程序运行结果:

ch1=65,ch2=97

B,b

⑷ 程序运行结果:

0,48

⑸ 程序运行结果:

0

2

2

1

⑹ 程序运行结果:

a,A,32,32

⑺ 程序运行结果:

0

1,6

0,15,15

⑻ 程序运行结果:

如对您有帮助,请购买打赏,谢谢您!

2,2,1

1,2,1

0,2,2

-1,2,2

⑼ 程序运行结果:

3

2

4

⑽ 程序运行结果:

3

2

3,3

4

3,4,4

0

1

第3章 顺序和选择结构程序设计

【习题3-1】请从以下的4个选项中选择1个正确答案。

1. 结构化程序设计的三种基本结构是( )。

A. 函数结构、判断结构、选择结构 B.平行结构、嵌套结构、函数结构

C. 顺序结构、选择结构、循环结构 D.判断结构、嵌套结构、循环结构

【正确答案】 C

2. putchar( )函数可以向终端输出一个( )。

A. 整型变量表达式值 B. 实型变量值

C. 字符串 D. 字符或字符型变量值

【正确答案】 D

3. 若已定义 double y; 拟从键盘输入一个值赋给变量y,则正确的函数调用是( )。

A. scanf(“%d”, &y); B. scanf(“%7.2f”, &y);

C. scanf(“%lf”, &y); D. scanf(“%ld”, &y);

【正确答案】 C

4. 若有以下定义: float x; int a, b; 则正确的switch 语句是( )。

A. switch(x) B. switch(x)

{ case 1,2:printf("*n"); { case 1.0:printf("*n");

}

C. switch(a+b)

case 2: printf("**n") case 3:printf("**n");

}

D. switch(a-b);

{ case 1:printf("*n"); { case 1: printf("*n") ;

case 2: printf("**n"); case 2:printf("**n");

} }

【正确答案】 C

5. 为了避免嵌套的if-else语句的二义性,C语言规定else总是与( )组成配对关系。

A. 缩排位置相同的if B. 在其之前未配对的if

C. 在其之前尚未配对的最近的if D. 同一行上的if

如对您有帮助,请购买打赏,谢谢您!

【正确答案】 B

【习题3-2】if语句有那3种形式,请分别画出每种形式的执行流程图。

【参考答案】

(1)顺序结构 (2)选择结构

(3)循环结构(当型循环) 循环结构(直到型循环)

【习题3-3】下面哪些语句是合法的?

(1)if(a==b)printf("Hello");

(2)if(a==b){printf("Hello")}

(3)if(a==b)

printf("Hello")

else

printf("Goodbye");

(4)if a==b

printf("Hello");

【正确答案】

(1)合法。

(2)不合法。

(3)不合法。

(4)不合法。

【习题3-4】读程序写结果。

(1)从键盘输入58

#include

void main( )

{

int a;

scanf("%d",&a);

if(a>50) printf("A=%d",a);

if(a>40) printf("B=%d",a);

if(a>30) printf("C=%d",a);

}

答案: A=58 B=58 C=58

(2)

#include<stdio.h>

void main( )

{

int x=10,y=20,t=0;

if(x==y) t=x;x=y;y=t;

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

}

答案:20

(3)

#include

void main( )

如对您有帮助,请购买打赏,谢谢您!

{

int p,a=5;

if(p=a!=0)

printf("%dn",p);

else

printf("%dn",p+2);

}

答案:1

(4)

#include<stdio.h>

void main( )

{

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

if(a<b) {t=a;a=b;b=t;}

if(a<c) {t=a;a=c;c=t;}

printf("%d %d %dn",a,b,c);

}

答案:5 3 4

(5)

#include<stdio.h>

void main( )

{

int i,m=0,n=0,k=0;

for(i=9;i<=11;i++)

switch(i/10)

{ case 0: m++; n++; break;

case 10: n++;break;

default: k++;n++;

}

printf("%d %d %dn",m,n,k);

}

答案:1 3 2

(6)

#include<stdio.h>

void main( )

{

int n=0,m=1,x=2;

if(!n) x-=1;

if(m) x-=2;

if(x) x-=3;

printf("%dn",x);

如对您有帮助,请购买打赏,谢谢您!

}

答案:-4

(7)

#include<stdio.h>

void main( )

{

int x=1,y=0,a=0,b=0;

switch(x)

{ case 1:switch(y)

{ case 0:a++; break;

case 1:b++; break;

}

case 2:a++;b++; break;

}

printf("%d %dn",a,b);

}

答案:2 1

(8)

#include<stdio.h>

void main( )

{

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

if(b<a&&a<c) {t=a;a=c;c=t;}

if(a<c&&b<c) {t=b;b=a;a=t;}

printf("%d %d %dn",a,b,c);

}

答案:4 3 5

(9)

#include<stdio.h>

void main( )

{

int n='c';

switch(n++)

{ default: printf("error");break;

case 'a':case 'A':case 'b':case 'B':printf("good");break;

case 'c':case 'C':printf("pass");

case 'd':case 'D':printf("warn");

}

}

答案:passwarn

【习题3-5】有如下if条件语句:

如对您有帮助,请购买打赏,谢谢您!

if(a

else if(c

试按缩进对齐的格式将以上语句改写为结构更清晰的等效if语句,并在每个条件表达式之后用逻辑表达式注释所满足的条件。

【正确答案】

if(a

{

if(c

x=1;

else if(a

if(b

x=2;

else

x=3;

}

else if(c=b)&&(c

x=4;

else

x=5;

【习题3-6】有两个程序段:

(1)if(a

{ {

if(c==d)x=1; if(c==d)x=1;

} else x=2;

else x=2; }

它们所表示的逻辑关系是下列所示关系中的哪一个?

① 1 a

x= x=

2 a≥b且c≠d 2 a

③ 1 a

x= x=

2 a≥b 2 c≠d

答案:(1)所表示的是3,(2)所表示的是2

【习题3-7】写一程序,从键盘上输入1年份year(4位十进制数),判断其是否闰年。闰年的条件是:能被4整除、但不能被100整除,或者能被400整除。

程序如下:

/*c3_7.c*/

#include "stdio.h"

void main()

{

int year;

scanf("%d",&year);

/*(a>=b)&&(c>=d))*/

/*(a=d)*/

/*(a

/*(a

/*a

如对您有帮助,请购买打赏,谢谢您!

if(year%400==0||(year%4==0&&year%100!=0))

printf("%d is a leap yearn",year);

else

printf("%d is not a leap yearn",year);

}

【习题3-8】设计一个程序,从键盘输入3个整数,按由小到大的顺序输出。

程序如下:

/*c3_8.c*/

#include

void main( )

{

int a, b, c;

if(a>b) {t=a; a=b; b=t;}

if(a

printf("%d %d %dn",a,b,c);

}

【习题3-9】编程序计算下面的函数:

ex1 0

y= |x|+2 3≤x≤4

2 sin(x) 当x取其他值时

程序如下:

/*c3_9.c*/

#include <stdio.h>

#include <math.h>

void main( )

{

float x,y;

printf("输入x:");

scanf("%f",&x);

if(x>0&&x<1) /*若0<x<1*/

y=exp(sqrt(x))-1;

else if(x>=3&&x<=4) /*若3≤x≤4*/

y=fabs(x)+2;

else /*若x≥10*/

y=sin(x*x);

printf("x=%.1f,y=%.2fn",x,y);

}

【习题3-10】编程序计算下面的分段函数:输入x值,求下列相应y值。

-1 (x<1)

y= 2x+1 (1≤x≤10)

3x+2 (x≥10)

如对您有帮助,请购买打赏,谢谢您!

分析:对于分段函数,往往采用多路分支选择语句实现。

程序如下:

/*c3_10.c*/

#include <stdio.h>

void main( )

{

int x,y;

printf("输入x:");

scanf("%d",&x);

if(x<1) /*若x<1*/

{

y=x;

printf("x=%3d,y=x=%dn",x,y);

}

else if(x<=10) /*若1≤x≤10*/

{

y=2*x+1;

printf("x=%3d,y=2*x+1=%dn",x,y);

}

else /*若x≥10*/

{

y=3*x+2;

printf("x=%3d,y=3*x+2=%dn",x,y);

}

}

【习题3-11】输入一个整数m,判断它能否被3、13、17整除,如果能被三个数之一整除,则输出它能被整除的信息,否则输出m不能被3、13、17整除的信息。试编写该程序。

程序如下:

/*c3_11.c*/

#include

void main( )

{

int m;

scanf(“%d”, &m);

if(m%3==0||m%13==0||m%17==0)

printf(“can be divided!”);

else

printf(“can not be divided!”);

}

【习题3-12】若一个学生是某校的学生,且是男生,则输出“male”;若是女生,则输出“female”;若不是某校的学生,则输出“No”。试编写该程序并画出流程图。

程序如下:

/*c3_12.c*/

#include

如对您有帮助,请购买打赏,谢谢您!

void main( )

输入学生学校及学生性别

{

int school, sex;

否 是

是否某校学生

scanf(“%d,%d”, &school,

&sex);

是否男生

if(school==1)

{

if(sex==1)

输出No 输出female输出“male”

printf(“male”);

结 束

else

printf(“female”);

}

else

printf(“No”);

}

【习题3-13】某产品的国内销售价为80箱以下,每箱350元,超过80箱,超过部分每箱优惠20元;国外销售价为1000箱以下,每箱900元,超过1000箱,超过部分每箱优惠15元。试编写计算销售额的程序。

程序如下:

/*c3_13.c*/

#include

void main( )

{ float money;

int national, count;

printf("Input national or external: ");

scanf("%d",&national);

printf("Input count of product: ");

scanf("%d",&count);

if(national) /* 国内销售 */

if(count<=80)

money=count*350.0;

else

money=count*350.0-(count-80.0)*20.0;

else /* 国外销售 */

if( count<=1000)

money=count*900.0;

else

money=count*900.0-(count-1000.0)*15.0;

printf("total=%f",money);

}

【习题3-14】电文加密的算法是:将字母A变成字母G,a变成g,B变成H,b变成h,依此类推,并且U变成A,V变成B等。从键盘输入一个电文字符,输出其相应的密码。

程序如下:

/*c3_14.c*/

如对您有帮助,请购买打赏,谢谢您!

#include

void main()

{

char chr;

char password;

chr=getchar();

password=chr+6;

if(chr<=90)

{

if(password>90)

password=(password%91)+'A';

else

password=password%91;

}

else

{

if(password>=123)

password=(password%123)+'a';

else

password=password%123;

}

printf("The character's password is %c",password);

}

【习题3-15】企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?

程序如下:

/*c3_15.c*/

#include

main()

{

long int i;

int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;

scanf("%ld",&i);

bonus1=100000*0.1; /*利润为10万元时的奖金*/

bonus2=bonus1+100000*0.75; /*利润为20万元时的奖金*/

如对您有帮助,请购买打赏,谢谢您!

bonus4=bonus2+100000*0.5;

bonus6=bonus4+100000*0.3;

bonus10=bonus6+400000*0.15;

if(i<=100000)

bonus=i*0.1;

金*/

else if(i<=200000)

bonus=bonus1+(i-100000)*0.075;

金*/

else if(i<=400000)

bonus=bonus2+ (i-200000)*0.05;

金*/

else if(i<=600000)

bonus=bonus4+ (i-400000)*0.03;

金*/

else if(i<=1000000)

bonus=bonus6+ (i-600000)*0.015; /*利润在60万元至100万元时的奖金*/

else

bonus=bonus10+(i-1000000)*0.01; /*利润在100万元以上时的奖金*/

printf("bonus=%d",bonus);

}

第4章 循环结构程序设计

【习题4-1】分析下面程序的结果:

(1)程序运行结果:

k=12

(2)程序运行结果:

*

#

(3)程序运行结果:

0

(4)程序运行结果:

k=0

(5)程序运行结果:

m=1

【习题4-2】假设全班有30个学生,编写一个程序,连续输入30个学生的计算机考试成绩,并计算出全班学生的计算机平均成绩。

程序如下:

/*c4_2.c*/

#include

void main( )

{

float sum=0.0,ave=0.0,score;

/*利润在40万至60万元时的奖 /*利润在20万至40万元时的奖 /*利润在10万至20万元时的奖

/*利润为40万元时的奖金*/

/*利润为60万元时的奖金*/

/*利润为100万元时的奖金*/

/*利润在10万元以内按0.1提成奖

如对您有帮助,请购买打赏,谢谢您!

int i;

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

{

scanf("%fn",&score);

sum+=score;

}

ave=sum/i;

printf("Average is %fn",sum);ave;

}

【习题4-3】编程求1!+3!+5!+7!+…+19!的值。

程序如下:

/*c4_3.c*/

#include

void main( )

{

float sum=0.0;

int i,j=1;

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

{

j*=i;

if(i%2==0) continue;

sum+=j;

}

printf("sum=%en",sum);

}

【习题4-4】打印出所有的水仙花数。所谓水仙花数是指一个三位数,其各位数字的立333方和等于该数字本身,如xyz=x+y+z。

程序如下:

/*c4_4.c*/

#include

void main( )

{

int x,y,z;

printf("水仙花数有:");

for(x=1;x<=9;x++)

for(y=0;y<=9;y++)

for(z=0;z<=9;z++)

if(x*100+y*10+z==x*x*x+y*y*y+z*z*z)

printf("%-5d",x*100+y*10+z);

}

【习题4-5】分别用三种循环控制语句编写程序,求下面和式的值。

如对您有帮助,请购买打赏,谢谢您!

方法一:利用for循环实现

程序如下:

/*c4_5a.c*/

#include

void main()

{

int s=0,i;

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

s+=i;

printf("s=%dn",s);

}

方法二:利用while循环实现

程序如下:

/*c4_5b.c*/

#include

void main()

{

int s=0,i=1;

while(i<=100)

{

s+=i;

i++;

}

printf("s=%dn",s);

}

方法三:利用do-while循环实现

程序如下:

/*c4_5c.c*/

#include

void main()

{

int s=0,i=1;

do

{

s+=i;

i++;

}while(i<=100)

printf("s=%dn",s);

}

【习题4-6】将从键盘输入的一对数,由小到大排序输出。当输入一对相等数时结束循环。

程序如下:

/*c4_6.c*/

#include

如对您有帮助,请购买打赏,谢谢您!

void main()

{

int a,b,t;

scanf("%d,%d",&a,&b);

while(a!=b)

{

if(a>b)

{ t=a;a=b;b=t; }

printf("%d,%dn",a,b);

scanf("%d,%d",&a,&b);

}

}

【习题4-7】从键盘输入的一组字符中统计出大写字母的个数m和小写字母的个数n,并输出m、n中的较大者。

程序如下:

/*c4_7.c*/

#include

void main()

{

int m=0,n=0;

char c;

while((c=getchar())!='n')

{

if(c>'A'&&c<='Z') m++;

if(c>='a'&&c<='z') n++;

}

printf("m=%d,n=%d,max=%dn",m,n,m

}

【习题4-8】输入n个数,求其最大数、最小数和平均值。

程序如下:

/*c4_8.c*/

#include

void main( )

{

int n,i,max,min,a;

float s;

scanf("%d,%d",&n,&a);

s=max=min=a;

for(i=1;i

{

scanf("%d",&a);

s+=a;

if(max

if(min>a) min=a;

如对您有帮助,请购买打赏,谢谢您!

}

printf("Max=%d,Min=%d,avg=%f",max,min,s/n);

}

【习题4-9】输出显示自然数1~100之间的全部素数。

程序如下:

/*c4_9.c*/

#include

#include

void main()

{

int n,i,j,l=0;

for(n=2;n<=100;n++)

{

i=sqrt(n);

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

if(!(n%j))break;

if(j>=i+1)

if(l<5)

{

printf("%dt",n);

l++;

}

else

{

printf("%dn",n);

l=0;

}

}

}

【习题4-10】一个数如果恰好等于它的因子之和,就把它称为“完数”。例如,28的因子为1、2、4、7、14,而28=1+2+4+7+14,因此28是“完数”。编程序找出10000以内的所有“完数”并输出其因子。

程序如下:

/*c4_10.c*/

#include

void main()

{

int m,s,i;

for(m=2;m<10000;m++)

{

s=0;

for(i=1;i

if((m%i)==0) s=s+i;

if(s==m)

如对您有帮助,请购买打赏,谢谢您!

{

printf("%d,its factors are",m);

for(i=1;i

if(m%i==0) printf("%d ",i);

printf("n");

}

}

}

【习题4-11】求算式xyz+yzz=888中的x、y、z的值(其中xyz和yzz分别表示一个三位数)。

程序如下:

/*c4_11.c*/

#include

void main()

{

int x,y,z,i,result=888;

for(x=1;x<10;x++)

for(y=1;y<10;y++)

for(z=0;z<10;z++)

{

i=100*x+10*y+z+100*y+10*z+z;

if(i==result)

printf("x=%d,y=%d,z=%dn",x,y,z);

}

}

【习题4-12】已知鸡兔共有30只,脚共有90只,编程计算鸡兔各有多少只。

程序如下:

/*c4_12.c*/

#include

void main()

{

int x,y;

for(x=0;x<=30;x++)

{

y=30-x;

if((2*x+y*4)==90) printf("%d,%dn",x,y);

}

}

【习题4-13】猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃了一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半多一个。知道第十天早上想再吃时,只剩下一个桃子了。求第一天一共摘了多少个桃子?

分析:前一天桃子数是后一天桃子数的2倍加2个。

程序如下:

如对您有帮助,请购买打赏,谢谢您!

/*c4_13.c*/

#include

void main( )

{

int x,i;

x=1;

for(i=9;i>=1;i--)

x=2*(x+1);

printf("%dn",x);

}

【习题4-14】编写程序,找出1-99之间的全部同构数。(同构数的定义:出现在平方数的右边。例如:5是25右边的数,25是625右边的数,5和25都是同构数)

程序如下:

/*c4_14.c*/

#include

void main()

{

int i;

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

if(i*i%10==i||i*i%100==i) printf("%3d",i);

}

【习题4-15】使用嵌套循环输出下列图形:

******

* *

* *

******

程序如下:

/*c4_15.c*/

#include

void main()

{

int i,j;

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

{

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

if(i==0||j==0||i==3||j==5)

printf("*");

else

printf(" ");

printf("n");

}

}

【习题4-16】使用循环嵌套输出下列图形:

如对您有帮助,请购买打赏,谢谢您!

*****

*****

*****

*****

程序如下:

/*c4_16.c*/

#include

void main( )

{

int i,j,k;

for(i=0;i<=3;i++) /*i是外循环变量用于控制行数*/

{

for(k=1;k<=i;k++) /*k是内循环变量用于控制每行的空格数*/

printf(" ");

for(j=0;j<=4;j++) /*j是内循环变量用于控制每行中星号的个数*/

printf("*");

printf("n");

}

}

【习题4-17】编写一程序,根据用户输入的不同的边长,输出其菱形。例如,边长为3的菱形为:

*

***

*****

***

*

程序如下:

/*c4_17.c*/

#include

void main()

{

int a,i,j,k;

printf("please enter the number");

scanf("%d",&a);

for(i=0;i<=a-1;i++)

{

for(j=0;j<=a-2-i;j++) printf(" ");

for(k=0;k<=2*i;k++) printf("*");

printf("n");}

for(i=0;i<=a-2;i++)

{

for(j=0;j<=i;j++) printf(" ");

for(k=0;k<=2*a-4-2*i;k++) printf("*");

如对您有帮助,请购买打赏,谢谢您!

printf("n");

}

}

【习题4-18】编程实现从键盘输入若干学号,然后输出学号中十位数字是9的学号(输入0时结束循环)。

程序如下:

/*c4_18.c*/

#include

void main()

{

long int num;

scanf("%ld",&num);

do

{

if(num/10%10==9) printf("%ld",num);

scanf("%ld",&num);

}while(num!=0);

}

y【习题4-19】假设x,y是整数,编程求x的最后3位数,要求x、y从键盘输入。

程序如下:

/*c4_19.c*/

#include

void main()

{

int i,x,y;

long last=1;

printf("Input x and y:");

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

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

last=last*x%1000;

printf("The last 3 digits:%ldn",last);

}

【习题4-20】编程实现将从键盘输入的偶数写成两个素数之和。

程序如下:

/*c4_20.c*/

#include

#include

void main()

{

int a,b,c,d;

scanf("%d",&a);

for(b=3;b<=a/2;b+=2)

{

for(c=2;c<=sqrt(b);c++)

如对您有帮助,请购买打赏,谢谢您!

if(b%c==0) break;

if(c>sqrt(b))

d=a-b;

else

continue;

for(c=2;c<=sqrt(d);c++)

if(d%c==0) break;

if(c>sqrt(d)) printf("%d=%d+%dn",a,b,d);

}

}

第5章 数组

【习题5-1】现有一实型一维数组A[12],其各元素值在内存中排列的顺序为:1.0,15.5,9.5,-23,8.4,66.5,7.1,22.0,54.5,-34,11.3,32.5,请按下列要求编写程序求答案。

(1)数组中元素值最小的数组元素。

(2)数组中元素值最大的数组元素。

(3)数组中某数组元素值等于另外两个数组元素值之和的等式。

(4)数组中某数组元素值等于另外两个数组元素值之差的等式。

程序如下:

/*c5_1.c*/

#include

void main()

{

double a[12]={1.0,15.5,9.5,-23,8.4,66.5,7.1,22.0,54.5,-34,11.3,32.5};

int i,j,k;

double max,min;

min=a[0];

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

if(min>a[i]) min=a[i];

printf("min=%lfn",min);

max=a[0];

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

if(max

printf("max=%lfn",max);

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

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

for(k=0;k<12;k++)

{

if(i==j||j==k||k==i) continue;

if(a[i]+a[j]==a[k])

printf("%lf+%lf=%lfn",a[i],a[j],a[k]);

}

如对您有帮助,请购买打赏,谢谢您!

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

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

for(k=0;k<12;k++)

{

if(i==j||j==k||k==i) continue;

if(a[i]-a[j]==a[k])

printf("%lf-%lf=%lfn",a[i],a[j],a[k]);

}

}

【习题5-2】现有一实型二维数组A[4][3],其各元素值在内存中排列的顺序为:

4.0,28.0,15.5,−9.5,−23.0,8.0,56.0,2.0,28.0,7.0,6.2,5.0

请按下列要求写出各题的答案。

(1)数组中元素值最小的数组元素。

(2)数组中元素值最大的数组元素。

(3)数组中某数组元素值等于另外两个数组元素值之积的等式。

(4)数组中某数组元素值等于另外两个数组元素值之商的等式。

答案:

(1)−23.0

(2)56.0

(3)(略)

(4)(略)

【习题5-3】完成下列各数组的数组说明语句。

(1)定义一个有100个数组元素的整型一维数组r。

(2)定义一个有100行100列的实型二维数组s。

(3)定义一个整型三维数组t,第一维长度为3,第二维长度为4,第三维长度为5。

(4)定义一个实型四维数组q,第一维长度为6,第二维长度为5,第三维长度为4,第四维长度为3。

答案:

(1)int r[100];

(2)float s[100][100];

(3)int t[3][4][5];

(4)float q[6][5][4][3];

【习题5-4】说明下面各数组定义的含义,并指出对各数组元素所赋的值。

(1)float a[10]={3.,4.5,6.0,8.4,-32.8,3.2,56.0,4.5,2.3,1.5};

(2)int b[10]={3,5,0,12,34,7,8,9,41,88};

(3)float c[2][4]={1.,2.,3.,4.,5.,6.,7.,8.};

(4)int d[3][3]={{1,2,3},{4,5,6},{7,8,9}};

(5)int e[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};

答案:

(1)(略)

(2)(略)

(3)(略)

(4)(略)

如对您有帮助,请购买打赏,谢谢您!

(5)(略)

【习题5-5】按下列要求完成对各数组的初始化数组语句。

(1)实型一维数组A[12],其各元素值在内存中排列的顺序为:

1.0,15.5,9.5,-23.0,8.4,66.5,7.1,22.0,54.5,-34.0,11.3,32.0

(2)整型二维数组A[3][3],其各元素值在内存中排列的顺序为:

1,2,3,4,5,6,7,8,9

(3)实型三维数组A[2][3][2],其各元素值在内存中排列的顺序为:

1.0,15.5,9.5,-23,8.4,66.5,7.1,22.0,54.5,-34,11.3,32.0

答案:

float a[12]={1.0,15.5,9.5,-23.0,8.4,66.5,7.1,22.0,54.5,-34.0,11.3,32.0};

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

float a[2][3][2]={1.0,15.5,9.5,-23,8.4,66.5,7.1,22.0,54.5,-34,11.3,32.0};

【习题5-6】用数组定义语句和scanf语句完成5.4题中各小题相应的功能。

程序如下:

/*c5_6.c*/

(略)

【习题5-7】有一整型二维数组a[10][10], 按下列要求写出下列各题C语言程序段。

(1)按行输出所有的数组元素。

(2)按列输出所有的数组元素。

(3)输出主对角线上的所有元素。

(4)输出副对角线上的所有元素。

(5)输出上三角阵(包含主对角线元素)的所有元素。

(6)输出上三角阵(包含副对角线元素)的所有元素。

(7)输出下三角阵(包含主对角线元素)的所有元素。

(8)输出下三角阵(包含副对角线元素)的所有元素。

程序如下:

/*c5_7.c*/

#include

void main()

{

int a[10][10];

int i,j,k;

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

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

a[i][j]=i*10+j;

printf("==1==n");

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

{

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

printf("%3d",a[i][j]);

printf("n");

}

如对您有帮助,请购买打赏,谢谢您!

printf("n");

printf("==2==n");

fori=0;i<10;i++)

{

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

printf("%3d",a[j][i]);

printf("n");

}

printf("n");

printf("==3==n");

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

{

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

if(i==j)

printf("%3d",a[i][j]);

else

printf(" ");

printf("n");

}

printf("n");

printf("==4==n");

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

{

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

if(i+j==10-1)

printf("%3d",a[i][j]);

else

printf(" ");

printf("n");

}

printf("n");

printf("==5==n");

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

{

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

if(i<=j)

printf("%3d",a[i][j]);

else

printf(" ");

printf("n");

如对您有帮助,请购买打赏,谢谢您!

}

printf("n");

printf("==6==n");

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

{

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

if(j<10-i)

printf("%3d",a[i][j]);

else

printf(" ");

printf("n");

}

printf("n");

printf("==7==n");

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

{

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

if(i>=j)

printf("%3d",a[i][j]);

else

printf(" ");

printf("n");

}

printf("n");

printf("==8==n");

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

{

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

if(j>=9-i)

printf("%3d",a[i][j]);

else

printf(" ");

printf("n");

}

printf("n");

}

【习题5-8】阅读、分析下列程序,并写出运行相应程序后的输出结果。

(1)#include "stdio.h"

void main()

{ static int a[10]={1,1,1,1,1,1,1,1,1,1};

如对您有帮助,请购买打赏,谢谢您!

int i,j;

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

for(j=0;j

a[i]=a[i]+a[j];

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

printf("%dn",a[i]);

}

(2)#include "stdio.h"

void main()

{ static int a[200];

int i,j,n;

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

a[i]=0;

n=100;

for(i=0;i

for(j=0;j

a[j]=a[i]+1;

printf("%dn",a[n-1]);

}

(3)#include "stdio.h"

void main()

{ int a,b=0;

static int c[10]={1,2,3,4,5,6,7,8,9,0};

for(a=0;a<10;++a)

if((c[a]%2)==0) b+=c[a];

printf("%d",b);

}

(4)#include "stdio.h"

void main()

{ int a,b=0;

static int c[10]={1,2,3,4,5,6,7,8,9,0};

for(a=0;a<10;++a)

if((a%2)==0) b+=c[a];

printf("%d",b);

}

(5)#include "stdio.h"

main()

{ int a,b=0;

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

for(a=0;a<10;++a)

如对您有帮助,请购买打赏,谢谢您!

b+=c[a];

printf("%d",b);

}

(6)#include "stdio.h"

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

void main()

{ int a,b=0;

for( a=0;a<10;++a)

if((c[a]%2)==1) b+=c[a];

printf("%d",b);

}

(1)

结果:

1

2

4

8

16

64

128

256

512

(2)

结果:199

(3)

结果:20

(4)

结果:25

(5)

结果:45

(6)

结果:25

【习题5-9】编写一个程序,完成5.1题的要求。

程序如下:

/*c5_9.c*/

#include

void main()

{

double a[12]={1.0,15.5,9.5,-23,8.4,66.5,7.1,22.0,54.5,-34,11.3,32.5};

int i,j,k;

double max,min;

如对您有帮助,请购买打赏,谢谢您!

min=a[0];

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

if(min>a[i]) min=a[i];

printf("min=%lfn",min);

max=a[0];

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

if(max

printf("max=%lfn",max);

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

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

for(k=0;k<12;k++)

{

if(i==j||j==k||k==i) continue;

if(a[i]+a[j]==a[k])

printf("%lf+%lf=%lf n",a[i],a[j],a[k]);

}

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

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

for(k=0;k<12;k++)

{

if(i==j||j==k||k==i) continue;

if(a[i]-a[j]==a[k])

printf("%lf-%lf=%lf n",a[i],a[j],a[k]);

}

}

【习题5-10】编写一个程序,完成5.2题的要求。

程序如下:

/*c5_10.c*/

(略)

【习题5-11】对给定的整型一维数组a[100]赋值,要求给奇数下标值的元素赋负值,偶数下标值的元素赋正值。

程序如下:

/*c5_11.c*/

#include

void main()

{

int a[100];

int i,j,k;

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

if(i%2==1)

a[i]=-1;

如对您有帮助,请购买打赏,谢谢您!

else

a[i]=1;

}

【习题5-12】给整型二维数组b[3][4]输入12个数据,计算并输出数组中所有正数之和、所有负数之和。

程序如下:

/*c5_12a.c*/

#include

void main()

{ static int b[3][4];

int i,j,sum1=0,sum2=0;

printf("Input 12 numbers:");

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

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

scanf("%d",&b[i][j]);

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

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

{if(b[i][j]>0) sum1+=b[i][j];

if(b[i][j]<0) sum2+=b[i][j];

}

printf("n"); printf("sum1=%d,sum2=%dn",sum1,sum2);}

/*c5-12b.c*/

#include

void main()

{ int x[3][4],i,j,a=0,b=0;

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

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

scanf("%d",&x[i][j]);

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

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

if(x[i][j]>0)

a+=x[i][j];

else

b+=x[i][j];

printf("%dt%d",a,b);

}

【习题5-13】对稀疏数组a[20](所谓稀疏数组,即有若干数组元素值为0的数组),编写一个程序,将所有非零元素值按紧密排列形式转移到数组的前端。(要求:程序中不再开辟其它的单元作为数组元素值的缓存单元)

程序如下:

/*c5_13.c*/

#include

void main()

{

int a[20]={0,0,1,0,2,0,0,0,3,4,0,0,0,0,0,5,0,0,6,0};

int i,j,k;

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

如对您有帮助,请购买打赏,谢谢您!

printf("%3d",a[i]);

printf("n");

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

{

if(a[i]==0) continue;

for(k=i-1;k>=0;k--)

if(a[k]!=0) break;

if(k==i-1) continue;

a[k+1]=a[i];

a[i]=0;

}

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

printf("%3d",a[i]);

printf("n");

}

【习题5-14】用选择法编写一个程序,使存储在整型数组a[100]中的各元素值按升序排列存放。(要求:程序中至多允许使用一个缓存单元)

程序如下:

/*c5_14a.c*/

#include

void main()

{ static int a[100];

int i,j,temp;

printf("Input 100 numbers:");

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

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

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

for(j=i+1;j<100;j++)

if(a[i]>a[j])

{

temp=a[j];

a[j]=a[i];

a[i]=temp;

}

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

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

printf("n");}

/*

void main()

{ int a[100],i,j,min,t;

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

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

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

{ min=i;

for(j=i+1;j<100;j++)

if(a[j]

如对您有帮助,请购买打赏,谢谢您!

t=a[i];

a[i]=a[min];

a[min]=t;

}

printf("sorting.n");

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

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

}

【习题5-15】试编写一个程序,把下面的矩阵a转置成矩阵b的形式。(用两种算法完成)

程序如下:

/*c5_15.c*/

#include

void main()

{

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

int i,j,k;

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

{

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

printf("%3d",a[i][j]);

printf("n");

}

printf("n");

/* method 1

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

{

k=a[0][i];

a[0][i]=a[2][i];

a[2][i]=k;

}

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

{

k=a[i][0];

a[i][0]=a[i][2];

a[i][2]=k;

} */

/* method 2 */

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

{

k=a[0][i];

a[0][i]=a[2][2-i];

如对您有帮助,请购买打赏,谢谢您!

a[2][2-i]=k;

}

k=a[1][0];

a[1][0]=a[1][2];

a[1][2]=k;

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

{

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

printf("%3d",a[i][j]);

printf("n");

}

printf("n");

}

【习题5-16】设二维数组b[5][4]中有鞍点,即b[i][j]元素值在第i行中最小,且在第j列中最大,试编写一程序找出所有的鞍点,并输出其下标值。也可能没有。

程序如下:

/*c5_16a.c*/

#include

void main()

{int b[5][4],i,j,k,l,min,x,y;

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

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

scanf("%d",&b[i][j]);

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

{ min=b[i][0]; y=0;

for(j=1;j<4;j++)

if(min>b[i][j]) {min=b[i][j];x=j;}

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

if(min

if(y==1)

printf("No found!n");

else

printf("B[%d][%d]=%dn",i,x,min);

}

}

/*

void main()

{ int b[5][4],i,j,min,l,k,n=0;

printf("Iutput array b[5][4]:n");

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

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

scanf("%d",&b[i][j]);

printf("Output array b[5][4]:n");

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

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

printf("%3d",b[i][j]);

printf("n");

如对您有帮助,请购买打赏,谢谢您!

}

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

{ min=b[i][0];n=0;

for(j=1;j<4;j++)

if(b[i][j]

{min=b[i][j];l=j;

}

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

if(min

if(n==0)

printf("%d,%d,%dn",i,j,min);

else

printf("No foundn");

}

}

【习题5-17】按如下图案打印杨辉三角形的前10行。杨辉三角形是由二项式定理系数表组成的图型,其特点是两个腰上的数都为1,其他位置上的每一个数是它上一行相邻的两个整数之和。

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

. . . . . . . . . . . . .

程序如下:

/*c5_17.c*/

#include

void main()

{

int a[10][10]={0};

int i,j,k;

for(i=0;i<10;i++) a[i][0]=1;

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

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

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

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

{

for(j=0;j<10-i;j++) printf(" ");

for(j=0;j<=i;j++) printf("%6d",a[i][j]);

printf("n");

}

}

【习题5-18】从键盘输入一个数,然后在一个整型一维数组a[20]中,用折半查找法找

如对您有帮助,请购买打赏,谢谢您!

出该数是数组中第几个元素的值。如果该数不在数组中,则打印“No found”。

程序如下:

/*c5_18a.c*/

#include

void main()

{ int a[20],i,n=0,m=20,a;

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

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

scanf("%d",&a);

while(n<=m)

{ i=(n+m)/2;

if(a[i]==a)

{ printf("%d",i);

break;

}

if(a[i]

if(a[i]>a) m=i-1;

}

if(a[i]!=a) printf("No found !n");

}

/*

#include

void main()

{ static int a[20]={1,2,6,24,120,720,5040,40320,4,8,

16,32,64,128,256,512,1024,2048,4096,8192};

int i,n=0,m=19,l=0,x;

printf("Input your number:n");

scanf("%d",&x);

do

{ i=(n+m)/2;

if(a[i]==x)

{ l=1;

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

break;

}

if(a[i]

if(a[i]>x) m=i-1;

}while(n!=m&&a[i]!=x);

if(l==0) printf("No foundn");}

【习题5-19】编写一个程序,求一个二维矩阵的转置矩阵,即将原矩阵行列互换的结果。

程序如下:

/*c5_19.c*/

#include

#define N 7

void main()

{

int a[N][N];

int i,j,k;

如对您有帮助,请购买打赏,谢谢您!

for(i=0;i

for(j=0;j

a[i][j]=i*N+j;

for(i=0;i

{

for(j=0;j

printf("%3d",a[i][j]);

printf("n");

}

printf("n");

for(i=0;i

for(j=i+1;j

{

k=a[i][j];

a[i][j]=a[j][i];

a[j][i]=k;

}

for(i=0;i

{

for(j=0;j

printf("%3d",a[i][j]);

printf("n");

}

printf("n");

}

【习题5-20】说明下面各数组定义的含义,并指出对各数组元素所赋的值。

(1)static char flag[4]={'T', 'R', 'U', 'E'};

(2)static char flag[ ]={"TRUE"};

(3)static char a[3][7]={"Chine","Canada","Japan"};

程序如下:

/*c5_20.c*/

(略)

【习题5-21】输入一串字符,分别统计其中数字0,1,2,…,9和各字母出现的次数,并按出现的多少输出。(先输出出现次数多的字母,次数相同的按字母表顺序输出,不出现的字母不输出)

程序如下:

/*c5_21.c*/

#include

void main()

{

int a[256];

如对您有帮助,请购买打赏,谢谢您!

int b[256]={0};

int i,j,k,max;

char s[]="askjdhsdjfg123sdfjkzxc";

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

a[i]=i;

for(i=0;s[i]!=0;i++)

b[s[i]]++;

for(i=0;i<256-1;i++)

{

max=i;

for(j=i+1;j<256;j++)

if(b[max]

if(max==i) continue;

k=a[i];a[i]=a[max];a[max]=k;

k=b[i];b[i]=b[max];b[max]=k;

}

for(i=0;i<256&&b[i]!=0;i++)

printf("char%c:%dtimesn",a[i],b[i]);

}

【习题5-22】编程打印如下图形。

*

* *

* *

* *

*

程序如下:

/*c5_22.c*/

#include

void main()

{ int i,j,k;

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

{ for(j=0;j<=2*(3-i);j++) printf(" ");

for(k=1;k<=2*i-1;k++) printf("*");

printf("n");

}

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

{ for(j=1;j<=i;j++) printf(" ");

for(k=1;k<=2*(3-i)-1;k++) printf("*");

printf("n");

}

}

【习题5-23】有一篇文章共有3行文字,每行有80个字符。要求统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。

程序如下:

如对您有帮助,请购买打赏,谢谢您!

/*c5_23.c*/

#include

void main()

{

int i;

char s[]="AMsNJasH00askj dh sdjfg~!123#@@sdfjkzxc";

char *t[5]={"Blank","Digit","Upper","Lower","Other"};

int count[5]={0};

char ch;

for(i=0;s[i]!=0;i++)

{

ch=s[i];

if(ch==' ')

count[0]++;

else if(ch>='0'&&ch<='9')

count[1]++;

else if(ch>='A'&&ch<='Z')

count[2]++;

else if(ch>='a'&&ch<='z')

count[3]++;

else

count[4]++;

}

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

printf("%s:%dtimesn",t[i],count[i]);

}

【习题5-24】有一电文,已按下列规律译成译码:

A→Z a→z

B→Y b→y

C→X c→x

……

即第一个字母变成第26个字母,第i个字母变成第(26−i+1)个字母,非字母字符不变。编写一个程序将密码译成原文,并输出密码和原文。

程序如下:

/*c5_24.c*/

#include "stdio.h"

void main()

{ char a[50],b[50];

int i;

gets(a);

puts(a);

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

如对您有帮助,请购买打赏,谢谢您!

{ if(a[i]>='A'&&a[i]<='Z')

b[i]='Z'+'A'-a[i];

if(a[i]>='a'&&a[i]<='z')

b[i]='z'+'a'-a[i];

}

puts(b);

}

【习题5-25】编写一个程序,将两个字符串s1和s2比较。若s1>s2,输出正数1;若s1等于s2,输出0;若s1

程序如下:

/*c5_25.c*/

#include

void main()

{

int i,t;

char s1[]="asd0123";

char s2[]="asd123";

for(i=0; ;i++)

{

t=s1[i]-s2[i];

if(t!=0||(s1[i]==0)) break;

}

printf("code=%dn",t);

}

【习题5-26】输入下述8个国家或地区名字的字符串:CHINA、JAPAN、KOREA、INDIA、CANADA、AMERICA、ENGLAND和FRANCE,将这些国家或地区名按字典顺序排序。

程序如下:

/*c5_26.c*/

#include "string.h"

#include "stdio.h"

void main()

{ char b[8];

static char a[7][8]={"CHINA","JAPAN","KOREA","INDIA","CANADA",

"ENGLISH","FRANCE"};

int i,j,min;

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

{ min=i;

for(j=i+1;j<7;j++)

if(strcmp(a[min],a[j])>0) min=j;

strcpy(b,a[i]); strcpy(a[i],a[j]); strcpy(a[j],b);

}

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

{ puts(a[i]);

printf("n");

如对您有帮助,请购买打赏,谢谢您!

}

}

第6章 函数和模块设计

【习题6-1】更正下面函数中的错误。

(1)返回求x和y平方和的函数。 (2)返回求x和y为直角边的斜边的函数。

sum_of_sq(x,y) hypot(double x,double y)

{ {

double x,y; h=sqrt(x*x+y*y);

return(x*x+y*y); return(h);

} }

程序如下:

/*c6_1(1).c*/ /*c6_1(2).c*/

(1) (2)

double sum_of_sq(double x,double y) double hypot(double x,double y)

{ {

return(x*x+y*y); double h;

} h=sqrt(x*x+y*y);

return(h);

}

【习题6-2】说明下面函数的功能。

(1)itoa(int n,char s[ ]) (2)int htod(char hex [ ])

{ { int i,dec=0;

static int i=0,j=0; for(i=0;hex[i]!='0';i++)

int c; { if(hex[i]>='0'&&hex[i]<='9')

if(n!=0) dec=dec*16+hex[i]-'0';

{ if(hex[i]>='A'&&hex[i]<='F')

j++; dec=dec*16+hex[i]-'A'+10;

c=n%10+'0'; if(hex[i]>='a'&&hex[i]<='f')

itoa(n/10,s); dec=dec*16+hex[i]-'a'+10;

s[i++]=c; }

} return(dec);

else }

{ (3)void stod(int n)

if(j==0) s[j++]='0'; { int i;

s[j]='0'; if(n<0){ putchar('-');n=-n;}

i=j=0; if((i=n/10)!=0) stod(i);

} putchar(n%10+'0');

} }

功能:

(1)(略)

(2)(略)

如对您有帮助,请购买打赏,谢谢您!

(3)(略)

【习题6-3】编写已知三角形三边求面积的函数,对于给定的3个量(正值),按两边之和大于第三边的规定,判别其能否构成三角形,若能构成三角形,输出对应的三角形面积。要求主函数输入10组三角形三边,输出其构成三角形的情况。

程序如下:

/*c6_3.c*/

#include

#include

double s(double a,double b,double c)

{

double s,ss;

if(a+b

{

printf("Error Data");

return -1;

}

s=(a+b+c)/2;

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

printf("S=%lf",ss);

return ss;

}

void main()

{

int i;

double a,b,c;

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

{

scanf("%lf%lf%lf",&a,&b,&c);

s(a,b,c);

}

}

【习题6-4】分别编写求圆面积和圆周长的函数,另编写一主函数调用之,要求主函数能输入多个圆半径,且显示相应的圆面积和周长。

程序如下:

/*c6_4.c*/

(略)

【习题6-5】设有两个一维数组a[100],b[100],试编写程序分别将它们按升序排序,再将a,b两数组合并存入c数组,使得c数组也按升序排序。若a,b有相等的元素,则把a数组的相等元素优先存入c数组中(其中c数组为c[200])。

程序如下:

/*c6_5.c*/

如对您有帮助,请购买打赏,谢谢您!

#include

#include

void sort(int a[],int size)

{

int i,j,k,min;

for(i=0;i

{

min=i;

for(j=i+1;j

if(a[min]>a[j]) min=j;

k=a[i];

a[i]=a[min];

a[min]=k;

}

}

void main()

{

int a[100],b[100],c[200];

int i,ia,ib,ic;

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

{

a[i]=2*i+1;

b[i]=2*i+2;

}

sort(a,100);

sort(b,100);

ia=0;

ib=0;

ic=0;

for(;;)

{

if(a[ia]

c[ic++]=a[ia++];

else if (a[ia]>b[ib])

c[ic++]=b[ib++];

else

{

c[ic++]=a[ia++];

ib++;

}

if(ia==100)

{

for(;ib<100;ib++)

c[ic++]=b[ib];

break;

}

if(ib==100)

{

for(;ia<100;ia++)

c[ic++]=a[ia];

break;

如对您有帮助,请购买打赏,谢谢您!

}

}

for(i=0;i

printf("%4d",c[i]);

}

【习题6-6】编写一程序,把M×N矩阵a的元素逐列按降序排列。假设M、N不超过10,分别编写求一维数组元素值最大和元素值最小的函数,主函数中初始化一个二维数组a[10][10],调用定义的两函数输出每行、每列的最大值和最小值。

程序如下:

/*c6_6.c*/

#include

int test(int t)

{

int i;

for(i=2;i<=t/2;i++)

if(t%i==0)

return 0;

return 1;

}

void main()

{

int n;

scanf("%d",&n);

printf("result=%d",test(n));

}

【习题6-7】编写一判别素数的函数,在主函数中输入一个整数,输出该数是否为素数的信息。

程序如下:

/*c6_7.c*/

#include

int test(int t)

{

int i;

for(i=2;i<=t/2;i++)

if(t%i==0) return 0;

return 1;

}

void main()

{

int n;

scanf("%d",&n);

printf("result=%d",test(n));

}

【习题6-8】编写程序,实现由主函数输入m,n,按下述公式计算并输出Cm的值。

程序如下:

n

如对您有帮助,请购买打赏,谢谢您!

/*c6_8.c*/

#include

int func(int n)

{

int i,s=1;

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

{

s=s*i;

}

return s;

}

void main()

{

int m,n;

scanf("%d%d",&m,&n);

printf("%d",func(m)/(func(n)*func(m-n)));

}

【习题6-9】编写一个将两个字符串连接起来的函数(即实现strcat函数的功能),两个字符串由主函数输入,连接后的字符串也由主函数输出。

程序如下:

/*c6_9.c*/

#include

int strcat1(char *s1,char *s2)

{ int t;

while(*s1) s1++;

while(*s2)

{ *s1=*s2;

s1++;

s2++;

}

*s2='0';

}

void main()

{ char *s1="Test1";

char *s2="Test2";

strcat1(char *s1,char *s2)

printf("%s",s1); /*puts(s1);*/

}

【习题6-10】编写一个实现strcmp函数功能的函数,并试用主函数调用之。

程序如下:

/*c6_10.c*/

#include

int strcmp(char *s1,char *s2)

{

如对您有帮助,请购买打赏,谢谢您!

int t;

while((t=(*s1-*s2))==0 )

{

s1++;

s2++;

if(*s1==0) break;

}

return t;

}

void main()

{

char *s1="Test1";

char *s2="Test2";

printf("strcmp %s,%s=%d",s1,s2,strcmp(s1,s2));

}

【习题6-11】编写一个实现strcpy函数功能的函数,并试用主函数调用。

程序如下:

/*c6_11.c*/

(略)

【习题6-12】编写一个实现strlen函数功能的函数,并试用主函数调用之。

程序如下:

/*c6_12.c*/

#include

int strlen1(char *s)

{

int t=0;

while(*(s+t))

t++;

return t;

}

void main()

{

char *s1="Test1";

printf("strlen %s =%d",s1,strlen1(s1));

}

【习题6-13】编写一函数,调用6.11题的函数,将字符数组char1[10]的前5个字符复制到字符数组char2[10]中。主函数实现字符数组char1[10]的初始化,并输出复制后的字符数组ch2[10]的内容。

程序如下:

/*c6_13.c*/

(略)

如对您有帮助,请购买打赏,谢谢您!

【习题6-14】编写一函数实现用弦截法求方程x−3x+3x−9=0的近似根。主函数完成各系数值的输入及所求得的根值的输出。

程序如下:

/*c6_14.c*/

#include

#include

float f(float x)

{

float y;

y=((x-3.0)*x+3.0)*x-9.0;

return (y);

}

float xpoint(float x1,float x2)

{

float x;

x=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));

return (x);

}

float root(float x1,float x2)

{

float x,y,y1;

y1=f(x1);

do

{

x=xpoint(x1,x2);

y=f(x);

if(y*y>0)

{

y1=y;

x1=x;

}

else

x2=x;

}while(fabs(y)>0.0001);

return (x);

}

void main()

{

float x1,x2,f1,f2,x;

do

{

printf("n Input X1,X2:");

scanf("%f,%f",&x1,&x2);

f1=f(x1);

f2=f(x2);

}while(f1*f2>=0);

x=root(x1,x2);

printf("Root is %f",x);

}

32【习题6-15】编写一函数实现用牛顿迭代法求方程ax+bx+cx+d=0在x=1附近的一个32

如对您有帮助,请购买打赏,谢谢您!

实根。主函数完成各系数值的输入及所求得的根值的输出。

迭代公式:

f(xn)

xn+1=xn- --------- |xn+1-xn|<1e-5

f’(xn)

程序如下:

/*c6_15.c*/

#include

float root(float a,float b,float c,float d)

{ float x=1,x1,f,f1;

do

{ x1=x;

f=((a*x1+b)*x1+c)*x1+d;

f1=(3*a*x1+2*b)*x1+c;

x=x1-f/f1;

}while(fabs(x-x1)>=0.00001);

return(x);

}

void main()

{ float a,b,c,d;

printf("Enter values to a,b,c,dn");

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

printf("nx=%8.4fn",root(a,b,c,d));

}

【习题6-16】编写程序完成用递归方法求n阶勒让德多项式的值。递归公式为:

程序如下:

/*c6_16.c*/

#include

double func(int n,double x)

{

switch(n)

{

case 0:

return 1;

case 1:

return x;

default:

return (2*n-1)*x*func(n-1,x)-(n-1)*func(n-2,x)/n;

}

}

void main()

{

double x=0.1;

int n=5;

printf("%lf",func(n,x));

}

【习题6-17】编写计算最小公倍数的函数,试由主函数输入两个正整数a和b调用它。计算最小公倍数的公式为:

lcm(u,v) = u*v/gcd(u,v) (u,v≥0)

如对您有帮助,请购买打赏,谢谢您!

其中,gcd(u,v)是u、v的最大公约数。lcm(u,v)是u、v的最小公倍数。

程序如下:

/*c6_17.c*/

int getgcd(int m,int n)

{ int temp;

while(m!=n)

{ if(m

m=m-n;

}

return(m);

}

int getlcm(int m,int n)

{

return(m*n/getlcm(m,n));

}

#include "stdio.h"

void main()

{

int m,n,t;

printf("Enter values to m,n:n");

scanf("%d%d",&m,&n);

t=getlcm(m,n);

printf("%d",t);

}

【习题6-18】编写一个计算x的y次幂的递归函数,x为double型,y为int型,函数返回值为double型。函数中使用下面的格式:

power(x,0)=1.0;

power(x,y)=power(x,y-1)*x;

要求从主程序输入浮点数,调用这个递归函数,求其整数次幂。

程序如下:

/*c6_18.c*/

#include

double power(double x,int y)

{

switch(y)

{

case 0:

return 1;

default:

return power(x,y-1)*x;

}

}

void main()

{

double x=2;

int y=5;

printf("%lf",power(x,y));

}

【习题6-19】将6.8题改为用带参数的宏名来求面积。

如对您有帮助,请购买打赏,谢谢您!

程序如下:

/*c6_19.c*/

#include

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

#define s(a,b,c,n) sqrt(n(a,b,c)*(n(a,b,c)-a)*(n(a,b,c)-b)*(n(a,b,c)-c))

#include "stdio.h"

void main()

{ float a,b,c,d;

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

{ scanf("%f%f%f",&a,&b,&c);

if(a+b>c&&a+c>b&&b+c>a&&a>0&&b>0&&c>0)

{ d=s(a,b,c,n);

printf("It can form a trianglen");

printf(“d=%f",d);

}

else

printf("It can not form a trianglen");

}

【习题6-20】编写一个实现将十六进制数转换成相应十进制数的函数,并试用主函数调用。

程序如下:

/*c6_20.c*/

#include

int HexToInt(char *s)

{

int n=0,t;

char c;

while(c=*s++)

{

t=0;

if('0'<=c&&c<='9')

t=c-'0';

if('A'<=c&&c<='F')

t=c-'A'+10;

if('a'<=c&&c<='f')

t=c-'a'+10;

n=n*16+t;

}

return n;

}

void main()

{

char *s="A00D";

printf("%d",HexToInt(s));

}

【习题6-21】编写一个将英文字符串中所有字的首字符转换成相应大写字符的函数,并试用主函数调用。

程序如下:

/*c6_21.c*/


本文标签: 数组 函数 输出 元素