目录
1.putchar(getchar())是一个有效表达式,它实现什么功能?getchar(putchar())是否也是有效表达式
3.假设有一个名为 count 的可执行程序,用于统计输入的字符数。设计一个使用 count 程序统计essay文件中字符数的命令行,并把统计结果保存在essayct文件中
6.对于给定的输出(ch是int类型,而且是缓冲输入),下面各程序段的输出分别是什么?
while ((ch = getchar()) != 'i')
while ((ch = getchar()) != '\n')
8.在使用缓冲输入的系统中,把数值和字符混合输入会遇到什么潜在的问题
2.编写一个程序,在遇到 EOF 之前,把输入作为字符流读取。程序要打印每个输入的字符及其相应的ASCII十进制值。
3.编写一个程序,在遇到 EOF 之前,把输入作为字符流读取。该程序要报告输入中的大写字母和小写字母的个数。假设大小写字母数值是连续的。或者使用ctype.h库中合适的分类函数更方便
6.修改程序清单8.8中的get_first()函数,让该函数返回读取的第1个非空白字符,并在一个简单的程序中测试
7.修改第7章的编程练习8,用字符代替数字标记菜单的选项。用q代替5作为结束输入的标记
Enter the operation of your choice:
Please enter a number, such as 2.5, -1.78E8, or 3: 1
复习题
1.putchar(getchar())是一个有效表达式,它实现什么功能?getchar(putchar())是否也是有效表达式
- 实现输出显示缓存区的下一个字符
- 不是
2.下面的语句分别完成什么任务?
a.putchar('H');
b.putchar('\007');
c.putchar('\n');
d.putchar('\b');
a. 打印字符 H
b. 如果系统使用ASDII,发出一声警报
c. 把光标移动到下一行
d. 把光标后退一格
3.假设有一个名为 count 的可执行程序,用于统计输入的字符数。设计一个使用 count 程序统计essay文件中字符数的命令行,并把统计结果保存在essayct文件中
count < essay > essayct or count > essayct < essay
4.给定复习题3中的程序和文件,下面哪一条是有效的命令?
a.essayct <essay
b.count essay
c.essay >count
都不是
5.EOF是什么
由getchar() or scanf() 返回的特殊的值,表明函数检测到文件的结尾
6.对于给定的输出(ch是int类型,而且是缓冲输入),下面各程序段的输出分别是什么?
a.输入如下:
If you quit, I will.[enter]
程序段如下:
while ((ch = getchar()) != 'i')
putchar(ch);
b.输入如下:
Harhar[enter]
程序段如下:
while ((ch = getchar()) != '\n')
{
putchar(ch++);
putchar(++ch);
}
a. If you qu
b.HJacrthjacrt
7.C如何处理不同计算机系统中的不同文件和换行约定
C的标准I/O库会把不同的文件映射成统一的流来处理
8.在使用缓冲输入的系统中,把数值和字符混合输入会遇到什么潜在的问题
数字会跳过空格和换行符,但是字符输入不会:
输入数字的时候,空格和换行符还会留在缓存区,输入字符的时候会读取。
【在输入数字之后要处理空格和换行符】
编程练习
1.设计一个程序,统计在读到文件结尾之前读取的字符数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
FILE* in;
in = fopen("123.txt", "r");
char ch;
long n = 0;
while((ch = getc(in)) != EOF)
{
n++;
}
fclose(in);
printf("%ld\n", n);
return 0;
}
2.编写一个程序,在遇到 EOF 之前,把输入作为字符流读取。程序要打印每个输入的字符及其相应的ASCII十进制值。
注意,在ASCII序列中,空格字符前面的字符都是非打印字符,要特殊处理这些字符。如果非打印字符是换行符或制表符,则分别打印\n或\t。否则,使用控制字符表示法。例如,ASCII的1是Ctrl+A,可显示为^A。注意,A的ASCII值是Ctrl+A的值加上64。其他非打印字符也有类似的关系。除每次遇到换行符打印新的一行之外,每行打印10对值。
(注意:不同的操作系统其控制字符可能不同。)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
FILE* in;
in = fopen("123.txt", "r");
char ch;
int n = 0;
while((ch = getc(in)) != EOF)
{
if(ch == '\n')
{
putchar('\\');
putchar('n');
printf("%d\n", ch);
n = 0;
}
else if(ch == '\t')
{
putchar('\\');
putchar('t');
printf("%d ", ch);
}
else if(ch < ' ')
{
putchar('^');
putchar(ch + 64);
printf("%d ", ch);
}
else
{
putchar(ch);
printf("%d ", ch);
}
if(++n % 10 == 0)
{
n = 0;
putchar('\n');
}
}
fclose(in);
return 0;
}
3.编写一个程序,在遇到 EOF 之前,把输入作为字符流读取。该程序要报告输入中的大写字母和小写字母的个数。假设大小写字母数值是连续的。或者使用ctype.h库中合适的分类函数更方便
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
FILE* in;
in = fopen("123.txt", "r");
char ch;
int dn = 0, un = 0;
while((ch = getc(in)) != EOF)
{
if(isupper(ch))
{
un++;
}
else if(islower(ch))
{
dn++;
}
}
printf("%d %d\n", un, dn);
fclose(in);
return 0;
}
4.编写一个程序,在遇到EOF之前,把输入作为字符流读取。该程序要报告平均每个单词的字母数。不要把空白统计为单词的字母。实际上,标点符号也不应该统计,但是现在暂时不同考虑这么多(如果你比较在意这点,考虑使用ctype.h系列中的ispunct()函数)
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
FILE* in;
in = fopen("123.txt", "r");
char ch;
int sum = 0, sn = 0, f = 0;
while((ch = getc(in)) != EOF)
{
if(isupper(ch) || islower(ch))
{
f = 1;
sum++;
}
else if(f)
{
sn++;
f = 0;
}
}
double average = double(sum) / double(sn);
printf("%.2lf\n", average);
fclose(in);
return 0;
}
5.修改程序清单8.4的猜数字程序,使用更智能的猜测策略。例如,程序最初猜50,询问用户是猜大了、猜小了还是猜对了。如果猜小了,那么下一次猜测的值应是50和100中值,也就是75。如果这次猜大了,那么下一次猜测的值应是50和75的中值,等等。使用二分查找(binary search)策略,如果用户没有欺骗程序,那么程序很快就会猜到正确的答案
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char response;
int u = 100, l = 1;
int guess = 50;
printf("Pick an integer from 1 to 100. I will try to guess ");
printf("it.\nRespond with a y if my guess is right and with");
printf("\nan n if it is wrong.\n");
printf("Uh...is your number %d?\n", guess);
while ((response = getchar()) != 'y') /* 获取响应 */
{
while (getchar() != '\n')
{
continue; /* 跳过剩余的输入行 */
}
if (response == 'u')
{
u = guess;
printf("Well, then, is it %d?\n", guess = (guess + l) / 2);
}
else if(response == 'l')
{
l = guess;
printf("Well, then, is it %d?\n", guess = (guess + u) / 2);
}
else
{
printf("Sorry, I understand only u, l or y.\n");
}
}
printf("I knew I could do it!\n");
return 0;
}
6.修改程序清单8.8中的get_first()函数,让该函数返回读取的第1个非空白字符,并在一个简单的程序中测试
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
char get_first(FILE* in)
{
char ch;
while ((ch = getc(in)) <= ' ')
continue;
return ch;
}
int main(void)
{
FILE* in;
char ch;
in = fopen("123.txt", "r");
ch = get_first(in);
printf("%c\n", ch);
fclose(in);
return 0;
}
7.修改第7章的编程练习8,用字符代替数字标记菜单的选项。用q代替5作为结束输入的标记
#include <stdio.h>
#include <stdlib.h>
#define MAXT 40.0
#define GH 10.0
#define FR 300.0
#define SR 450.0
#define FTR 0.15
#define STR 0.20
#define TTR 0.25
int main(void)
{
float t, sum, tax, gain;
scanf("%f", &t);
getchar();
if(t > MAXT)
{
t = MAXT + (t - MAXT) * 1.5;
}
float gh;
int f = 0, x = 1;
char num;
printf("***************************************************************** \n");
printf("Enter the number corresponding to the desired pay rate or action: \n");
printf("a) $8.75/hr b) $9.33/hr\nc) $10.00/hr d) $11.20/hr\nq) quit \n");
printf("***************************************************************** \n");
num = getchar();//要在上一个输入之后加上getchar()处理回车
getchar();
while(x)
{
switch(num)
{
case 'a':
gh = 8.75;
x = 0;
break;
case 'b':
gh = 9.33;
x = 0;
break;
case 'c':
gh = 10.00;
x = 0;
break;
case 'd':
gh = 11.20;
x = 0;
break;
case 'q':
return 0;
break;
default:
printf("input a, b, c, d or q:");
num = getchar();
getchar();
}
}
sum = gh * t;
if(sum <= FR)
{
tax = sum * FTR;
gain = sum - tax;
}
else if(sum > FR && sum < SR)
{
tax = FR * FTR + (sum - FR) * STR;
gain = sum - tax;
}
else if(sum > SR)
{
tax = FR * FTR + (SR - FR) * STR + (sum - SR) * TTR;
gain = sum - tax;
}
printf("%-10.2f%-10.2f%-10.2f%-10.2f\n", t, sum, gain, tax);
return 0;
}
8.编写一个程序,显示一个提供加法、减法、乘法、除法的菜单。获得用户选择的选项后,程序提示用户输入两个数字,然后执行用户刚才选择的操作。该程序只接受菜单提供的选项。程序使用float类型的变量储存用户输入的数字,如果用户输入失败,则允许再次输入。进行除法运算时,如果用户输入0作为第2个数(除数),程序应提示用户重新输入一个新值。
该程序的一个运行示例如下:
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 a number.
Please enter a number, such as 2.5, -1.78E8, or 3: 1
22.4 + 1 = 23.4
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int checkinput()
{
char mc;
float n;
while(scanf("%f", &n) != 1)
{
while((mc = getchar()) > ' ')
{
putchar(mc);
}
while((mc = getchar()) <= ' ')
continue;
printf(" is not a number\n");
printf("Please enter a number, such as 2.5, -1.78E8, or 3:");
}
return n;
}
int main(void)
{
char ch;
int x = 1;
printf("Enter the operation of your choice: \na. add s. subtract\nm. multiply d. divide \nq. quit\n");
while(x)
{
ch = getchar();
getchar();
if(ch != 'a' && ch != 's' && ch != 'm' && ch != 'd' && ch != 'q')
{
printf("input a ,s, m, d or q:");
continue;
}
else if(ch == 'q')
{
return 0;
}
else
{
x = 0;
}
}
float fn, sn;
printf("Enter first number:");
fn = checkinput();
printf("Enter second number:");
sn = checkinput();
if(ch == 'd')
{
while(sn == 0)
{
printf("The second number can't be 0,input it again:");
sn = checkinput();
}
}
switch(ch)
{
case 'a':
printf("%.2f + %.2f = %.2f", fn, sn, fn + sn);
break;
case 's':
printf("%.2f - %.2f = %.2f", fn, sn, fn - sn);
break;
case 'm':
printf("%.2f * %.2f = %.2f", fn, sn, fn * sn);
break;
case 'd':
printf("%.2f / %.2f = %.2f", fn, sn, fn / sn);
break;
default:
break;
}
return 0;
}