C语言编程练习6-9章
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第6章C控制语句:循环
编程练习
1.编写一个程序,创建一个具有26个元素的数组,并在其中存储26个小写字母。
并让该程序显示该数组的内容。
#include<stdio.h>
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("%c",ABC[i]);
printf("\n");
return(0);
}
2.使用嵌套循环产生下列图案:
S
$$
$$$
$$$$
$$$$$
#include<stdio.h>
int main(void)
{
int i,j;
for(i=0;i<5;i++)
{
for(j=0;j<=i;j++)
printf("$");
printf("\n");
}
return(0);
}
3.使用嵌套循环产生下列图案:
F
FE
FED
FEDC
FEDCB
FEDCBA
请注意:如果您的系统不使用ASCⅡ或其他以数字顺序编码的码,您可以把一个字符数组初始化为字母表中的字母:
char lets[26]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
然后就可以使用数组索引来选用单个的字母,例如lets[0]是'A',等等。
#include<stdio.h>
int main(void)
{
int i,j;
for(i=0;i<6;i++)
{
for(j=0;j<=i;j++)
printf("%c",'F'-j);
printf("\n");
}
return(0);
}
4.让程序要求用户输入一个大写字母,使用嵌套循环产生像下面这样的金字塔图案:A
ABA
ABCBA
ABCDCDA
ABCDEDCBA
这种图案要扩展到用户输入的字符。
例如,前面的图案是在输入E时需要产生的。
提示:使用一个外部循环来处理行,在每一行中使用三个内部循环,一个处理空格,一个以升序打印字母,一个以降序打印字母。
如果您的系统不使用ASCII或类似的以严格数字顺序表示字母的编码,请参见在编程练习3中给出的建议。
#include<stdio.h>
int main(void)
{
int i,j,k;
char letter;
printf("Please input a capital:");
scanf("%c",&letter);
k=letter-'A'+1;
for(i=0;i<k;i++)
{
for(j=0;j<k-i;j++) printf(" ");
for(j=0;j<=i;j++) printf("%c",'A'+j);
for(j=i-1;j>=0;j--) printf("%c",'A'+j);
printf("\n");
}
return(0);
}
5.编写一个程序打印一个表,表的每一行都给出一个整数、它的平方以及它的立方。
要求用户输入表的上限与下限。
使用一个for循环。
#include<stdio.h>
int main(void)
{
int i,min,max;
printf("Please input the min and max:");
scanf("%d %d",&min,&max);
printf("%10s%10s%10s\n","num","square","cube");
for(i=min;i<=max;i++)
{
printf("%10d%10d%10d\n",i,i*i,i*i*i);
}
return(0);
}
6.编写一个程序把一个单词读入一个字符数组,然后反向打印出这个词。
提示:使用strlen()(第4章)计算数组中最后一个字符的索引。
#include<stdio.h>
#include<string.h>
int main(void)
{
char word[20];
int i;
printf("Please input a word:");
scanf("%s",&word);
for(i=strlen(word)-1;i>=0;i--)
printf("%c",word[i]);
printf("\n");
return(0);
}
7.编写一个程序,要求输入两个浮点数,然后打印出用二者的差值除以二者的乘积所得的结果。
在用户键入非数字的输入之前程序循环处理每对输入值。
#include<stdio.h>
int main(void)
{
float a,b;
printf("Please input two floats:");
while(scanf("%f%f",&a,&b) ==2 )
{
printf("(%.2f-%.2f) / (%.2f*%.2f) = %.2f\n",a,b,a,b,(a-b) / (a*b));
printf("Please input two floats:");
}
printf("end\n");
return(0);
}
8.对练习7进行修改,让它使用一个函数来返回计算值。
#include<stdio.h>
float calculate(float,float);
int main(void)
{
float a,b;
printf("Please input two floats:");
while(scanf("%f%f",&a,&b) ==2 )
{
printf( "(%.2f-%.2f) / (%.2f*%.2f) = %.2f\n",a,b,a,b,calculate(a,b) );
printf("Please input two floats:");
}
printf("end\n");
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<stdio.h>
int main(void)
{
int lower,upper,sum,i;
printf("Enter lower and upper integer limits:");
scanf("%d%d",&lower,&upper);
while(lower<upper )
{
for(i=lower,sum=0;i<=upper;i++) sum+=i*i;
printf("The sums of the squates from %d to %d is %d\n",lower*lower,upper*upper,sum);
printf("Enter next set of limits:");
scanf("%d%d",&lower,&upper);
}
printf("Done\n");
return(0);
}
10.编写一个程序把8个整数读入一个数组中,然后以相反的顺序打印它们。
#include<stdio.h>
int main(void)
{
int num[8],i;
printf("Enter 8 numbers:");
for(i=0;i<8;i++)
scanf("%d",&num[i]);
for(i=7;i>=0;i--)
printf("%d\t",num[i]);
printf("\n");
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<stdio.h>
int main(void)
{
double i,sum1,sum2;
int sign,count;
printf("Enter the count:");
scanf("%d",&count);
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("1.0 + 1.0/2.0 + 1.0/3.0 + 1.0/4.0 ...(%d terms) = %lf\n",count,sum1);
printf("1.0 - 1.0/2.0 + 1.0/3.0 - 1.0/4.0 ...(%d terms) = %lf\n",count,sum2);
return(0);
}
12.编写一个程序,创建一个8个元素的int数组,并且把元素分别设置为2的前8次幂,然后打印出它们的值。
使用for循环来设置值;为了变化,使用do while循环来显示这些值。
#include<stdio.h>
#include<math.h>
int main(void)
{
int num[8],i;
for(i=0;i<8;i++)
num[i] = pow(2,i); //pow乘幂函数用到math头文件
i = 0;
do
printf("%d\t",num[i]);
while(++i<8);
printf("\n");
return(0);
}
13.编写一个程序,创建两个8元素的double数组,使用一个循环来让用户键入第一个数组的8个元素的值。
程序把第二个数组的元素设置为第一个数组元素的累积和。
例如,第二个数组的第4个元素应该等于第一个数组的前4个元素的和,第二个数组的第5个元素应该等于第一个数组的前5个元素的和(使用嵌套循环可以做到这一点。
不过利用第二个数组的第5个元素等于第二个数组的第4个元素加上第一个数组的第5个元素这一事实,可以避免嵌套而只使用单个循环来完成这个任务)。
最后,使用一个循环来显示两个数组中的内容,第一个数组在一行中显示,而第二个数组中的每个元素在第一个数组的对应元素之下进行显示。
#include<stdio.h>
int main(void)
{
double num[8],sum[8];
int i,j;
printf("Enter 8 numbers:");
for(i=0;i<8;i++)
{
scanf("%lf",&num[i]);
for(j=0,sum[i]=0;j<=i;j++)
sum[i] += num[j];
}
for(i=0;i<8;i++)
printf("%8.3lf",num[i]);
printf("\n");
for(i=0;i<8;i++)
printf("%8.3lf",sum[i]);
printf("\n");
return(0);
}
14.编写一个程序读入一行输入,然后反向打印该行。
您可以把输入存储在一个char数组中;假定该行不超过255个字符。
回忆一下,您可以使用具有%c说明符的scanf()从输入中一次读入一个字符,而且当您按下回车键时会产生换行字符(\n)。
#include<stdio.h>
#define LENGTH 20
int main(void)
{
char a[255];
int i;
for(i=0;i<LENGTH;i++)
scanf("%c",&a[i]);
for(i=LENGTH-1;i>=0;i--)
printf("%c",a[i]);
printf("\n");
return(0);
}
15. Daphne以10%的单利息投资了100美元(也就是说,每年投资赢得的利息等于原始投资的10%)。
Deirdre则以每年5%的复合利息投资了10O美元(也就是说,利息是当前结余的5%,其中包括以前的利息)。
编写一个程序,计算需要多少年Deirdre的投资额才会超过Daphne,并且显示出到那时两个人的投资额。
#include<stdio.h>
int main(void)
{
double Daphne=100,Deirdre=100;
int i=0;
while(Daphne>=Deirdre)
{
Daphne += 100 * 0.1;
Deirdre += Deirdre * 0.05;
i++;
}
printf("After %d years,Deirdre's investment is %lf,Daphne's investment is %lf\n",i,Deirdre,Daphne);
return(0);
}
16. Chuckie Lucky赢了100万美元,他把它存入一个每年赢得8%的帐户。
在每年的最后一天,Chuckie取出10万美元。
编写一个程序,计算需要多少年Chuckie就会清空他的帐户。
#include<stdio.h>
int main(void)
{
double investment = 100;
int i=0;
while(investment > 0)
{
investment += investment * 0.08;
investment -= 10;
i++;
}
printf("After %d years,Chuckie Lucky's investment is out\n",i);
return(0);
}
第七章C控制语句:分支和跳转
编程练习
1.编写一个程序。
该程序读取输入直到遇到#字符,然后报告读取的空格数目、读取的换行符数目以及读取的所有其他字符数目。
#include<stdio.h>
int main(void)
{
int space=0,newline=0,others=0;
char a;
printf("Please input a string end by #:");
while((a=getchar()) != '#')
if(a == ' ') space++;
else if (a == '\n') newline++;
else others++;
printf("space: %d,newline: %d,others: %d\n",space,newline,others);
return(0);
}
2.编写一个程序,该程序读取输入直到遇到#字符。
使程序打印每个输入的字符以及它的十进制ASCII码。
每行打印8个字符,编码对。
建议:利用字符计数和模运算符(%)在每8个循环周期时打印一个换行符。
#include<stdio.h>
int main(void)
{
char a;
int i;
printf("Please input a string end by #:");
for(i = 1; (a = getchar()) != '#'; i++)
{
printf("%c--%d\t",a,a);
if(i%8 == 0) printf("\n");
}
printf("\n");
return(0);
}
3.编写一个程序。
该程序读取整数,直到输入0。
输入终止后,程序应该报告输入的偶数(不包括0)总个数、偶数的平均值,输入的奇数总个数以及奇数的平均值。
#include<stdio.h>
int main(void)
{
int i_even = 0, sum_even = 0, i_odd = 0, sum_odd = 0, num;
printf("Please input numbers (0 to quit):");
while(1)
{
scanf("%d",&num);
if (num == 0) break;
if (num % 2 == 0) {i_even++; sum_even += num;}
else {i_odd++; sum_odd += num;}
}
printf("even number's count:%d\n",i_even);
printf("even number's average:%d\n",sum_even / i_even);
printf("odd number's count:%d\n",i_odd);
printf("odd number's average:%d\n",sum_odd / i_odd);
return(0);
}
4.利用if else语句编写程序读取输入,直到#。
用一个感叹号代替每个句号,将原有的每个感叹号用两个感叹号代替,最后报告进行了多少次替代。
#include<stdio.h>
int main(void)
{
int a=0,b=0;
char ch;
printf("Please input a string end by #:");
while((ch = getchar()) != '#')
{
if(ch == '.') {putchar('!'); a++;}
else if(ch == '!') {putchar('!');putchar('!'); b++;}
else putchar(ch);
}
printf("\nthe times of '.' replaced by '!': %d\n",a);
printf("the times of '!' replaced by '!!': %d\n",b);
return(0);
}
5.用switch重做练习3。
#include<stdio.h>
int main(void)
{
int i_even = 0, sum_even = 0, i_odd = 0, sum_odd = 0, num;
printf("Please input numbers (0 to quit):");
while(1)
{
scanf("%d",&num);
if (num == 0) break;
switch(num % 2)
{
case 0: i_even++;
sum_even += num;
break;
case 1: i_odd++;
sum_odd += num;
}
}
printf("even number's count:%d\n",i_even);
printf("even number's average:%d\n",sum_even / i_even);
printf("odd number's count:%d\n",i_odd);
printf("odd number's average:%d\n",sum_odd / i_odd);
return(0);
}
6.编写一个程序读取输入,直到#,并报告序列ei出现的次数。
此程序必须要记住前一个字符和当前的字符。
用诸如“Receive your eieio award.”的输入
测试它。
#include<stdio.h>
int main(void)
{
char former=0,present;
int count=0;
while((present=getchar()) != '#')
{
if((former == 'e') && (present == 'i')) count++;
former = present;
}
printf("ei has appeared %d times\n",count);
return(0);
}
7.编写程序,要求输入一周中的工作小时数,然后打印工资总额、税金以及净工资。
作如下假设:
a.基本工资等级=10.00美元//J,时
b.加班(超过40小时)=1.5倍的时间
c.税率前300美元为15%
下一个150美元为20%
余下的为25%
用#define定义常量,不必关心本例是否符合当前的税法。
#include<stdio.h>
//a.基本工资
#define BASIC 10.00 //基本工资等级=BASIC美元/小时
//b.加班
#define TIME 40 //加班(超过TIME小时)=
#define ADD 1.5 //ADD倍的时间
//c.税率
#define LIMIT1 300 //前LIMIT1美元为RA TE1
#define RATE1 0.15
#define LIMIT2 150 //下一个LIMIT2美元为RA TE2
#define RATE2 0.20
#define RATE3 0.25 //余下的位RA TE3
int main(void)
{
printf("input the work hours of a week:");
scanf("%lf",&hours);
if (hours > 40) hours = 40 + (hours - 40) * 1.5;
gross = hours * BASIC;
printf("gross income:\t\t%lf\n",gross);
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("tax:\t\t\t%lf\n",tax);
printf("net income:\t\t%lf\n",gross - tax);
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<stdio.h>
int get_int(void);
//b.加班
#define TIME 40 //加班(超过TIME小时)=
#define ADD 1.5 //ADD倍的时间
//c.税率
#define LIMIT1 300 //前LIMIT1美元为RA TE1
#define RATE1 0.15
#define LIMIT2 150 //下一个LIMIT2美元为RA TE2
#define RATE2 0.20
#define RATE3 0.25 //余下的位RA TE3
int main(void)
{
double basic,hours,gross,tax;
printf("Enter the number corresponding to the desired pay rate or action:\n");
printf("1) $8.75/hr\t\t\t2) $9.33/hr\n");
printf("3) $10.00/hr\t\t\t4) $11.20/hr\n");
printf("5) quit\n");
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("quit\n"); return(0); //退出程序
}
printf("you have select $%.2lf\n",basic);
printf("input the work hours of a week:");
scanf("%lf",&hours);
if (hours > 40) hours = 40 + (hours - 40) * 1.5;
gross = hours * basic;
printf("gross income:\t\t%lf\n",gross);
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("tax:\t\t\t%lf\n",tax);
printf("net income:\t\t%lf\n",gross - tax);
return(0);
}
int get_int(void) //得到一个合适的整数,滤除非法数
{
int num;
char str[40];
while(scanf("%d",&num)!=1)
{
gets(str);
printf("error! %s is not a number. input again.\n",str);
}
while ( getchar() != '\n');
return num;
}
9.编写一个程序,接受一个整数输入,然后显示所有小于或等于该数的素数。
#include<stdio.h>
int isprime(int);
{
int num,i;
printf("input a positive number:");
scanf("%d",&num);
printf("all the primes <= %d:\n",num);
for(i=2;i<=num;i++)
if( isprime(i) )
printf("%d\t",i);
printf("\n");
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<stdio.h>
#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("Select the type of marriage:\n");
printf("1)SINGLE\n2)HOST\n3)MARRIED_SHARE\n4)MARRIED_DIVORCE\n5)quit\n"); 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("quit\n"); return(0); //退出程序
default : printf("input error\n"); continue;
}
printf("you have select %c\n",ch);
printf("input the pay:");
scanf("%lf",&pay);
if (pay <= type) tax = pay * RATE1;
else tax = type * RATE1 + (pay - type) * RATE2;
printf("wax is %.2lf\n",tax);
}
}
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 <stdio.h>
#include <ctype.h> //需要调用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("Please select your vegetable: a,b,c,q\n");
printf("a.artichoke price:$%.2f\n",ARTICHOKE);
printf("b.beet price:$%.2f\n",BEET);
printf("c.carrot price:$%.2f\n",CARROT);
printf("q.end\n");
printf("(price as dollars per pound)\n");
while( ( ch = tolower( getchar() ) ) != 'q') //tolower:大写转小写{
switch(ch)
{
case 'a': printf("How many pounds of artichokes do you want?");
scanf("%lf",&artichoke);
printf("Please select your vegetable: a,b,c,q:");
continue;
case 'b': printf("How many pounds of beets do you want?");
scanf("%lf",&beet);
printf("Please select your vegetable: a,b,c,q:");
continue;
case 'c': printf("How many pounds of carrots do you want?");
scanf("%lf",&carrot);
printf("Please select your vegetable: a,b,c,q:");
continue;
default: break;
}
printf("%10s%10s%10s%10s\n"," ","artichoke","beet","carrot");
printf("%10s%10.2lf%10.2lf%10.2lf\n","price",ARTICHOKE,BEET,CARROT);
printf("%10s%10.2lf%10.2lf%10.2lf\n","pound",artichoke,beet,carrot);
printf("%10s%10.2lf%10.2lf%10.2lf\n","charge",ARTICHOKE * artichoke,BEET * beet,CARROT * carrot);
sum = ARTICHOKE * artichoke + BEET * beet + CARROT * carrot;
if (sum > DISCOUNT_LIMIT) discount = sum*DISCOUNT_RA TE;
else discount = 0;
printf("discount: %.2f\n",discount);
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("freight: %.2f\n",freight);
sum = sum - discount + freight;
printf("sum: %.2f\n",sum);
return 0;
}
第8章字符输入/输出和输入确认
编程练习
下面的一些程序要求输入以EOF终止。
如果您的操作系统难以使用或不能使用重定向,则使用一些其他的判断来终止输入,例如读取&字符。
1.设计一个程序,统计从输入到文件结尾为止的字符数。
#include <stdio.h>
int main(void)
{
for(i=0; getchar() != EOF; i++);
printf("There are %d char",i);
return 0;
}
2.编写一个程序,把输入作为字符流读取,直到遇到EOF。
令该程序打印每个输入字符及其ASCII编码的十进制值。
注意在ASCII序列中空格字符前面的字符是非打印字符,要特殊处理这些字符。
如果非打印字符是换行符或制表符,则分期打印\n或\t。
否则,使用控制字符符号。
例如,ASCII的l是Ctrl+A,可以显示为AA。
注意A的ASCⅡ值是Ctrl+A 的值加64。
对其他非打印字符也保持相似的关系。
除去每次遇到一个换行符时就开始一个新行之外,每行打印10对值。
#include <stdio.h>
int main(void)
{
char ch;
int i;
for(i=1; (ch=getchar()) != EOF; i++)
{
if (ch >= ' ' || ch == '\n' || ch == '\t') printf("%-5c",ch);
else printf("^%-4c",ch+64);
printf("%-5d",ch);
if(i%8 == 0) printf("\n");
}
return 0;
}
3.编写一个程序,把输入作为字符流读取,直至遇到EOF。
令其报告输入中的大写字母个数和小写字母个数。
假设小写字母的数值是连续的,大写字母也是如此。
或者你可以使用ctypc,h库中的合适的函数来区分大小写。
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char ch;
int lower=0,upper=0;
while ( (ch=getchar()) != EOF )
{
if ( islower(ch) ) lower++;
if ( isupper(ch) ) upper++;
}
printf("lower: %d, upper: %d\n",lower,upper);
return 0;
}
4.编写一个程序,把输入作为字符流读取,直至遇到EOF。
令其报告每个单词的平均字母数。
不要将空白字符记为单词中的字母。
实际上,标点符号也不应该计算,但现在不必考虑这一点(如果您想做得好一些,可以考虑使用ctype.h系列中的ispunct()函数)。
(网友:野性的呼吸……提供)
(如果你的编译器不支持bool,用宏定义处理bool,true,false)
#include<stdio.h>
#include<ctype.h>
#include<stdbool.h>
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("%d characters read.\n",words);
printf("%d words read.\n",n_words);
printf("The average number of letters per word is %f.\n",
(float)words/(float)n_words);
return 0;
}
5,修改程序清单8,4中的猜测程序,使其使用更智能的猜测策略。
例如,程序最初猜50,让其询问用户该猜测值是大、小还是正确。
如果该猜测值小,则令下一次猜测值为50和100的中值,也就是75。
如果75大,则下一次猜测值为75和50的中值,等等。
使用这种二分搜索(binary search)策略,起码如果用户没有欺骗,该程序很快会获得正确答案。
#include <stdio.h>
int main(void)
{
int guess, max = 100, min = 1;
char response;
printf("Pick an integer from 1 to 100.I will try to guess ");
printf("it.\nRespond with a b if my quess is big and with");
printf("\nan l if it is little.\n");
printf("Also,Respond a y if it is right.\n");
printf("Uh...is your number %d?\n", guess = ( max + min ) / 2 );
while((response = getchar()) != 'y')
{
if (response == 'b')
{
max = guess - 1;
printf("Well,then,is it %d?\n",guess = ( max + min ) / 2 );
}
else if (response == 'l')
{
min = guess + 1;
printf("Well,then,is it %d?\n",guess = ( max + min ) / 2 );
}
else printf("Sorry,I understand only y or n.\n");
while (getchar() != '\n');
}
printf("I know I could do it!\n");
return 0;
}
6.修改程序清单8.8中的get_first()函数,使其返回所遇到的第一个非空白字符。
在一个简单的程序中测试该函数。
#include <stdio.h>
#include <ctype.h>
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<stdio.h>
#include<ctype.h>
char get_first(void);
//b.加班
#define TIME 40 //加班(超过TIME小时)=
#define ADD 1.5 //ADD倍的时间
//c.税率
#define LIMIT1 300 //前LIMIT1美元为RA TE1
#define RATE1 0.15
#define LIMIT2 150 //下一个LIMIT2美元为RA TE2
#define RATE2 0.20
#define RATE3 0.25 //余下的位RA TE3
int main(void)
{
double basic,hours,gross,tax;
printf("Enter the number corresponding to the desired pay rate or action:\n");
printf("1) $8.75/hr\t\t\t2) $9.33/hr\n");
printf("3) $10.00/hr\t\t\t4) $11.20/hr\n");
printf("5) quit\n");
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("quit\n"); return(0); //退出程序
}
printf("you have select $%.2lf\n",basic);
printf("input the work hours of a week:");
scanf("%lf",&hours);
if (hours > 40) hours = 40 + (hours - 40) * 1.5;
gross = hours * basic;
printf("gross income:\t\t%lf\n",gross);
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("tax:\t\t\t%lf\n",tax);
printf("net income:\t\t%lf\n",gross - tax);
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<stdio.h>
#include<ctype.h>
float get_float(void);
char get_first(void);
int main(void)
{
char select;
float num1,num2;
while(1)
{
printf("Enter the operation of your choice:\n");
printf("a.add s.subtract:\n");
printf("m.multiply d.divide\n");
printf("q.quit\n");
select = get_first();
if( select != 'a' && select != 's' && select != 'm' && select != 'd')
{
printf("Bye.\n");
break;
}
printf("Enter first number:");
num1 = get_float();
printf("Enter second number:");
num2 = get_float();
while( select == 'd' && num2 == 0)
{
printf("Enter a number other than 0:");
num2 = get_float();
}
switch(select)
{
case 'a': printf("%.2f + %.2f = %.2f\n",num1, num2, num1 + num2); break;
case 's': printf("%.2f - %.2f = %.2f\n",num1, num2, num1 - num2); break;
case 'm': printf("%.2f * %.2f = %.2f\n",num1, num2, num1 * num2); break;
case 'd': printf("%.2f / %.2f = %.2f\n",num1, num2, num1 / num2); break;
default : break;
}
}
return(0);
}
float get_float(void) //得到一个合适的浮点数,滤除非法数
{
float num;
char str[40];
while(scanf("%f",&num)!=1)
{
gets(str);
printf("%s is not a number.\n",str);
printf("Please enter a numbe, such as 2.5, -1.78E8, or 3:");
}
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<stdio.h>
double min(double ,double );
int main(void)
{
double x,y;
printf("input two doubles:");
scanf("%lf%lf",&x,&y);
printf("the smaller is:%.2lf\n",min(x,y));
return(0);
}
double min(double a,double b)
{
return a<b?a:b;
}
2.设计函数chline(ch, i, j),实现指定字符在i列到j列的输出,并用一个简单的驱动程序测试该函数。
#include<stdio.h>
void chline(char , int , int );
int main(void)
{
int x,y;
char ch;
printf("input a char:");
scanf("%c",&ch);
printf("input two int:");
scanf("%d%d",&x,&y);
chline(ch,x,y);
return 0;
}
void chline(char ch, int i, int j)
{
int k;
for(k=1; k<i; k++)
printf(" ");
for( ; k<=j; k++)
printf("%c",ch);
printf("\n");
}
3.编写一个函数。
函数的3个参数是一个字符和两个整数。
字符参数是需要输出的字符。
第一个整数说明了在每行中该字符输出的个数,而第二个整数指的是需要输出的行数。
编写一个调用该函数的程序。
#include<stdio.h>
void chline(char , int , int );
int main(void)
{
int x,y;
char ch;
printf("input a char:");
scanf("%c",&ch);
printf("input column and row:");
scanf("%d%d",&x,&y);
chline(ch,x,y);
return 0;
}
void chline(char ch, int column, int row)
{
int x,y;
for(y=0; y<row; y++)
{
for(x=0; x<column; x++)
printf("%c",ch);
printf("\n");
}
}
4.两数值的谐均值可以这样计算:首先对两数值的倒数取平均值,最后再取倒数。
编写一个带有两个double参数的函数,计算这两个参数的谐均值。
#include<stdio.h>
double calculate(double ,double );
int main(void)
{
double a,b;
printf("input two doubles:");
scanf("%lf%lf",&a,&b);
printf("1/( (1/x+1/y) / 2 ) = %0.3lf\n",calculate(a,b) );
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<stdio.h>。