《C Primer Plus(第五版)中文版》第8章第1至8题

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

#include <stdio.h>
#include <string.h>

int main(void){
	int i = 0;
	char ch;
	while((ch=getchar()) != EOF){
		i++;
	}
	printf("共计%d个字符\n",i);
	printf("end\n");
	return 0;
}

注:使用命令重定向方法,从文件获取内容,例如teste.exe < maks.txt 

2、编写一个程序,把输入作为字符流读取,直到遇到EOF,令该程序打印每个输入字符及期ASCII码值,注意在ASCII中空格前面的字符是非打印字符,要特殊处理这些字符,如果是非打印字符是换行符或是制表符,则分别打印\n或\t,否则使用控制字符符号,例如ASCII码1是ctrl+A,可以显示为^A,每行打印10对值。

#include <stdio.h>
#include <string.h>

int main(void){
	char ch;
	int i = 0;
	while((ch=getchar()) != EOF){
		if(i%10 == 0)
			printf("\n");
		switch(ch){
		case '\n':
			printf("\\n %d\t",ch);
			break;
		case '\t':
			printf("\\t %d\t",ch);
			break;
		case ' ':
			printf("sp %d\t",ch);
			break;
		default:
			if(ch < ' '){
				printf("^%c %d\t",ch+64,ch);
			}else{
				printf("%c %d\t",ch,ch);
			}

		}
		i++;
	}
	printf("end\n");
	return 0;
}

3、编写一个程序,统计输入流中的大小写字母的个数

#include <stdio.h>
#include <string.h>

int main(void){
	char ch;
	int a = 0;
	int b = 0;
	while((ch=getchar()) != EOF){
		if(ch <= 'Z' && ch >= 'A') a++;
		if(ch <= 'z' && ch >= 'a') b++;
	}
	printf("大写字母的个数:%d,小写字母的个数:%d\n",a,b);
	printf("end\n");
	return 0;
}

4、

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int isinword(char ch);  //判断这个字符是不是单词规则中的字符,是返回1,否则返回0
int main(void) {
	char ch;
	int sum = 0; //统计单词的数量
	int si = 0; //统计总的单词字符数量
	printf("请输入:\n");
	fflush(stdout);
	while((ch = getchar()) != EOF){
		if(isinword(ch)) sum++;
		if(isinword(ch) == 1){
			do{
				si++;
				ch = getchar();
			}while(isinword(ch));
		}
	}
	printf("共计%d个单词,%d个有效字符,平均每个单词%d个字母.\n",sum,si,si/sum);
	return EXIT_SUCCESS;
}
int isinword(char ch){
	if((ch >='a' && ch <='z') || (ch >='A' && ch <='Z')) return 1;
	return 0;
}

5

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
	char ch;
	int low,hight,mid;
	low = 1,hight=100,mid=50;
	printf("请随意默想一个1~100之间的数字,然后记到纸上,让程序开始猜测这个数字:\n");
	printf("正确输入y,太大输入 b,太小输入s,输入q退出\n");
	printf("是%d吗\n",mid);
	while((ch = getchar()) != 'q' && low < hight){
		if(ch == 'y'){
			printf("正确\n");
			break;
		}else if(ch == 's'){
			printf("太小了\n");
			low = mid + 1;

		}else if(ch == 'b'){
			printf("太大了\n");
			hight = mid - 1;
		}
		mid = (low + hight)/2;
		printf("是%d吗,太大请输入b,太小请输入s,正确请输入y\n",mid);
		while((ch = getchar()) != '\n'){
			continue;
		}
	}
	return EXIT_SUCCESS;
}

6

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char get_first(void);
int main(void) {
	char ch;
	ch = get_first();
	printf("%c\n",ch);
	return EXIT_SUCCESS;
}

char get_first(){
<span style="white-space:pre">	</span>int ch;
<span style="white-space:pre">	</span>while(isspace(ch = getchar()))
<span style="white-space:pre">		</span>continue;
<span style="white-space:pre">	</span>while(getchar() != '\n')
<span style="white-space:pre">		</span>continue;
<span style="white-space:pre">	</span>return ch;
}


7、

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

#include <stdio.h>
#include <string.h>

#define SHUI15 0.15
#define SHUI20 0.20
#define SHUI25 0.25

void fpd(void);
int main(void){
	float wtime;
	float g; //工资总额
	float shui; //税金
	float jg; //净工资
	char ch;
	float gz;
	fpd();
	while((ch = getchar())!= 'q'){
		switch(ch){
			case 'a':
				gz = 8.75;
				break;
			case 'b':
				gz = 9.33;
				break;
			case 'c':
				gz = 10.00;
				break;
			case 'd':
				gz = 11.20;
				break;
		}
		if(ch != 'q'){
			printf("请输入工作的时间数:\n");
						fflush(stdout);
						scanf("%f",&wtime);
						if(wtime <= 40){
							g = wtime * gz;
							shui = g * SHUI15;
						}else{
							g = 40.0 * gz + (wtime - 40) * gz * 1.5;
							if((g - 300.0) < 150.0){
								shui = 300.0 * SHUI15 + (g - 300.0) * SHUI20;
							}else{
								shui = 300.0 * SHUI15 +150.0 * SHUI20 + (g - 450.0) * SHUI25;
							}
						}
						jg = g - shui;
						printf("工资总额:%.2f,税金:%.2f,净工资:%.2f\n",g,shui,jg);
						fpd();
		}else if(ch == 'q'){
			break;
		}else{
			printf("输入有误,请得重新输入:\n");
			fpd();
		}
		while(getchar() != '\n')
			continue;
	}
	printf("\nend\n");
	return 0;
}
void fpd(void){
	printf("***************************************************\n");
	printf("a) $8.75/小时                      b) $9.33/小时\n");
	printf("c) $10.00/小时                    d) $11.20/小时\n");
	printf("q) quit\n");
	printf("***************************************************\n");
	printf("请选择一个工资等级:");
	fflush(stdout);
}

8

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

 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
char get_choice(void);
char get_first(void);
float get_num(void);
void add(void);
void sub(void);
void divide(void);
void mul(void);
int main(void){
	char ch;
	while((ch = get_choice()) != 'q'){
		switch(ch){
			case 'a':
				printf("加法计算\n");
				add();
				break;
			case 'b':
				printf("减法计算\n");
				sub();
				break;
			case 'c':
				printf("乘法计算\n");
				mul();
				break;
			case 'd':
				printf("除法计算\n");
				divide();
				break;
			default:
				printf("输入有误:\n");
		}
	}
	return 0;
}
float get_num(void){
	float input;
	char ch;
	while(scanf("%f",&input) != 1){
		while((ch = getchar()) != '\n')
			putchar(ch);
		printf("请输入一个合理数字,例如25,11.2,3等:\n");
	}
	return input;
}
char get_choice(){
	int ch;
	printf("请选择您要计算的方法:\n");
	printf("a.加法    b.减法    c.乘法    d.除法   q.退出\n");
	ch = get_first();
	while((ch < 'a' || ch > 'd') && ch != 'q'){
		printf("请重新选择(a,b,c,d或或者q):\n");
		ch = get_first();
	}
	return ch;
}

char get_first(){
	int ch;
	while(isspace(ch = getchar()))
		continue;
	while(getchar() != '\n')
		continue;
	return ch;
}

void add(){
	float a,b;
	printf("请输入第一个数:");
	a = get_num();
	printf("请输入第二个数:");
	b = get_num();
	printf("%.2f + %.2f = %.2f\n",a,b,a+b);
}
void sub(void){
	float a,b;
	printf("请输入第一个数:");
	a = get_num();
	printf("请输入第二个数:");
	b = get_num();
	printf("%.2f - %.2f = %.2f\n",a,b,a-b);
}
void divide(){
	float a,b;
	printf("请输入第一个数:");
	a = get_num();
	printf("请输入第二个数:");
	b = get_num();
	while(b == 0.0){
		printf("除数不能为零,请重新输入:");
		b = get_num();
	}
	printf("%.2f / %.2f = %.2f\n",a,b,a/b);
}
void mul(void){
	float a,b;
	printf("请输入第一个数:");
	a = get_num();
	printf("请输入第二个数:");
	b = get_num();
	printf("%.2f * %.2f = %.2f\n",a,b,a*b);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值