C Primer Plus 第6版 第8章 编程练习

简介: C Primer Plus 第6版 第8章 编程练习

-- 这章的练习要使用重定向,如果不能使用,可以用特殊字符代替EOF

1.统计读到文件结尾之前读取的字符数。

#include<stdio.h>
int main(void)
{
  char ch;
  int char_num = 0;
  while ((ch = getchar()) != EOF)
    char_num++;
  printf("char_num = %d", char_num);
 
  return 0;
}

2.略

3.读到EOF,报告大写字母和小写字母的字数。

#include<stdio.h>
int main(void)
{
  char ch;
  int Big = 0;
  int Small = 0;
  while ((ch = getchar()) != EOF)
  {
    if ('a' <= ch && ch <= 'z')
      Small++;
    else if ('A' <= ch && ch <= 'Z')
      Big++;
  }
  printf("小写有 %d个, 大写有 %d 个",Small,Big);
 
  return 0;
}

4.报告读取单词的平均字母数。(简化版)

#include<stdio.h>
#include<ctype.h>
int main(void)
{
  char ch;
  int num_words = 0; //单词数量
  int num_a = 0;   //字母数量
  while ((ch = getchar()) != EOF)
  {
    if (ch == ' ')
      num_words++; // 每个单词后面有1个空格
    else if(isalpha(ch) )
      num_a++;
  }
  num_words++; // 最后一个单词后面没有空格,所以在这里+1
  printf("一共%d个单词,%d个字母,平均每个单词有%f个字母", num_words, num_a, 1.0*num_a / num_words);
  getchar(); getchar();
  return 0;
}

5.二分查找猜数. 比如猜数0~100,先猜50,如果用户说大了, 就猜 0~50的中间值 25.

这道题刚开始犯了个错误,就是字符串直接用 == 比较了,然后一直出错。后来想起来要用strcmp比较字符串。

#define _CRT_SECURE_NO_WARNINGS
 
 
#include<stdio.h>
#include<string.h>
int main(void)
{
  int max;
  int min;
  bool bingo = false;
  char condtion[20];
  int answer;
  printf("输入数字的范围:\n最小值:");
  scanf_s("%d", &min);
  printf("最大值:");
  scanf_s("%d", &max);
 
  printf("想好一个数字,不要说出来,我要开始猜了\n");
  while (!bingo)
  {
    printf("我猜是%d\n", (max + min)/2);
    printf("大了?小了?对了?(请输入这3个之一)");
    scanf("%s", condtion);
    if (strcmp(condtion, "大了") == 0)
      max = (max + min) / 2;
    else if (strcmp(condtion, "小了") == 0)
      min = (max + min) / 2;
    else if (strcmp(condtion, "对了") == 0)
    {
      bingo = true;
      answer = (max + min) / 2;
    }
  }
  printf("答案是%d,再见",answer);
  getchar(); getchar();
  return 0;
}

6,7 略

8.编写简单计算器,提供+-*/的菜单。

一开始写的版本每次选择都会打印两次, 查了资料知道是缓冲区的问题,

选择时,输入a回车,然后a读入,回车还在,但是这个回车最后不影响。

进入 加法,输入第一个数字没问题,输入第二个数字时又多了一个回车。

这时候缓冲区就有一个换行符,然后就直接把'\n'读给choice了,

一个简单的办法就是把输入后面多出来的回车用getchar()读掉。

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
  char choice ;
  char ch;
  double first;
  double second;
  do
  {
    printf("请选择:\n \
a. 加 add\ts.减 subtract \n \
m. 乘 multiply\td. 除 divide  \n \
q. quit\n");
    scanf_s("%c",&choice);
    //getchar();
    switch (choice)
    {
    case 'a':
    {
      printf("输入第一个数字");
      scanf_s("%lf", &first);
      printf("输入第二个数字");
      scanf_s("%lf", &second);
      printf("%g + %g = %g\n", first, second, first + second);
      getchar();
    }
    break;
 
    case 's':
    {
      printf("输入第一个数字");
      scanf_s("%lf", &first);
      printf("输入第二个数字");
      scanf_s("%lf", &second);
      printf("%g - %g = %g\n", first, second, first - second);
      getchar();
    }
    break;
  
    case 'm':
    {
      printf("输入第一个数字");
      scanf_s("%lf", &first);
      printf("输入第二个数字");
      scanf_s("%lf", &second);
      printf("%g * %g = %g\n", first, second, first * second);
      getchar();
    }
    break;
    case 'd':
    {
      printf("输入第一个数字");
      scanf_s("%lf", &first);
      printf("输入第二个数字");
      scanf_s("%lf", &second);
      printf("%g / %g = %g\n", first, second, first / second);
      getchar();
    }
    break;
    case 'q':
      printf("Bye");
      break;
    default:
      printf("%c是无效输入\n",choice);
      break;
    }
  } while (choice != 'q');
 
 
  return 0;
}
相关文章
|
5月前
C Primer Plus 第6版 第3章 编程练习
C Primer Plus 第6版 第3章 编程练习
|
5月前
C Primer Plus 第6版 第9章 编程练习
C Primer Plus 第6版 第9章 编程练习
|
5月前
C Primer Plus 第6版 第7章 编程练习
C Primer Plus 第6版 第7章 编程练习
|
5月前
|
存储
C Primer Plus 第6版 第6章 编程练习
C Primer Plus 第6版 第6章 编程练习
|
5月前
C Primer Plus 第6版 第2章 编程练习
C Primer Plus 第6版 第2章 编程练习
|
5月前
|
编译器
C Primer Plus 第6版 第10章 编程练习
C Primer Plus 第6版 第10章 编程练习
|
5月前
C Primer Plus 第6版 第5章 编程练习
C Primer Plus 第6版 第5章 编程练习
|
5月前
C Primer Plus 第6版 第4章 编程练习
C Primer Plus 第6版 第4章 编程练习
|
5月前
|
C语言
C primer plus 学习笔记 第3章 数据和C
C primer plus 学习笔记 第3章 数据和C
C++ Primer Plus 第二章编程练习
C++ Primer Plus 第二章编程练习
下一篇
无影云桌面