C Primer Plus 第6版 中文版(04)

第6章 C控制语句:循环

示例:

#include <stdio.h>

int main(void) {
    //求和
    long num;
    long sum = 0L;
    int get;

    printf("输入一个用于求和的整数,按入q退出: ");
    get = scanf("%ld", &num);

    while (get == 1) {
        sum += num;
        printf("输入下一个用于求和的整数,按入q退出: ");
        get = scanf("%ld", &num);
    }
    printf("输入的整数的和为:%ld", sum);

    return 0;
}

/*
输入一个用于求和的整数,按入q退出: 44
输入下一个用于求和的整数,按入q退出: 33
输入下一个用于求和的整数,按入q退出: 88
输入下一个用于求和的整数,按入q退出: 121
输入下一个用于求和的整数,按入q退出: q
输入的整数的和为:286
*/

_Bool

  • _Bool是C语言中布尔变量的类型名。 _Bool类型的变量只能储存1(真)或0(假)。如果把其他非零数值赋给_Bool类型的变量,该变量会被设置为1

  • C99提供了 stdboo1.h头文件,该头文件让bool成为 _Bool的别名,而且还把true 和 false 分别定义为1和0的符号常量。包含该头文件后,写出的代码可以与C++兼容,因为++把boo1、true 和false 定义为关键字。

for 循环

数字的立方表:

#include <stdio.h>

int main(void) {
    //使用for 循环打印一个立方
    printf("数字N      数字N的立方\n");
    for (int i = 1; i <= 10; i++) {
        printf("%3d  %10d\n", i, i * i * i);
    }
    return 0;
}

/*
数字N      数字N的立方
  1           1
  2           8
  3          27
  4          64
  5         125
  6         216
  7         343
  8         512
  9         729
 10        1000
*/

乘法表:

#include <stdio.h>

int main(void) {
    //使用for 循环打印乘法表
    for (int i = 1; i <= 9; i++) {
        for (int k = 1; k <= i; k++) {
            printf("%dx%d=%2d   ",k,i,k*i);
        }
        printf("\n");
    }
    return 0;
}

/*
1x1= 1
1x2= 2   2x2= 4
1x3= 3   2x3= 6   3x3= 9
1x4= 4   2x4= 8   3x4=12   4x4=16
1x5= 5   2x5=10   3x5=15   4x5=20   5x5=25
1x6= 6   2x6=12   3x6=18   4x6=24   5x6=30   6x6=36
1x7= 7   2x7=14   3x7=21   4x7=28   5x7=35   6x7=42   7x7=49
1x8= 8   2x8=16   3x8=24   4x8=32   5x8=40   6x8=48   7x8=56   8x8=64
1x9= 9   2x9=18   3x9=27   4x9=36   5x9=45   6x9=54   7x9=63   8x9=72   9x9=81  
*/

求和、平均数:

#include <stdio.h>

int main(void) {
    //求5次射击的总分和平均分
    const int TIMES=5;
    int index,score[TIMES];
    float sum=0,average;
    printf("请输入%d次射击的分数:\n",TIMES);
    for(index=0;index<TIMES;index++) {
        scanf("%d",&score[index]);
        sum+=score[index];
    }
    average=sum/TIMES;
    printf("sum=%f,average=%2.2f\n",sum,average);

    return 0;
}

/*
请输入5次射击的分数:
10 9 8 8 8
sum=43.000000,average=8.60
*/

第7章 C控制语句:分支和跳转

page:200

getchar() putchar()函数

  • ch=getchar() 与 scanf("%c",&ch) 效果相同

  • putchar(ch) 与printf("%c",ch) 效果相同

#include <stdio.h>

int main(void) {
    char c;
    while ((c = getchar()) != '\n') {   // c = getchar() 从右到左计算结果
        putchar(c);
    }

    return 0;
}

/*
hello world!
hello world!
*/

字符处理相关函数(在 ctype.h中)

ctype.h头文件中的字符测试函数

函数名 如果是下列参数时,返回值为真
isalnum() 字母数字(字母或数字)
isalpha() 字母
isblank() 标准的空白字符(空格、水平制表符或换行符)或任何其他本地化指定为空白的字符
iscntrl() 控制字符,如Ctrl+B
isdigit() 数字
isgraph() 除空格之外的任意可打印字符
islower() 小写字母
isprint() 可打印字符
ispunct() 标点符号(除宦格或字母数字字符以外的任何可打印字符)
isspace() 空白字符(空格、换行符、换页符、回车符、垂直制表符、水平制表符或其他本地化定义的字符)
isupper() 大写字母
isxdigit() 十六进制数字符

代码 `if(c>=’a’ and c<=’z’) 对ASCII 有效,对EBCDIC等编码无效, 所以要用类似 islower()这样的可移植函数。

ctype.h头文件中的字符映射函数

函数名 行为
tolower() 如果参数是大写字符,该函数返回小写字符;否则,返回原始参数
toupper() 如果参数是小写字符,该函数返回大写字符;否则,返回原始参数

else与if的配对:如果没有花括号,与最新的if配对

使用花括号提高可读性。

逻辑预算符

  • &&,与
  • ||
  • !

引入 iso646.h 后,可以使用 and or not 替代

#include <stdio.h>
#include <iso646.h>
int main(void) {
    //使用英文句号写一句话
    // 计算其中的非英文引号的字符数量,字符包含空格。
    char c;
    int sum_of_chars = 0;
    while ((c = getchar()) != '.') {
        if(c!='"' and c!='\'') {
         sum_of_chars ++;
        }
    }
    printf("Sum of characters is: %d\n", sum_of_chars);
    return 0;
}

/*
hello world!.
Sum of characters is: 12
*/

对于逻辑运算符,C保证逻辑表达式的求值顺序是从左往右,保证一旦发现某个元素让整个表达式无效,便立即停止求值。正是由于有这些规定,才能写出这样结构的代码, 即: 先执行左边的表达式 获取c, 再执行右边的表达式,顺序反过来是无法执行的。

while ((c = getchar()) != '.' and c!='\n'))

一个统计单词数量的程序

这里输入的结束以字符| 表示

#include <stdio.h>
#include <iso646.h>  //使用逻辑运算符
#include <ctype.h>   // 使用 isspace()
/*
 * 一个统计单词数量的程序
 * 这里输入的结束以字符 | 表示
 */

int main(void) {
    char c;  // 读入的字符
    int sum_cs=0;//字符数
    int sum_words=0;//单词数
    int sum_lines=0;//行数
    _Bool c_in_word = false;//当前字符是否是单词的一部分
    _Bool pre_c_in_word = false;//上一字符是否为单词的一部分

printf("输入一段话,可以跨行,以|结束:\n");
    while ((c = getchar()) != '|') {
        //字符数
        sum_cs ++;
        //行数
        if (c == '\n') {
            sum_lines++;
            c_in_word = false;
            pre_c_in_word = false;
        }
        else if (not isspace(c) and not pre_c_in_word) {
            //当前字符非空,上一字符不是单词的一部分,开始一个新单词
            pre_c_in_word = true;
            sum_words++;
        }
        else if(isspace(c) and  pre_c_in_word) {
            // 当前字符空,上一字符是单词的一部分,结束一个字符
            pre_c_in_word = false;
        }
    }
    printf("Sum of characters is: %d\n", sum_cs);
    printf("Sum of words is: %d\n", sum_words);
    printf("Sum of lines is: %d\n", sum_lines);

    return 0;
}

/*
输入一段话,可以跨行,以|结束:
Reason is a
powerful servant but
an inadequate master.
| 
Sum of characters is: 55
Sum of words is: 9
Sum of lines is: 3
*/

条件运算符 ?:

形式:

表达式1?表达式2:表达式3

表达式1为真,结果为表达式2

表达式1为假,结果为表达式2

#include <stdio.h>
#include <iso646.h>  //使用逻辑运算符

int main(void) {
    printf("5>3?true:false,%d\n",5>3?true:false);
    printf("5<3?true:false,%d\n",5<3?true:false);
    return 0;
}

/*
5>3?true:false,1
5<3?true:false,0
*/

循环辅助:continue

跳过本地迭代的剩余部分,开始下一次迭代。

#include <stdio.h>
#include <iso646.h>  //使用逻辑运算符

int main(void) {
    //计算输入的总分和平均分
    double score, sum = 0, average;
    int nums = 0;

    printf("Please enter a number between 0 and 100(q to quit): ");
    while (scanf("%lf", &score) == 1) {
        if (score < 0 or score > 100) {
            printf("Invalid input,please enter a number between 0 and 100(q to quit): ");
            continue; // 开启while 的下一次循环
        }

        sum += score;
        nums++;
        average = sum / nums;
        printf("Please enter a number between 0 and 100(q to quit): ");
    }

    printf("The nums,sum,average of socres are %d ,%.2lf,%.2lf\n", nums, sum, average);

    return 0;
}

/*
Please enter a number between 0 and 100(q to quit): 2
Please enter a number between 0 and 100(q to quit): -1
Invalid input,please enter a number between 0 and 100(q to quit): -100
Invalid input,please enter a number between 0 and 100(q to quit): 3
Please enter a number between 0 and 100(q to quit): 4
Please enter a number between 0 and 100(q to quit): 5
Please enter a number between 0 and 100(q to quit): q
The nums,sum,average of socres are 5 ,15.00,3.00
*/

这里可以不用continue,把其他语句放在else 中。

循环辅助:break

break会终止包含它的循环,执行后续语句。

第8章 字符输入/输出和输入验证

page 238

正文完
 0
评论(没有评论)