你该逆袭了
第7章:重点摘录
- 零、本章介绍
- 一、if 语句
- 二、if else 语句
- 1、介绍 getchar( ) 和 putchar( )
- 2、ctype.h 系列 的 字符函数
- (1)、isalnum( )
- (2)、isalpha( )
- (3)、isblank( )
- (4)、iscntrl( )
- (5)、isdigit( )
- (6)、isgraph( )
- (7)、islower( )
- (8)、isprint( )
- (9)、ispunct( )
- (10)、isspace( )
- (11)、isupper( )
- (12)、isxdigit( )
- (13)、tolower( )
- (14)、toupper( )
- 3、多重选择 else if
零、本章介绍
1、关键字:if、else、switch、continue、break、case、default、goto
2、运算符:&&、||、?:
3、函数:gechar( )、putchar( )、ctype.h 系列
4、如何使用 if 和 if else 语句,如何嵌套它们
5、在更复杂的测试表达式中用逻辑运算符组合关系表达式
6、C 的条件运算符
7、switch 语句
8、break 、continue 和 goto 语句
9、使用 C 的字符 I/O 函数:getchar ( ) 和 putchar( )
10、ctype.h 头文件提供的字符分析函数系列
一、if 语句
#include <stdio.h>
int main()
{
const int FREEZING = 0;
float temperature = 0;
int cold_days = 0;
int all_days = 0;
printf("enter the list of daily low temperatures.\n");
printf("use celsius, and enter q to quit.\n");
while (scanf("%f", &temperature) == 1)
{
all_days++;
if (temperature < FREEZING)
{
cold_days++;
}
}
if (all_days != 0)
{
printf("%d days total:%.1f%% were below freezing.\n",
all_days, 100.0 * (float)cold_days / all_days); //其实,不必使用强制转换类型,因为式子中有 100.0 ,它先进行 100.0 * cold_days,由于 C 的自动转换类型规则,乘积会被强制转换成浮点数
//但是,使用强制转换类型,可以明确表达转换类型的意图,保护程序免受不同版本编译器的影响
}
if (all_days == 0)
{
printf("no data entered!\n");
}
return 0;
}
二、if else 语句
1、介绍 getchar( ) 和 putchar( )
int getchar ( void );
int putchar ( int character );
//P181 程序清单7.2
//更改输入,空格不变
#include <stdio.h>
#define SPACE ' ' //SPACE 表示 单引号—空格—单引号
int main()
{
int ch = 0;
ch = getchar();
while (ch != '\n')
{
if (ch == SPACE)
{
putchar(ch); //打印 空格
}
else
{
putchar(ch + 1);
}
ch = getchar(); //获取下一个字符
}
putchar(ch); // 显示 换行符
return 0;
}
while (ch = getchar() != '\n'); //这种是大错特错,运算发优先级被忽略了
2、ctype.h 系列 的 字符函数
C 有一系列 专门处理字符 的函数,ctype.h 头文件包含了这些函数的原型。
这些函数接受一个字符作为参数,如果该字符属于特殊类别,就返回一个非零值(真);否则,返回 0(假)。
例如:isalpha( ) 函数的参数是一个字母,则返回一个非零值。
//P182 程序清单7.3
//替换输入的字母,非字母字符保持不变
#include <stdio.h>
#include <ctype.h> //包含 isalpha( ) 的函数原型
int main()
{
int ch;
while ((ch = getchar()) != '\n')
{
if (isalpha(ch)) //如果是一个字符,
{
putchar(ch + 1); //显示该字符的下一个字符
}
else
{
putchar(ch); //标点符号、空格之类的就原样输出
}
}
putchar(ch); //显示 换行符
return 0;
}
(1)、isalnum( )
isalnum( )
检查字符是否为 字母 或者 数字
//isalnum( )
//检查字符是否为 字母 或者 数字
#include <stdio.h>
#include <ctype.h>
int main()
{
int i = 0;
char str[10] = "abcd...";
while (isalnum(str[i]))
{
i++;
}
printf("the first %d character are alphanumeric.\n", i); //the first 4 character are alphanumeric.
return 0;
}
(2)、isalpha( )
功能:检查字符是否为 字母
返回值:如果确实是字母,则为不同于零的值(即 true);否则为零(即 false)。
//isalpha( )
//检查字符是否为 字母
#include <stdio.h>
#include <ctype.h>
int main()
{
int i = 0;
char str[10] = "c++";
while (str[i])
{
if (isalpha(str[i]))
{
printf("character %c is alphabetic\n", str[i]);
}
else
{
printf("character is not alphabetic\n", str[i]);
}
i++;
}
return 0;
}
(3)、isblank( )
//isblank( )
// int isblank ( int c );
//功能:检查是否是标准的空白字符(空格、水平制表符、换行符)或者任何其他本地化指定为空白的字符
//返回值:如果 c 确实是空白字符,则为不同于零的值(即 true);否则为零(即 false)。
#include <stdio.h>
#include <ctype.h>
int main()
{
char c = 0;
int i = 0;
char str[] = "example sentence to test isblank\n";
while (str[i])
{
c = str[i];
if (isblank(c))
{
c = '\n';
}
putchar(c);
i++;
}
return 0;
}
//此代码逐个字符打印出 C 字符串,用换行符替换任何空白字符
(4)、iscntrl( )
//iscntrl( )
//int iscntrl ( int c );
//功能检查字符是否为控制字符
//对于标准 ASCII 字符集(由“C”区域设置使用),
//控制字符是 ASCII 代码 0x00 (NUL) 和 0x1f (US) 之间的字符,加上 0x7f (DEL)。
#include <stdio.h>
#include <ctype.h>
int main()
{
int i = 0;
char str[] = "first line \n second line \n";
while (iscntrl(str[i]))
{
putchar(str[i]);
i++;
}
return 0;
}
//此代码逐个字符打印字符串,直到遇到中断 while 循环的控制字符。
//在这种情况下,将只打印第一行,
//因为该行以“\n”结尾,该字符是控制字符(ASCII 代码 0x0a)。
(5)、isdigit( )
//isdigit()
// int isdigit ( int c );
//功能:检查是否为十进制数。十进制数字是以下任意数字:0 1 2 3 4 5 6 7 8 9
//返回值:如果确实是十进制数字,则为不同于零的值(即 true)。否则为零(即 false)。
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h> //atio() 的头文件
int main()
{
char str[] = "1776ad";
int year = 0;
if (isdigit(str[0]))
{
year = atoi(str); //atio( ) 分析 C 字符串,将其内容解释为整数,该整数作为 类型的值返回。
printf("the year that followed %d was %d.\n", year, year + 1);
}
return 0;
}
//The year that followed 1776 was 1777
(6)、isgraph( )
//isgraph
//int isgraph ( int c );
//检查是否为:除空格之外的任意可打印字符
//返回值:一个不同于零的值(即 true),如果 c 确实具有图形表示作为字符。否则为零(即 false)
#include <stdio.h>
#include <ctype.h>
int main()
{
char ch[] = "abcdefg hhj";
int i = 0;
while (isgraph(ch[i]))
{
i++;
}
printf("%d\n", i); // 7
return 0;
}
(7)、islower( )
//islower()
// int islower ( int c );
//功能:检查是否为 小写字母
//返回值:如果 c 确实是小写字母,则为不同于零的值(即 true)。否则为零(即 false)。
#include <stdio.h>
#include <ctype.h>
int main()
{
int i = 0;
char str[] = "test string.\n";
while (islower(str[i]))
{
i++;
}
printf("%d\n", i); // 4
return 0;
}
(8)、isprint( )
//isprint()
//int isprint ( int c );
//功能:检查字符是否可打印,可打印字符是在显示器上占据打印位置的字符(这与控制字符相反,使用 iscntrl 进行检查)。
//对于标准 ASCII 字符集(由“C”区域设置使用),打印字符的 ASCII 代码均大于 0x1f (US),0x7f (DEL) 除外。
//返回值:如果确实是可打印字符,则为不同于零的值(即 true)。否则为零(即 false)。
#include <stdio.h>
#include <ctype.h>
int main()
{
int i = 0;
char str[] = "first line \n second line \n";
while (isprint(str[i]))
{
putchar(str[i]);
i++;
}
return 0;
}
//first line
//此代码逐个字符打印字符串,直到选中不可打印的字符并中断 while 循环。
//在这种情况下,将仅打印第一行,因为该行以换行符 ('\n') 结尾,该换行符不是可打印字符。
(9)、ispunct( )
//ispunct()
//int ispunct ( int c );
//检查字符是否是标点符号(除空格和字母数字字符以外的任何可打印的字符)
//返回值:如果确实是标点符号,则为不同于零的值(即 true)。否则为零(即 false)。
#include <stdio.h>
#include <ctype.h>
int main()
{
int i = 0;
int cx = 0;
char str[] = "hello,welcome.";
while (str[i])
{
if (ispunct(str[i]))
{
cx++;
}
i++;
}
printf("sentence contains %d punctuation characters.\n", cx); // 2
return 0;
}
(10)、isspace( )
//isspace()
//int isspace ( int c );
//功能:检查字符是否为空白字符
//空白字符(空格、换行符、换页符、回车符、垂直制表符、水平制表符、其他本地化定义的字符)
//返回值:如果确实是空格字符,则为不同于零的值(即 true)。否则为零(即 false)。
#include <stdio.h>
#include <ctype.h>
int main()
{
char c = 0;
int i = 0;
char str[] = "example sentence to test isspace\n";
while (str[i])
{
c = str[i];
if (isspace(c))
{
c = '\n';
}
putchar(c);
i++;
}
return 0;
}
(11)、isupper( )
//isupper()
//int isupper ( int c );
//功能:检查字符是否为大写字母
//返回值:如果确实是大写字母,则为不同于零的值(即 true)。否则为零(即 false)。
#include <stdio.h>
#include <ctype.h>
int main()
{
int i = 0;
char str[] = "Test String.\n";
char c = 0;
while (str[i])
{
c = str[i];
if (isupper(c))
{
c = tolower(c); //大写字母转化为小写字母
}
putchar(c);
i++; //test string.
}
return 0;
}
(12)、isxdigit( )
//isxdigit( )
//int isxdigit ( int c );
//功能:检查字符是否为十六进制数字
//返回值:一个不同于零的值(即 true),如果 c 确实是十六进制数字。否则为零(即 false)。
#include <stdio.h>
#include <ctype.h>
int main()
{
char str[] = "ffff";
long int number;
if (isxdigit(str[0]))
{
number = strtol(str, NULL, 16);
printf("The hexadecimal number %lx is %ld.\n", number, number);
}
return 0; //The hexadecimal number ffff is 65535.
}
//isxDigit 用于检查 str 中的第一个字符是否为有效的十六进制数字,因此是否是 strtol 转换为整数值的有效候选项。
(13)、tolower( )
//tolower()
//int tolower ( int c );
//功能:如果参数是大写字符,该函数返回小写字符;否则,返回原始参数。
//返回值:如果存在此类值,则为小写字母,相当于 c,否则为 c(不变)。该值以 int 值的形式返回,该值可以隐式转换为 char。
#include <stdio.h>
#include <ctype.h>
int main()
{
int i = 0;
char str[] = "Test String.\n";
char c;
while (str[i])
{
c = str[i];
putchar(tolower(c));
i++;
}
return 0;
}
(14)、toupper( )
//toupper()
//int toupper ( int c );
//功能:如果参数是小写字符,该函数返回大写字符;否则,返回原始参数
//返回值:如果存在此类值,则为大写字母,则等效于 c,否则为 c(不变)。该值以 int 值的形式返回,该值可以隐式转换为 char。
#include <stdio.h>
#include <ctype.h>
int main()
{
int i = 0;
char str[] = "Test String.\n";
char c;
while (str[i])
{
c = str[i];
putchar(toupper(c));
i++;
}
return 0;
}
3、多重选择 else if
//P188 程序清单7.5
//使用嵌套 if 语句显示一个数的约数
#include <stdio.h>
#include <stdbool.h> //包含这个头文件,就可以用 bool 代替 _Bool 类型,用 true 和 false 分别代替 1 和 0 ;
int main()
{
unsigned long num = 0; //待测试的数
unsigned long div = 0; //可能的约数
bool isPrime = 0; //素数标记
printf("please enter an integer for analysis; ");
printf("enter q to quit.\n");
while (scanf("%lu", &num) == 1)
{
for (div = 2, isPrime = true; (div * div) <= num; div++) //测试的数字只要到 num 的 平方根 就可以
{ //原因:(1)还没有学习 sqrt() 函数;(2)整数乘法比求平方根快
if (num % div == 0)
{
if ((div * div) != num)
{
printf("%lu is divisible by %lu and %lu.\n",
num, div, num / div);
}
else
{
printf("%lu is divisible by %lu.\n",
num, div);
}
isPrime = false;
}
}
if (isPrime)
{
printf("%lu is prime.\n", num);
}
printf("please enter another integer for analysis; ");
printf("enter q to quit.\n");
}
printf("bye.\n");
return 0;
}