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);
}