C Primer Plus (第五版) 第八章 编程练习

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

编程练习:

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

  1. 设计一个程序,统计输入到文件结尾的字符数。
#include <stdio.h>

int main(void)
{
	int count = 0;

	while (getchar() != EOF)
		count++;
	printf("输入的字符总数:%d\n", count);

	return 0;
}

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

# include <stdio.h>
# define ENTER ‘\n‘
# define TAB ‘\t‘
# define BLANK ‘ ‘

int main(void)
{
	int input[100];
	int conut = 1;
	int i = 0;

	while ((input[i++] = getchar()) != EOF)
		;
	for (i = 0; input[i] != EOF; i++)
	{
		if (input[i] == ENTER)
			printf("\\n|%-4d", input[i]);
		else if (input[i] == TAB)
			printf("\\t|%-4d", input[i]);
		else if (input >= 0 && input < BLANK)
			printf("%c|%-4d", input[i] + 64, input[i]);
		else
			printf("%c|%-4d", input[i], input[i]);
		if (conut++ % 10 == 0)
			putchar(ENTER);
	}
	putchar(ENTER);

	return 0;
}

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

#include <stdio.h>
#include <ctype.h>

int main(void)
{
	char ch;
	int count_x = 0;
	int count_d = 0;

	while ((ch = getchar(0)) != EOF)
	{
		if (islower(ch))
			count_x++;
		else if (isupper(ch))
			count_d++;
	}
	printf("大写字母个数:%d\n小写字母个数:%d\n", count_d, count_x);

	return 0;
}

4.编写一个程序,把输入作为字符流读取,直至遇到EOF。令其报告每个单词的平均字母数。不要将空白字符记为单词中的字母。实际上,标点符号也不应该计算,但现在不必考虑这一点

(如果您想做得好一些,可以考虑使用ctype.h系列中的ispunct()函数)。

#include <stdio.h>
#include <ctype.h>

int main(void)
{
	char ch;
	int count_word = 0;
	int count_letter = 0;
	int i = 0;

	while ((ch = getchar()) != EOF)
	{
		if (isalpha(ch))
		{
			i = 1;
			count_letter++;
		}

		else if (1 == i)
		{
			count_word++;
			i = 0;
		}
	}
	printf("单词个数:%d\n", count_word);
	printf("字母个数:%d\n", count_letter);
	printf("每个单词的平均字母数:%.2f\n", 
		(float)count_letter/(float)count_word);

	return 0;
}

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

#include <stdio.h>
#include <ctype.h>

int main(void)
{
	int big = 100;
	int small = 1;
	int guess = 50;
	char ch;

	printf("猜数程序(1-100),计算机将给出一数字,请做出相应的提示。\n");
	printf("例如:数字太大请输入b、数字太小请输入s、猜对了请输入y。\n");

	printf("电脑:%d\n", guess);
	while ((ch = getchar()) != ‘y‘)
	{
		while (getchar() != ‘\n‘)
			;
		switch (ch)
		{
		case ‘b‘: 
			printf("人:数字太大了\n");
			big = guess;
			guess = (small + guess)  / 2;
			break;
		case ‘s‘: 
			printf("人:数字太小了\n");
			small = guess;
			guess = (big + guess) / 2;
			break;
		default:
			printf("电脑:我只是个计算机啊,说好的提示呢?\n");
			continue;
		}
		printf("电脑:%d\n", guess);
	}
	if (‘y‘ == ch)
		printf("人:你竟然猜对了!!\n");
		printf("电脑:哈哈哈……我可是无所不知的计算机啊。\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>

#define LIMIT1 300
#define TAX1 0.15
#define LIMIT2 150
#define TAX2 0.2
#define LIMIT3 450
#define TAX3 0.25
#define TIME 40
#define ADD 1.5
#define BASE1 8.75
#define BASE2 9.33
#define BASE3 10.00
#define BASE4 11.20

void menu(void);
void fun(float base);
char getfirst(void);

int main(void)
{

	char ch;

	menu();

	while ((ch = getfirst()) != ‘q‘)
	{
		switch (ch)
		{
		case ‘a‘: fun(BASE1);
			break;
		case ‘b‘: fun(BASE2);
			break;
		case ‘c‘: fun(BASE3);
			break;
		case ‘d‘: fun(BASE4);
			break;
		default: printf("请输入正确的选项同(a b c d or q):");
		}
		putchar(‘\n‘);
		menu();
	}

	return 0;
}

void menu(void)
{
	printf("Enter the number corresponding to");
	printf(" the desired pay rate or action :\n");
	printf("a) $8.75 / hr         b) $9.33 / hr \n");
	printf("c) $lO.OO / hr        d) $11.20 / hr\n");
	printf("q) quit\n");
}

void fun(float base)
{
	float time;
	float total, tax, salary;

	printf("请输入一周工作的时间(小时):");
	scanf("%f", &time);
	if (time > TIME)
		time = (time - TIME) * ADD + TIME;

	total = time * base;

	if (total <= LIMIT1)
		tax = total * TAX1;
	else if (total <= LIMIT3)
		tax = LIMIT1 * TAX1 + (total - LIMIT1) * TAX2;
	else
		tax = LIMIT1 * TAX1 + LIMIT2 * TAX2 + (total - LIMIT3) * TAX3;

	salary = total - tax;

	printf("本周总工资:%.2f;税金:%.2f;实际工资:%.2f\n",
		total, tax, salary);
}

char getfirst(void)
{
	char ch;
	ch = getchar();
	while (isspace(ch))
		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. quit

a

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

d

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>
void menu(void);
char input_ch(void);
float input_num(void);

int main(void)
{
	char ch;
	float sum1, sum2;

	menu();
	while ((ch = input_ch()) != ‘q‘)
	{
		printf("Enter first number:");
		sum1 = input_num();
		printf("Enter second number:");
		sum2 = input_num();
		switch (ch)
		{
		case ‘a‘: printf("%.1f + %.1f = %.1f\n", sum1, sum2, sum1 + sum2);
			break;
		case ‘s‘: printf("%.1f - %.1f = %.1f\n", sum1, sum2, sum1 - sum2);
			break;
		case ‘m‘: printf("%.1f * %.1f = %.1f\n", sum1, sum2, sum1 * sum2);
			break;
		case ‘d‘:;
			while (sum2 == 0.00)
			{
				printf("Enter a number other than 0:");
				sum2 = input_num();
			}
			printf("%.1f / %.1f = %.1f\n", sum1, sum2, sum1 / sum2);
			break;
		default: printf("Error! please response with a,s,m,d or q: ");
			;

		}
		menu();
	}
	printf("Bye.\n");

	return 0;
}

void menu(void)
{
	printf("Enter the operation of your choice:\n");
	printf("a.add		s.subtract\n");
	printf("m.multiply	d.divide\n");
	printf("q.quit\n");
}

char input_ch(void)
{
	char ch;
	while (ch = getchar())
	{
		while (isspace(ch))
			ch = getchar();
		while (getchar() != ‘\n‘)
			;
		if (ch != ‘a‘ && ch != ‘s‘ && ch != ‘m‘ && ch != ‘d‘ && ch != ‘q‘)
			printf("Error! please response with a,s,m,d or q: ");
		else
			return ch;
	}
}

float input_num(void)
{
	float number;
	char ch;
	while (scanf("%f", &number) != 1)
	{
		while ((ch = getchar()) != ‘\n‘)
			putchar(ch);
		printf(" is not an number.\n");
		printf("Please enter a number, such as 2.5. - 1.78E8, or 3.:");
	}

	return number;
}
时间: 2024-10-06 07:20:23

C Primer Plus (第五版) 第八章 编程练习的相关文章

C++ Primer【第五版】习题参考答案——第六章(函数)

本系列文章会不断更新,但是时间不能保证.另外基本上都是自己做的答案,仅供参考,如果有疑问欢迎交流. #include <iostream> #include <initializer_list> using namespace std; int test_Ex_6_27(std::initializer_list<int> li); int main() { cout << test_Ex_6_27({23,78,89,76,90}) << en

c++ primer(第五版)学习笔记及习题答案代码版(第十四章)重载运算与类型转换

笔记较为零散,都是自己不熟悉的知识点. 习题答案至于一个.h 和.cc 中,需要演示某一题直接修改 #define NUM****, 如运行14.30题为#define NUM1430: Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful f

C++ Primer【第五版】习题参考答案——第五章(语句)

#include <iostream> #include <vector> #include <string> using namespace std; /******************************************************************* Ex_5_1: 空语句就是只含有一个分号的语句. 如果在程序的某个地方,语法上要求有一条语句,但是逻辑上不需要, 这时就需要一条空语句. Ex_5_2: 块就是由花括号包围的复合语句

c++ primer(第五版)学习笔记及习题答案代码版(第十一章)关联容器

笔记较为零散,都是自己不熟悉的知识点. 习题答案至于一个.cc 中,包含Chapter7.h头文件,读入文件包括./test ./rules .需要演示某一题直接修改 #define NUM****, 如运行11.23题为#define NUM1123: chapter 11 1.  关联容器不支持顺序容器的位置相关的操作,例如push_front或push_back.原因是关联容器中元素是根据关键字存储的,这些操作对 关联容器没有意义.而且关联容器也不支持构造函数或插入操作这些接收一个元素值和

c++ primer(第五版)学习笔记及习题答案代码版(第六章)函数

笔记较为零散,都是自己不熟悉的知识点. 习题答案至于一个.cc 中,编译需要包含Chapter6.h头文件. 需要演示某一题直接修改 #define NUM***, 如运行6.23题为#define NUM623: chapter 6 1. 形参初始化的机理与变量初始化一样. 当形参是引用类型时,它对应的实参被引用传递或者函数被传引用调用. 2. const和实参 void fcn(const int i){ /*fcn能够读取i,但是不能向i写值*/} void fcn(int i){ /*.

C++ Primer(第五版) 笔记 C01-02

C01 ++val; 优于 val++; 对数量不定的输入数据:while(cin>>value)... 遇到无效的输入或eof后,cin变为无效状态,条件变为假. 来自标准库的头文件用<>包围,不属于标准库的用""包围. 文件重定向工作:exename.exe <infile >outfile 点运算符:左侧运算对象是类类型的,右侧是该类型的成员. 参数 = 实参 = 值,形参指出调用函数可使用什么实参. 定义在函数内部的内置类型通常不初始化. C

《C++Primer》第五版习题详细答案--目录

作者:cosefy ps: 答案是个人学习过程的记录,仅作参考. <C++Primer>第五版习题答案目录 第一章:引用 第二章:变量和基本类型 第三章:字符串,向量和数组 第四章:表达式 原文地址:https://www.cnblogs.com/cosefy/p/12180771.html

C primer plus 第五版十二章习题

看完C prime plus(第五版)第十二章,随带完成了后面的习题. 1.不使用全局变量,重写程序清单12.4的程序. 先贴出12.4的程序,方便对照: 1 /* global.c --- 使用外部变量 */ 2 #include <stdio.h> 3 int units = 0; //一个外部变量 4 void critic(void); 5 int main(void) 6 { 7 extern int units; 8 9 printf ("How many pounds

c++ primer 第五版第八章答案

8.1 8.2 /* * c++ primer exercise. * test file. */ #include <iostream> using namespace std; istream & read_write(istream &in) { // char cval; int ival; while(in>>ival) cout<<ival<<' '; in.clear(); return in; } int main(int a

C++ Primer(第五版) 第八章:IO库

练习8.1:考察如何管理流的状态 1 istream& func(istream& is) 2 { 3 string buf; 4 while ( is>>buf ) cout<<buf<<endl; 5 is.clear(); 6 return is; 7 } 练习8.1 练习8.2:考察同上 1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 i