第八章 字符输入/输出和输入确认
编程练习:
下面的一些程序要求输入以EOF终止。如果您的操作系统难以使用或不能使用重定向,则使用一些其他的判断来终止输入,例如读取&字符。
设计一个程序,统计输入到文件结尾的字符数。
#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;
}
转载于:https://blog.51cto.com/xiongyi85/1655026