第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