C 语言复习总结记录二

news2024/12/26 11:17:52

C 语言复习总结记录二

一 控制语句

1、语句的分类
  1. 表达式语句
  2. 函数调用语句
  3. 复合语句
  4. 控制语句
  5. 空语句

控制语句 控制程序的执行流程,实现程序的各种结构方式

C 语言支持三种结构 :顺序结构、选择结构、循环结构,由特定的语句定义符组成C语言有九种控制语句,可分成以下三类:

  1. 条件判断语句也叫分支语句:if 语句、switch 语句

  2. 循环执行语句:do while 语句、while 语句、for 语句

  3. 转向语句:break 语句、goto 语句、continue 语句、return 语句

2、分支语句

0 表示假,非 0 即为真

int score = 0;
scanf("%d", &score);
if (score >= 90)
{
	printf("恭喜你,及格了");
}
else
{
	printf("继续加油吧");
}

//else 是和它离的最近的 if 匹配的
int a = 0, b = 2;
if (a == 1)
    if (b == 2)
		printf("b == 2 !");
else
	printf("a != 1 !");

判断一个数是否为奇数;输出1-100之间的奇数

int main() {
	//奇数 : 不能被二整除的数
	int input = 0;
	scanf("%d", &input);
	if (input % 2) //这里用/也行, 但整除其实就是看余数, 用%更简洁
		printf("The input is an odd number");
	else
		printf("The input is not an odd number");

    for(int i = 1; i <= 100; ++i) {
        if (i % 2) 
            printf("%d\n", i);
    }
	return 0;
}

switch 语句

常用于多分支的情况

例如,输入 [1, 7] 的整数,输出对应的星期几;其语句常用格式如下

switch(整型表达式)
{
    case 整型常量表达式:
        语句;
        break;
    ...
    default:
        语句;
        break;
}

break 语句的实际效果是把语句列表划分为不同的分支部分

#include <stdio.h>
int main()
{
   int n = 1;
   int m = 2;
   switch (n)
   {
    case 1:
            m++;  //n = 1, m++ 后 m = 3, 没有 break 继续执行
    case 2:
            n++;  //n = 2, m = 3
    case 3:
           switch (n)
           {//switch允许嵌套使用
             case 1:
                    n++;
             case 2:	//n = 2 跳转到该位置
                    m++;
                    n++;
                    break; //n = 3, m = 4 跳出该 switch 作用域
           } //没有 break 继续向下执行
    case 4:
            m++;
            break; //n = 3, m = 5 跳出 switch 作用域
    default:
            break;
   }
   printf("m = %d, n = %d\n", m, n);
   return 0;
}

在使用 switch 语句时要在分支语句的最后加上 break; 如果不加的话后面的语句会被继续执行

无条件跳转到 .L8,如果没有 break,后面的段就会继续执行

image-20241119230032804

对于 switch - case 语句的理解:

它具有 跳转 的作用,当和某一个数字或者字符匹配上的时候,就会跳转到对应的入口地址处

break 也具有 跳转 的作用,当匹配对应的时候,执行跳转到对应的入口地址,后面就会顺着这个地址一直执行下去

3 循环语句

while 循环

编写程序,要求只打印输入的数字字符,跳过其它字符,当数字字符为 6 时,终止程序

了解一些关于 getchar 和 putchar 的基础知识,EOF 在 C 语言中是一个宏定义,通常等于 -1。它用于指示输入的结束,无论是从文件读取还是从标准输入读取数据时,当没有更多数据可读时,就会遇到 EOF。(在标准输入中,通过输入特定的字符或组合来表示 EOF,Windows Ctrl+Z 回车产生EOF,Unix/Linux 则是 Ctrl+D)

scanf 和 printf 可处理各类型的数据,比如整型、字符、浮点型等,但 getchar 和putchar 只针对字符

getchar:函数原型 int getchar(void),从标准输入 stdin 获取一个字符(一个无符号字符),返回值是用户输入的字符的 ASCII 码

putchar:原型 int putchar(int c) 整数参数 c,代表需要输出的字符。主要功能是将字符 c 写入标准输出设备(通常指的是控制台窗口),并返回所写入的字符,发生错误,则返回 EOF

//该段程序即打印字符, 例如 
// 输入 111'\n', 则控制台打印 111'\n'
int ch = 0;
while ((ch = getchar()) != EOF) {
	putchar(ch);
}

break 跳出终止当前语句,在此处即为跳出 while 循环或终止 while 循环

continue 用于终止本次循环,直接跳转到 while 语句的判断部分,进行下一次循环的判断

char ch = '\0';
while ((ch = getchar()) != EOF) {
	if (ch == '5')
		break;

	if (ch < '0' || ch > '9' ) //注意因为没有 ch == '\n' 时打印是重叠的
		continue;
	else
		putchar(ch);
}

for 循环

for 循环的一般格式

for(初始化循环变量; 判断循环条件; 调整循环变量)
	循环语句;

打印 1 - 10 的数字

//while 循环
int i = 1; //初始化循环变量
while (i <= 10) //判断循环条件
{
    printf("%d\n", i); //循环语句
    ++i; //调整循环变量
}
    
//for 循环
for (int i = 1; i <= 10; ++i)
{
    printf("%d\n", i);
}

当存在固定的循环结束条件和循环变量时,明显 for 循环的在格式上比 while 循环更简洁

建议:一般不在 for 循环体内修改循环变量,防止循环条件失去控制;一般建议循环条件的取值范围采用 前闭后开 的写法(代码便于理解)

一些 for循环变种

#include <stdio.h>
int main()
{
	//1、死循环
	for(;;)
	{
		printf("死循环");
	}
    
    //2、双层 for
    int i = 0;
    int j = 0;
    for(i = 0; i < 2; ++i)
	{
        for (j = 0; j < 2; ++j)
			printf("Time \n");
	}	//总打印 4
    
    for(; i < 2; ++i)
	{
        for (; j < 2; ++j)
			printf("Time \n");
	}	//总打印 2
    
    //3、多变量控制循环条件
    int x= 0, y = 0;
    for(; x < 2 && y < 5; ++x,++y)
        printf("Time \n");
    
    //小练习, 循环执行了几次 ?
    int i = 0, k = 0;
 	for(i =0,k=0; k = 0; i++,k++)
        k++; // 0 次, 因为 k = 0 表达式的结果返回的是 k赋值后的结果为 0, 因此循环不会执行
    
	return 0;
}

do while 循环

特点:循环至少会执行一次

#include <stdio.h>
int main(){
    int i = 1, j = 1;
    do {
        ++i;
        if (i == 7) break;
        if (i == 4) continue;
        ++j;
    } while (i < 10);
    printf("%d\n", j); //5
    return 0;
}
4 goto 语句

C 语言中提供了可以跳转的 goto 语句和标记跳转的符号,最常见的用法是终止程序深度嵌套结构的处理过程。例如:一次跳出两层或多层循环

break 只能从最内层循环退出到上一层的循环

for(...)
    for(...)
   {
        for(...)
       {
            if(disaster)
                goto error;
       }
   }
    …
error:
 if(disaster)
         // 处理错误情况

关机小程序

#include<stdio.h>

int main()
{
    char input[10];
    system("shutdown -s -t 60");

again:
    printf("电脑将在1分钟内关机如果输入: 我是超人, 就取消关机 ! \n 请输入:>");
    scanf("%s", &input);
    if(strcmp(input, "我是超人") == 0)
        system("shutdown -a");
    else
    	goto again;
    
    return 0;
}

//使用 while 循环替代
int main()
{
    char input[10];
    system("shutdown -s -t 60");

	while(1){
     	printf("电脑将在1分钟内关机如果输入: 我是超人, 就取消关机 ! \n 请输入:>");
    	scanf("%s", &input);
    	if(strcmp(input, "我是超人") == 0)
        {
        	system("shutdown -a");
            break;
        }
    }
    return 0;
}
练习

1、计算 n 的阶乘

int n = 0, res = 1;
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
{
	res *= i;
}
printf("%d\n", res);

2、计算 1! + 2! + 3! + …… + 10!

int res = 1, sum = 0;
for (int i = 1; i <= 10; ++i)
{
	res *= i;
	sum += res;
}
printf("%d\n", sum); //4037913

3、在一个有序数组中查找具体的某个数字 n(二分查找)

int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int n = 0, left = 0, right = (sizeof(arr) / sizeof(int)) - 1;
scanf("%d", &n);
while (left <= right)
{
	int index = (left + right) / 2; //数组中间元素下标
	if (n > arr[index]) //比中间元素还大,说明在右侧
	{
		left = index + 1;
	}
	else if (n < arr[index])
	{
		right = index - 1;
	}
	else 
	{
		printf("该数字在数组中对应的下标为 %d\n", index);
		break;
	}
}

4、编写代码,演示多个字符从两端移动,向中间汇聚

char arr[] = "Hello World!";
int left = 0, right = strlen(arr) - 1;
while (left <= right) {
	printf("%s\n", arr);
	arr[left] = ' ';
	arr[right] = ' ';
	++left;
	--right;
}

5、编写代码实现,模拟用户登录情景,并且只能登录三次(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序

int i = 1;
char password[] = "123456";
char input[10];

for (i = 1; i <= 3; ++i)
{
	printf("please input:");
	scanf("%s", input);
	if (strcmp(input, password) == 0)
		break;
}

if (i == 4)
	printf("exit \n");
else
	printf("login \n");

6、猜数字游戏

原型:void srand(unsigned seed);

rand 函数用来发生随机数, 当然是 伪随机数

原型:int rand(void)

seed 的作用:srand 函数的作用是根据参数 seed,设置一个随机起始点,而 rand 函数根据这个起始点,发生随机数序列。默认的随机种子为 1。如果随机种子一样,rand 函数所发生的随机序列也一样。

因此,为使每次程序运行都能发生不同的随机序列,每次都应发生一个不同的种子参数

说明 :因为 rand 的内部实现是用线性同余法做的,它不是真的随机数,只不过是因为其周期特别长,所以一定范围内可看成是随机的,rand() 会返回一随机数值,范围在0 至 RAND_MAX 间。

在调用此函数发生随机数前,必须先利用 srand() 设好随机数种子,如果未设随机数种子,rand() 在调用时会主动设随机数种子为 1。rand() 发生的是假随机数字,每次执行时是雷同的。

若要不同, 以不同的值来初始化它. 初始化的函数就是 srand()

rand() % (n + 1); 生成 [0 , n] 的整数(n < RAND_MAX),为什么 n + 1,前面是取模运算 %

rand() % (n - m + 1) + m; 生成 [m , n] 范围内的随机数

//简单的测试, 当不设置种子时默认为 1, 每次程序的执行结果都是一样的
for (int i = 0; i <= 10; ++i)
{
	int res = rand();
	printf("%d\n", res);
}
void menu() {
	printf("*********************************\n");
	printf("************ 1.play *************\n");
	printf("************ 0.exit *************\n");
	printf("*********************************\n");
}

void game() {
	int input = -1;
	int res = rand() % (9 + 1);
	while (1) {
		printf("请输入一个 0 - 9 的数字 \n");
		scanf("%d", &input);
		if (input > res)
		{
			printf("猜大了\n");
		}
		else if (input < res)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("猜中了\n");
			break;
		}
	}
}

int main() {
	int input = -1;
	srand((unsigned)time(NULL)); //NULL 参数使用当前的系统时间
	
	do {
		menu();
		printf("请输入以上数字选择功能: \n");
		scanf("%d", &input);
		switch (input)
		{
			case 1:
				game();
				break;
			case 0:
				break;
			default:
				printf("选择错误, 请重新输入! \n");
				break;
		}
	} while (input);
	
	return 0;
}
ut > res)
		{
			printf("猜大了\n");
		}
		else if (input < res)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("猜中了\n");
			break;
		}
	}
}

int main() {
	int input = -1;
	srand((unsigned)time(NULL)); //NULL 参数使用当前的系统时间
	
	do {
		menu();
		printf("请输入以上数字选择功能: \n");
		scanf("%d", &input);
		switch (input)
		{
			case 1:
				game();
				break;
			case 0:
				break;
			default:
				printf("选择错误, 请重新输入! \n");
				break;
		}
	} while (input);
	
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2246856.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【mongodb】社区版8:改变配置bindip和授权

更改配置 sudo systemctl restart mongod (base) root@k8s-master-pfsrv:/home/zhangbin# sudo tail -n 20 /var/log/mongodb/mongod.log 日志感觉是成功了:{"t":{"$date":"2024-11-19T19:57:47.076+08:00"

28.UE5游戏框架,事件分发器,蓝图接口

3-3 虚幻游戏框架拆解&#xff0c;游戏规则基础_哔哩哔哩_bilibili 目录 1.游戏架构 2.事件分发器 2.1UI控件中的事件分发器 2.2Actor蓝图中的事件分发器 2.2.1动态决定Actor的分发事件 2.2.2父类中定义事件分发器&#xff0c;子类实现事件分发器 2.3组件蓝图中实现事件…

P1 练习卷(C++4道题)

1.纷繁世界 内存限制&#xff1a;256MB 时间限制&#xff1a;1s 问题描述 这是一个纷繁复杂的世界。 某一天清晨你起床很迟&#xff0c;没有吃上早饭。于是你骑着自行车去超市&#xff0c;但是你又发现商店的工作人员已经重新贴上了价格标签&#xff0c;零食价格都涨了50%。你…

挂壁式空气净化器哪个品牌的质量好?排名top3优秀产品测评分析

随着挂壁式空气净化器市场的不断扩大&#xff0c;各类品牌与型号琳琅满目。但遗憾的是&#xff0c;一些跨界网红品牌过于追求短期效益&#xff0c;导致产品在净化效果与去除异味方面表现平平&#xff0c;使用体验不佳&#xff0c;甚至可能带来二次污染风险&#xff0c;影响人体…

贴代码框架PasteForm特性介绍之image

简介 PasteForm是贴代码推出的 “新一代CRUD” &#xff0c;基于ABPvNext&#xff0c;目的是通过对Dto的特性的标注&#xff0c;从而实现管理端的统一UI&#xff0c;借助于配套的PasteBuilder代码生成器&#xff0c;你可以快速的为自己的项目构建后台管理端&#xff01;目前管…

C++异常: cv::Exception 解决

原因是C中文件路径错误&#xff0c;\ 号在字符串中表示转义字符&#xff0c;"C:\Users\14421\Desktop\123.png" "C:Usersd21DesktopS.png" &#xff0c;所以应该改为 C:\\Users\\14421\\Desktop\\123.png 或者 C:/Users/14421/Desktop/123.png 即可解决问…

libphone desktop编译

linphone-desktop 在ubuntu20.04 下编译 linphone 介绍 Linphone是一款遵循GPL的开源网络视频电话系统&#xff0c;支持多种平台如Windows、Linux、Android等。它基于SIP协议&#xff0c;提供语音、视频通话及即时文本消息功能。核心功能包括SIP用户代理、音频视频Codec支持、…

高精度计算题目合集

高精度计算题目合集 1168&#xff1a;大整数加法 1168&#xff1a;大整数加法 1168&#xff1a;大整数加法 高精度加法原理&#xff1a; a&#xff0c;b&#xff0c;c 都可以用数组表示。这些都是基于c语言的算术运算符形成的运算。 c 3 ( c 1 c 2 ) % 10 c_3(c_1c_2)\%1…

【Python】爬虫实战:高效爬取电影网站信息指南(涵盖了诸多学习内容)

本期目录 1 爬取思路 2 爬虫过程 2.1 网址 2.2 查看网页代码 3 爬取数据 3.1 导入包 3.2 爬取代码 01 爬取思路 \*- 第一步&#xff0c;获取页面内容\*- 第二步&#xff1a;解析并获取单个项目链接 \*- 第三步&#xff1a;获取子页面内容 \*- 第四步&#xff1a;解析…

【bug】使用transformers训练二分类任务时,训练损失异常大

使用transformers训练二分类任务时&#xff0c;训练损失异常大 问题分析 问题 training_loss异常大&#xff0c;在二分类损失中&#xff0c;收敛在1~2附近&#xff0c;而eval_loss却正常&#xff08;小于0.5&#xff09; 分析 参考&#xff1a; Bug in gradient accumulation…

uni-app 认识条件编译,了解多端部署

一. 前言 在使用 uni-app 进行跨平台开发的过程中&#xff0c;经常会遇到需要针对不同平台或不同环境进行条件编译的情况。条件编译是一种在编译过程中根据指定条件选择不同代码路径的技术&#xff0c;可以帮助我们在不同平台或环境下编写不同的代码&#xff0c;以适应不同的平…

HarmonyOS Next原创项目

学友市集 HarmonyOS毕设,项目完整,代码原创,可接毕设 项目展示 项目简介 学友集市是一款基于HarmonyOS Next开发的二手交易平台,适配HarmonyOS5.0&#xff0c;采用前后端分离架构&#xff0c;致力于为用户提供安全、便捷、高品质的二手商品交易服务。平台整合了华为云认证服…

现代密码学

概论 计算机安全的最核心三个关键目标&#xff08;指标&#xff09;/为&#xff1a;保密性 Confidentiality、完整性 Integrity、可用性 Availability &#xff0c;三者称为 CIA三元组 数据保密性&#xff1a;确保隐私或是秘密信息不向非授权者泄漏&#xff0c;也不被非授权者使…

深度学习实战人脸识别

文章目录 前言一、人脸识别一般过程二、人脸检测主流算法1. MTCNN2. RetinaFace3. CenterFace4. BlazeFace5. YOLO6. SSD7. CascadeCNN 三、人脸识别主流算法1.deepface2.FaceNet3.ArcFace4.VGGFace5.DeepID 四、人脸识别系统实现0.安装教程与资源说明1. 界面采用PyQt5框架2.人…

51c自动驾驶~合集31

我自己的原文哦~ https://blog.51cto.com/whaosoft/12121357 #大语言模型会成为自动驾驶的灵丹妙药吗 人工智能&#xff08;AI&#xff09;在自动驾驶&#xff08;AD&#xff09;研究中起着至关重要的作用&#xff0c;推动其向智能化和高效化发展。目前AD技术的发展主要遵循…

2023年3月GESPC++一级真题解析

一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 题目123456789101112131415答案BAACBDDAADBCDBC 1.以下不属于计算机输入设备的有&#xff08; &#xff09;。 A &#xff0e;键盘 B &#xff0e;音箱 C &#xff0e;鼠标 D &#xff0e;传感器 【答案】 …

深度学习实验十二 卷积神经网络(3)——基于残差网络实现手写体数字识别实验

目录 一、模型构建 1.1残差单元 1.2 残差网络的整体结构 二、统计模型的参数量和计算量 三、数据预处理 四、没有残差连接的ResNet18 五、带残差连接的ResNet18 附&#xff1a;完整的可运行代码 实验大体步骤&#xff1a; 先前说明&#xff1a; 上次LeNet实验用到的那…

第10章JavaScript的应用

10.1 JavaScript概述 10.1.1 JavaScript简介 10.1.1.1 简单性 10.1.1.2 动态性 10.1.1.3 跨平台性 10.1.1.4 安全性 10.1.1.5 基于对象的语言 10.1.2 JavaScript入门案例 10.1.3 JavaScript放置的位置 10.1.3.1 head标记中的脚本 代码 <!DOCTYPE html> <ht…

Linux操作系统:进程控制_进程的创建、终止、等待

一、进程创建 这一块我们在前篇都已经讲过&#xff0c;第一部分就简单带大家回顾一下之前的知识。 1.1 fork函数初识 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 #include<unistd.h>…

MySQL数据库学习(持续更新ing)

1. 什么是数据库&#xff1f;什么是数据库管理系统&#xff1f;什么是SQL&#xff1f;他们之间的关系是什么&#xff1f; 数据库&#xff1a;Database&#xff0c; 简称DB。按照一定格式存储数据&#xff0c;一些文件的组合。 数据库管理系统&#xff1a;DataBaseManagement&…