C语言编程练习6-9章

更新时间:2024-02-26 14:26:01 阅读量: 综合文库 文档下载

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

第6章 C控制语句:循环

编程练习

1.编写一个程序,创建一个具有26个元素的数组,并在其中存储26个小写字母。并让该程序显示该数组的内容。

#include int main(void) {

char ABC[26]; int i;

for(i=0;i<26;i++) ABC[i] = 'a' + i; for(i=0;i<26;i++)

printf(\ printf(\ return(0); }

2.使用嵌套循环产生下列图案: S $$ $$$ $$$$ $$$$$

#include int main(void) {

int i,j;

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

for(j=0;j<=i;j++) printf(\ printf(\ }

return(0); }

3.使用嵌套循环产生下列图案:

F FE FED FEDC FEDCB FEDCBA 请注意:如果您的系统不使用ASCⅡ或其他以数字顺序编码的码,您可以把一个字符数组初始化为字母表中的字母:

char lets[26]=\

然后就可以使用数组索引来选用单个的字母,例如lets[0]是'A',等等。

#include int main(void) {

int i,j;

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

for(j=0;j<=i;j++) printf(\ printf(\ }

return(0); }

4.让程序要求用户输入一个大写字母,使用嵌套循环产生像下面这样的金字塔图案: A ABA ABCBA ABCDCDA ABCDEDCBA

这种图案要扩展到用户输入的字符。例如,前面的图案是在输入E时需要产生的。提示:使用一个外部循环来处理行,在每一行中使用三个内部循环,一个处理空格,一个以升序打印字母,一个以降序打印字母。如果您的系统不使用ASCII或类似的以严格数字顺序表示字母的编码,请参见在编程练习3中给出的建议。

#include

int main(void) {

int i,j,k; char letter;

printf(\ scanf(\ k=letter-'A'+1; for(i=0;i

for(j=0;j

for(j=0;j<=i;j++) printf(\ for(j=i-1;j>=0;j--) printf(\ printf(\ }

return(0); }

5.编写一个程序打印一个表,表的每一行都给出一个整数、它的平方以及它的立方。要求用户输入表的上限与下限。使用一个for循环。

#include

int main(void) {

int i,min,max;

printf(\ scanf(\

printf(\ for(i=min;i<=max;i++) {

printf(\ }

return(0); }

6.编写一个程序把一个单词读入一个字符数组,然后反向打印出这个词。提示:使用strlen()(第4章)计算数组中最后一个字符的索引。

#include #include

int main(void) {

char word[20]; int i;

printf(\ scanf(\

for(i=strlen(word)-1;i>=0;i--) printf(\ printf(\ return(0); }

7.编写一个程序,要求输入两个浮点数,然后打印出用二者的差值除以二者的乘积所得的结果。在用户键入非数字的输入之前程序循环处理每对输入值。

#include

int main(void) {

float a,b;

printf(\ while(scanf(\ {

printf(\ printf(\ }

printf(\ return(0); }

8.对练习7进行修改,让它使用一个函数来返回计算值。

#include

float calculate(float,float);

int main(void) {

float a,b;

printf(\ while(scanf(\ {

printf( \ printf(\ }

printf(\ return(0); }

float calculate(float x,float y) {

return( (x-y) / (x*y) ); }

9.编写一个程序,要求用户输入下限整数和一个上限整数,然后,依次计算从下限到上限的每一个整数的平方的加和,最后显示结果。程序将不断提示用户输入下限整数和上限整数并显示出答案,直到用户输入的上限整数等于或小于下限整数为止。程序运行的结果示例应该如下所示:

Enter lower and upper integer limits: 5 9 The sums of the squares from 25 t0 81 is 255 Enter next set of limits:3 25

The sums of the squares from 9 t0 625 iS 5520 Enter next set of limits:5 5 Done

#include

int main(void) {

int lower,upper,sum,i;

printf(\ scanf(\ while(lower

for(i=lower,sum=0;i<=upper;i++) sum+=i*i;

printf(\ printf(\ scanf(\

}

printf(\ return(0); }

10.编写一个程序把8个整数读入一个数组中,然后以相反的顺序打印它们。

#include

int main(void) {

int num[8],i;

printf(\ for(i=0;i<8;i++)

scanf(\ for(i=7;i>=0;i--)

printf(\ printf(\ return(0); }

11.考虑这两个无限序列:

1.0+1.0/2.0+1.0/3.0+1.0/4.0+… 1.0 - 1.0/2.0+1.0/3.0 - 1.0/4.0+…

编写一个程序来计算这两个序列不断变化的总和,直到达到某个次数。让用户交互地输入这个次数。看看在20次、100次和500次之后的总和。是否每个序列都看上去要收敛于某个值?提示:奇数个-1相乘的值为-1,而偶数个-1相乘的值为1。

#include

int main(void) {

double i,sum1,sum2; int sign,count;

printf(\ scanf(\

for(i=1.0,sign=1,sum1=0,sum2=0;i<=count;i++,sign *= -1) {

sum1 += 1.0 / i;

sum2 += sign * 1.0 / i; }

printf(\ printf(\ return(0); }

12.编写一个程序,创建一个8个元素的int数组,并且把元素分别设置为2的前8次幂,然后打印出它们的值。使用for循环来设置值;为了变化,使用do while循环来显示这些值。

#include #include

int main(void) {

int num[8],i; for(i=0;i<8;i++)

num[i] = pow(2,i); //pow乘幂函数 用到math头文件 i = 0; do

printf(\ while(++i<8); printf(\ return(0); }

13.编写一个程序,创建两个8元素的double数组,使用一个循环来让用户键入第一个数组的8个元素的值。程序把第二个数组的元素设置为第一个数组元素的累积和。例如,第二个数组的第4个元素应该等于第一个数组的前4个元素的和,第二个数组的第5个元素应该等于第一个数组的前5个元素的和(使用嵌套循环可以做到这一点。不过利用第二个数组的第5个元素等于第二个数组的第4个元素加上第一个数组的第5个元素这一事实,可以避免嵌套而只使用单个循环来完成这个任务)。最后,使用一个循环来显示两个数组中的内容,第一个数组在一行中显示,而第二个数组中的每个元素在第一个数组的对应元素之下进行显示。

#include int main(void) {

double num[8],sum[8]; int i,j;

printf(\ for(i=0;i<8;i++) {

scanf(\ for(j=0,sum[i]=0;j<=i;j++) sum[i] += num[j]; }

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

printf(\ printf(\ for(i=0;i<8;i++)

printf(\ printf(\ return(0); }

14.编写一个程序读入一行输入,然后反向打印该行。您可以把输入存储在一个char数组中;假定该行不超过255个字符。回忆一下,您可以使用具有%c说明符的scanf()从输入中一次读入一个字符,而且当您按下回车键时会产生换行字符(\\n)。

#include #define LENGTH 20 int main(void) {

char a[255]; int i;

for(i=0;i

for(i=LENGTH-1;i>=0;i--) printf(\ printf(\ return(0); }

15. Daphne以10%的单利息投资了100美元(也就是说,每年投资赢得的利息等于原始投资的10%)。Deirdre则以每年5%的复合利息投资了10O美元(也就是说,利息是当前结余的5%,其中包括以前的利息)。编写一个程序,计算需要多少年Deirdre的投资额才会超过Daphne,并且显示出到那时两个人的投资额。

#include

int main(void) {

double Daphne=100,Deirdre=100; int i=0;

while(Daphne>=Deirdre) {

Daphne += 100 * 0.1; Deirdre += Deirdre * 0.05; i++; }

printf(\%d years,Deirdre's is %lf\\n\ return(0); }

16. Chuckie Lucky赢了100万美元,他把它存入一个每年赢得8%的帐户。在每年的最后一天,Chuckie取出10万美元。编写一个程序,计算需要多少年Chuckie就会清空他的帐户。

#include

int main(void) {

double investment = 100; int i=0;

while(investment > 0) {

investment += investment * 0.08; investment -= 10; i++; }

printf(\ return(0); }

investment is %lf,Daphne's investment

第七章 C控制语句:分支和跳转

编程练习

1.编写一个程序。该程序读取输入直到遇到#字符,然后报告读取的空格数目、读取的换行符数目以及读取的所有其他字符数目。

#include

int main(void) {

int space=0,newline=0,others=0; char a;

printf(\ while((a=getchar()) != '#') if(a == ' ') space++;

else if (a == '\\n') newline++; else others++;

printf(\ return(0); }

2.编写一个程序,该程序读取输入直到遇到#字符。使程序打印每个输入的字符以及它的十进制ASCII码。每行打印8个字符,编码对。建议:利用字符计数和模运算符(%)在每8个循环周期时打印一个换行符。

#include

int main(void) {

char a; int i;

printf(\ for(i = 1; (a = getchar()) != '#'; i++) {

printf(\ if(i%8 == 0) printf(\ }

printf(\

return(0); }

3.编写一个程序。该程序读取整数,直到输入0。输入终止后,程序应该报告输入的偶数(不包括0)总个数、偶数的平均值,输入的奇数总个数以及奇数的平均值。

#include

int main(void) {

int i_even = 0, sum_even = 0, i_odd = 0, sum_odd = 0, num; printf(\ while(1) {

scanf(\ if (num == 0) break;

if (num % 2 == 0) {i_even++; sum_even += num;} else {i_odd++; sum_odd += num;} }

printf(\

printf(\ printf(\ number's count:%d\\n\

printf(\ number's average:%d\\n\ return(0); }

4.利用if else语句编写程序读取输入,直到#。用一个感叹号代替每个句号,将原有的每个感叹号用两个感叹号代替,最后报告进行了多少次替代。

#include

int main(void) {

int a=0,b=0; char ch;

printf(\ while((ch = getchar()) != '#') {

if(ch == '.') {putchar('!'); a++;}

else if(ch == '!') {putchar('!');putchar('!'); b++;} else putchar(ch); }

printf(\ %d\\n\ printf(\ return(0); }

5.用switch重做练习3。

#include

int main(void) {

int i_even = 0, sum_even = 0, i_odd = 0, sum_odd = 0, num; printf(\ while(1) {

scanf(\ if (num == 0) break; switch(num % 2) {

case 0: i_even++; sum_even += num; break;

case 1: i_odd++; sum_odd += num; } }

printf(\

printf(\ printf(\ number's count:%d\\n\

printf(\ number's average:%d\\n\

return(0); }

6.编写一个程序读取输入,直到#,并报告序列ei出现的次数。

此程序必须要记住前一个字符和当前的字符。用诸如“Receive your eieio award.”的输入

测试它。

#include

int main(void) {

char former=0,present; int count=0;

while((present=getchar()) != '#') {

if((former == 'e') && (present == 'i')) count++; former = present; }

printf(\ return(0); }

7.编写程序,要求输入一周中的工作小时数,然后打印工资总额、税金以及净工资。作如下假设:

a.基本工资等级=10.00美元//J,时 b.加班(超过40小时)=1.5倍的时间 c.税率 前300美元为15% 下一个150美元为20% 余下的为25%

用#define定义常量,不必关心本例是否符合当前的税法。

#include //a.基本工资

#define BASIC 10.00 //基本工资等级=BASIC美元/小时 //b.加班

#define TIME 40 //加班(超过TIME小时) = #define ADD 1.5 //ADD倍的时间 //c.税率

#define LIMIT1 300 //前LIMIT1美元为RATE1 #define RATE1 0.15

#define LIMIT2 150 //下一个LIMIT2美元为RATE2 #define RATE2 0.20

#define RATE3 0.25 //余下的位RATE3 int main(void) {

double hours,gross,tax;

printf(\ scanf(\

if (hours > 40) hours = 40 + (hours - 40) * 1.5; gross = hours * BASIC;

printf(\

if (gross <= LIMIT1) tax = gross * RATE1;

else if (gross <= LIMIT2) tax = LIMIT1 * RATE1 + (gross - LIMIT1) * RATE2;

else tax = LIMIT1 * RATE1 + LIMIT2 * RATE2 + (gross - LIMIT1 - LIMIT2) * RATE3; printf(\

printf(\ return(0); }

8.修改练习7中的假设a,使程序提供一个选择工资等级的菜单。用switch选择工资等级。程序运行的开头应该像这样:

Enter the number corresponding to the desired pay rate or action: 1) $8.75/hr 2) $9.33/hr 3) $lO.OO/hr 4) $11.20/hr 5) quit

如果选择l到4.那么程序应该请求输入工作小时数。程序应该一直循环运行,直到输入5。如果输入l到5以外的选项,那么程序应该提醒用户合适的选项是哪些,然后再循环。用#define为各种工资等级和税率定义常量。

#include int get_int(void);

//b.加班

#define TIME 40 //加班(超过TIME小时) = #define ADD 1.5 //ADD倍的时间 //c.税率

#define LIMIT1 300 //前LIMIT1美元为RATE1 #define RATE1 0.15

#define LIMIT2 150 //下一个LIMIT2美元为RATE2 #define RATE2 0.20

#define RATE3 0.25 //余下的位RATE3

int main(void) {

double basic,hours,gross,tax;

printf(\ printf(\ printf(\ printf(\

switch( get_int() ) {

case 1: basic = 8.75; break; case 2: basic = 9.33; break; case 3: basic = 10.00; break; case 4: basic = 11.20; break;

default: printf(\退出程序

}

printf(\ printf(\ scanf(\

if (hours > 40) hours = 40 + (hours - 40) * 1.5; gross = hours * basic;

printf(\

if (gross <= LIMIT1) tax = gross * RATE1;

else if (gross <= LIMIT2) tax = LIMIT1 * RATE1 + (gross - LIMIT1) * RATE2;

else tax = LIMIT1 * RATE1 + LIMIT2 * RATE2 + (gross - LIMIT1 - LIMIT2) * RATE3; printf(\

printf(\ return(0); }

int get_int(void) //得到一个合适的整数,滤除非法数 {

int num; char str[40];

while(scanf(\ {

gets(str);

printf(\ }

while ( getchar() != '\\n'); return num; }

9.编写一个程序,接受一个整数输入,然后显示所有小于或等于该数的素数。

#include int isprime(int); int main(void)

{

int num,i;

printf(\ scanf(\

printf(\ for(i=2;i<=num;i++) if( isprime(i) ) printf(\ printf(\ return(0); }

int isprime(int n) //如果n是素数 返回1,反之 返回0 {

int div;

for(div = 2; div * div <= n; div++) if (n % div == 0) return 0; return 1; }

10. 1988年United States Federal Tax Schedule是近期最基本的。它分为4类,每类有两个等级。下面是其摘要;美元数为应征税的收入。 ┏━━━━━━┳━━━━━━━━━━━━━━━━━━┓ ┃ 种 类

┃ ┣━━━━━━╋━━━━━━━━━━━━━━━━━━┫ ┃单身 ┃前17·850美元按15%,超出部分按28% ┃ ┣━━━━━━╋━━━━━━━━━━━━━━━━━━┫ ┃户主 ┃前23,900美元按15%,超出部分按28%┃ ┣━━━━━━╋━━━━━━━━━━━━━━━━━━┫ ┃已婚,共有 ┃前29,750美元按15%,超出部分按28% ┃ ┣━━━━━━╋━━━━━━━━━━━━━━━━━━┫ ┃已婚,离异 ┃前14,875美元按l5%,超出部分按28% ┃

┗━━━━━━┻━━━━━━━━━━━━━━━━━━┛

例如,有20 000美元应征税收入的单身雇佣劳动者应缴税金0.15×17 850美元+0.28×(20 000美元-17 850美元)。编写一个程序,让用户指定税金种类和应征税收入,然后计算税金。使用循环以便用户可以多次输入。

#include

#define SINGLE 17850 #define HOST 23900

#define MARRIED_SHARE 29750 #define MARRIED_DIVORCE 14875 #define RATE1 0.15 #define RATE2 0.28

int main(void) {

double type,pay,tax; char ch; while(1) {

printf(\

printf(\ while((ch = getchar()) == '\\n') continue; //滤掉回车 switch(ch) {

case '1': type = SINGLE; break; case '2': type = HOST; break;

case '3': type = MARRIED_SHARE; break; case '4': type = MARRIED_DIVORCE; break; case '5': printf(\退出程序 default : printf(\ }

printf(\ printf(\ scanf(\

if (pay <= type) tax = pay * RATE1;

else tax = type * RATE1 + (pay - type) * RATE2; printf(\ } }

11. ABC Mail Order Grocery朝鲜蓟的售价是1.25美元/磅,甜菜的售价是0.65美元/磅,胡萝卜的售价是0.89美元/磅。在添加运输费用之前,他们为100美元的订单提供5%的打折优惠。对5磅或以下的定单收取3.50美元的运输和装卸费用;超过5磅而不足20磅的定单收取1O.OO美元的运输和装卸费用:加磅或以上的运输,在8美元基础上每磅加收0.1美元。编写程序,在循环中使用switch语句,以便对输入a的响应是让用户输入所需的朝鲜蓟磅数,b为甜菜的磅数,c为胡萝卜的磅数,而q允许用户退出订购过程。然后程序计算总费用、折扣和运输费用(如果有运输费的话),以及总数。随后程序应该显示所有的购买信息:每磅的费用、订购的磅数、该订单每种蔬菜的费用、订单的总费用、折扣,如果有的话加上运输费用,以及所有费用的总数。

#include

#include //需要调用tolower函数 #define ARTICHOKE 1.25 //单价 #define BEET 0.65 #define CARROT 0.89

#define DISCOUNT_LIMIT 100 #define DISCOUNT_RATE 0.05 #define FREIGHT_FEE1 3.50 #define FREIGHT_LIMIT1 5 #define FREIGHT_FEE2 10.00 #define FREIGHT_LIMIT2 20 #define FREIGHT_FEE3 8 #define FREIGHT_RATE 0.1

int main(void) {

char ch;

double artichoke=0,beet=0,carrot=0; //磅数

double sum,discount,freight;

printf(\ printf(\ printf(\

printf(\ printf(\

printf(\

while( ( ch = tolower( getchar() ) ) != 'q') //tolower:大写转小写 {

switch(ch) {

case 'a': printf(\ scanf(\

printf(\ continue;

case 'b': printf(\ scanf(\

printf(\ continue;

case 'c': printf(\ scanf(\

printf(\ continue; default: break; }

}

printf(\

printf(\ printf(\ printf(\* artichoke,BEET beet,CARROT * carrot);

sum = ARTICHOKE * artichoke + BEET * beet + CARROT * carrot; if (sum > DISCOUNT_LIMIT) discount = sum*DISCOUNT_RATE; else discount = 0;

printf(\

if (artichoke + beet + carrot <= 5) freight = 3.50; else if (artichoke + beet + carrot <20) freight = 10; else freight = 8 + (artichoke + beet + carrot) * 0.1; printf(\ sum = sum - discount + freight; printf(\ return 0; }

*

第8章 字符输入/输出和输入确认

编程练习

下面的一些程序要求输入以EOF终止。如果您的操作系统难以使用或不能使用重定向,则使用一些其他的判断来终止输入,例如读取&字符。

1.设计一个程序,统计从输入到文件结尾为止的字符数。

#include int main(void) { int i;

for(i=0; getchar() != EOF; i++); printf(\ return 0; }

2.编写一个程序,把输入作为字符流读取,直到遇到EOF。令该程序打印每个输入字符及其ASCII编码的十进制值。注意在ASCII序列中空格字符前面的字符是非打印字符,要特殊处理这些字符。如果非打印字符是换行符或制表符,则分期打印\\n或\\t。否则,使用控制字符符号。例如,ASCII的l是Ctrl+A,可以显示为AA。注意A的ASCⅡ值是Ctrl+A的值加64。对其他非打印字符也保持相似的关系。除去每次遇到一个换行符时就开始一个新行之外,每行打印10对值。

#include

int main(void) {

char ch; int i;

for(i=1; (ch=getchar()) != EOF; i++) {

if (ch >= ' ' || ch == '\\n' || ch == '\\t') printf(\ else printf(\ printf(\

if(i%8 == 0) printf(\ }

return 0; }

3.编写一个程序,把输入作为字符流读取,直至遇到EOF。令其报告输入中的大写字母个数和小写字母个数。假设小写字母的数值是连续的,大写字母也是如此。或者你可以使用ctypc,h库中的合适的函数来区分大小写。

#include #include

int main(void) {

char ch;

int lower=0,upper=0;

while ( (ch=getchar()) != EOF ) {

if ( islower(ch) ) lower++; if ( isupper(ch) ) upper++; }

printf(\ return 0; }

4.编写一个程序,把输入作为字符流读取,直至遇到EOF。令其报告每个单词的平均字母数。不要将空白字符记为单词中的字母。实际上,标点符号也不应该计算,但现在不必考虑这一点(如果您想做得好一些,可以考虑使用ctype.h系列中的ispunct()函数)。 (网友:野性的呼吸…… 提供)

(如果你的编译器不支持bool,用宏定义处理bool,true,false) #include #include #include

int main(void) {

char ch; int words = 0; int n_words = 0; bool inwords = false; while((ch = getchar()) != EOF) {

if(!ispunct(ch) && (!isspace(ch))) words++;

if(!isspace(ch) && !inwords) {

inwords = true; /*开始一个新单词*/

n_words++; /*统计单词数*/ }

if(isspace(ch) && inwords)

inwords = false; /*到达单词的尾部*/ }

printf(\ printf(\

printf(\ (float)words/(float)n_words); return 0; }

5,修改程序清单8,4中的猜测程序,使其使用更智能的猜测策略。例如,程序最初猜50,让其询问用户该猜测值是大、小还是正确。如果该猜测值小,则令下一次猜测值为50和100的中值,也就是75。如果75大,则下一次猜测值为75和50的中值,等等。使用这种二分搜索(binary search)策略,起码如果用户没有欺骗,该程序很快会获得正确答案。

#include

int main(void) {

int guess, max = 100, min = 1; char response;

printf(\ printf(\ printf(\

printf(\

printf(\ while((response = getchar()) != 'y') {

if (response == 'b') {

max = guess - 1;

printf(\ }

else if (response == 'l')

{

min = guess + 1;

printf(\ }

else printf(\ while (getchar() != '\\n'); }

printf(\ return 0; }

6.修改程序清单8.8中的get_first()函数,使其返回所遇到的第一个非空白字符。在一个简单的程序中测试该函数。

#include #include char get_first(void);

int main(void) {

char ch;

while((ch = get_first() ) != EOF) {

putchar(ch); }

return 0; }

char get_first(void) {

int ch;

while( isspace( ch = getchar() ) ); while ( getchar() != '\\n'); return ch; }

7.修改第7章的练习8,使菜单选项由字符代替数字进行标记。

#include #include char get_first(void);

//b.加班

#define TIME 40 //加班(超过TIME小时) = #define ADD 1.5 //ADD倍的时间 //c.税率

#define LIMIT1 300 //前LIMIT1美元为RATE1 #define RATE1 0.15

#define LIMIT2 150 //下一个LIMIT2美元为RATE2 #define RATE2 0.20

#define RATE3 0.25 //余下的位RATE3

int main(void) {

double basic,hours,gross,tax;

printf(\ printf(\ printf(\ printf(\ switch( get_first() ) {

case '1': basic = 8.75; break; case '2': basic = 9.33; break; case '3': basic = 10.00; break; case '4': basic = 11.20; break;

default: printf(\退出程序

}

printf(\ printf(\ scanf(\

if (hours > 40) hours = 40 + (hours - 40) * 1.5; gross = hours * basic;

printf(\

if (gross <= LIMIT1) tax = gross * RATE1;

else if (gross <= LIMIT2) tax = LIMIT1 * RATE1 + (gross - LIMIT1) * RATE2;

else tax = LIMIT1 * RATE1 + LIMIT2 * RATE2 + (gross - LIMIT1 - LIMIT2) * RATE3; printf(\

printf(\ return(0); }

char get_first(void) //得到字符串中的第一个非空字符 {

int ch;

while( isspace( ch = getchar() ) ); while ( getchar() != '\\n'); return ch;

}

8.编写一个程序,显示一个菜单,为您提供加法、减法、乘法或除法的选项。获得您的选择后,该程序请求两个数,然后执行您选择的操作。该程序应该只接受它所提供的菜单选项。它应该使用float类型的数,并且如果用户未能输入数字应允许其重新输入。在除法的情况中,如果用户输入O作为第二个数,该程序应该提示用户输入一个新的值。一个典型的程序运行应该如下所示:

Enter the operation of your choice: a. add s. subtract m. multiply d. divide q. quic

Enter first number: 22.4 Enter second number: one one is not an number.

Please enter a number, such as 2.5. -1.78E8, or 3. 1 22.4 + 1 = 23.4

Enter the operation of your choice: a. add s. subtract m. multiply d. divide q. quit

Enter first number: 18.4 Enter second number: O

Enter a number other than 0: 0.2 18.4 / 0.2 = 92

Enter the operation of your choice: a. add s. subtract m. multiply d. divide q. quit q Bye.

#include #include float get_float(void); char get_first(void);

int main(void) {

char select;

float num1,num2; while(1) {

printf(\ printf(\ s.subtract:\\n\ printf(\ d.divide\\n\ printf(\ select = get_first();

if( select != 'a' && select != 's' && select != 'm' && select != 'd') {

printf(\ break; }

printf(\ num1 = get_float();

printf(\ num2 = get_float();

while( select == 'd' && num2 == 0) {

printf(\ num2 = get_float(); }

switch(select) {

case 'a': printf(\ case 's': printf(\ case 'm': printf(\ case 'd': printf(\ default : break; } }

return(0); }

float get_float(void) //得到一个合适的浮点数,滤除非法数 {

float num; char str[40];

while(scanf(\ {

gets(str);

printf(\

printf(\ }

while ( getchar() != '\\n'); return num; }

char get_first(void) //得到字符串中的第一个字符,滤除其他字符 {

int ch;

while( isspace( ch = getchar() ) ); while ( getchar() != '\\n'); return ch; }

第9章 函 数

编程练习

1.设计函数 min(x,y),返回两个double数值中较小的数值,同时用一个简单的驱动程序测试该函数。

#include

double min(double ,double );

int main(void) {

double x,y;

printf(\ scanf(\

printf(\ return(0); }

double min(double a,double b) {

return a

2.设计函数chline(ch, i, j),实现指定字符在i列到j列的输出,并用一个简单的驱动程序测试该函数。

#include

void chline(char , int , int ); int main(void) {

int x,y; char ch;

printf(\ scanf(\

printf(\ scanf(\ chline(ch,x,y); return 0; }

void chline(char ch, int i, int j) {

int k;

for(k=1; k

3.编写一个函数。函数的3个参数是一个字符和两个整数。字符参数是需要输出的字符。第一个整数说明了在每行中该字符输出的个数,而第二个整数指的是需要输出的行数。编写一个调用该函数的程序。

#include

void chline(char , int , int ); int main(void) {

int x,y; char ch;

printf(\ scanf(\

printf(\ scanf(\ chline(ch,x,y); return 0; }

void chline(char ch, int column, int row) {

int x,y;

for(y=0; y

for(x=0; x

4.两数值的谐均值可以这样计算:首先对两数值的倒数取平均值,最后再取倒数。编写一个带有两个double参数的函数,计算这两个参数的谐均值。

#include

double calculate(double ,double );

int main(void) {

double a,b;

printf(\ scanf(\

printf(\ = %0.3lf\\n\ return 0; }

double calculate(double x,double y) {

return 1/( (1/x+1/y) / 2 ); }

5.编写并测试函数larger_of(),其功能是将两个double类型变量的数值替换成它们中的较大值。例如,larger_of(x,y)会把x和y中的较大数值重新赋给变量x和y

#include

void large_of(double *,double *);

int main(void) {

double a,b;

printf(\ scanf(\ large_of(&a,&b);

printf(\ return 0; }

void large_of(double *x,double *y) {

*x = *y = *x>*y? *x:*y; }

6.编写一个程序,使其从标准输入读取字符,直到遇到文件结尾。对于每个字符,程序需要检查并报告该字符是否是一个字母。如果是的话,程序还应报告该字母在字母表中的数值位置。例如,c和C的字母位置都是3。可以先实现这样一个函数:接受一个字符参数,如果该字符为字母则返回该字母的数值位置,否则返回-1。

#include #include int ABC(char ch);

int main(void) {

char ch;

printf(\ scanf(\

printf(\ return 0; }

int ABC(char ch) {

if(isalpha(ch)) return tolower(ch) - 'a' + 1 ; else return -1; }

7.在第6章“C控制语句:循环”的程序清单6.20中,函数power()的功能是返回一个double

类型数的某个正整数次幂。现在改进该函数,使其能正确地计算负幂。同时,用该函数实现0的任何次幂为0,并且任何数值的0次幂为l。使用循环的方法编写该函数并在一个程序中测试它。

#include

double power(double , int );

int main(void) {

double x; int exp;

printf(\ scanf(\

printf(\ return 0; }

double power(double n, int p) { int i;

double pow=1; if (p>0)

for(i=1;i<=p;i++) pow *= n; else if(p<0)

for(i=-1;i>=p;i--) pow /= n; else if(n != 0) pow = 1;

else pow = 1 / n; //0的0次幂无意义,所以用1/0这个无意义数(1.#INF)代替 return pow; }

8.使用递归函数重做练习7。

#include

double power(double , int ); int main(void) {

double x;

int exp;

printf(\ scanf(\

printf(\ return 0; }

double power(double n, int p) { int i;

double pow=1; if (p>0)

for(i=1;i<=p;i++) pow *= n; else if(p<0)

pow = 1 / power(n,-p); else if(n != 0) pow = 1;

else pow = 1 / n; //0的0次幂无意义,所以用1/0这个无意义数(1.#INF)代替 return pow; }

9.为了使程序清单 9.八 中的函数to_binary()更一般化,可以在新的函数to_base_n()中使用第二个参数,且该参数的范围从2到10。然后,这个新函数输出第一个参数在第二个参数规定的进制数下的数值结果。例如,to_base_n (129,8)的输出是201,也就是129的八进制数值。最后在一个完整的程序中对该函数进行测试。

#include

void to_base_n(unsigned long , unsigned int);

int main(void) {

unsigned long number; unsigned int base;

printf(\

while (scanf(\ //原书有误:不应该是%ul,而是%lu {

printf(\ to_base_n(number,base); putchar('\\n');

printf(\ }

printf(\

return 0; }

void to_base_n(unsigned long n, unsigned int base) //* recursive function {

int r;

r = n % base; if (n >= base)

to_base_n(n / base, base); putchar('0' + r);

return; }

10.编写并测试一个函数Fibonacci(),在该函数中使用循环代替递归完成斐波纳契数列的计算。

#include long Fibonacci (int );

int main(void) {

int n;

printf(\ while (scanf(\ {

printf(\ printf(\ }

printf(\

return 0; }

long Fibonacci (int n) {

int n1,n2,temp,i; if(n >2)

for(n1=1,n2=1,i=3; i<=n; i++)

{

temp = n1 + n2; n1 = n2; n2 = temp; }

else n2=1; return n2; }

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

Top