C Primer Plus 第7章——第一篇

你该逆袭了

零、本章介绍

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 21
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值