【C语言】分支语句和循环语句(下)

news2024/11/16 3:20:49

【C语言】分支语句和循环语句(下)

  • 1.for循环
    • 1.2 语法
    • 1.3 break和continue在for循环中
    • 1.4 for语句的循环控制变量
    • 1.5 一些for循环的变种
    • 1.6一道笔试题
  • 2. do……while()循环
    • 2.1 do语句的语法
    • 2.2 do语句的特点
    • 2.3 do while循环中的break和continue
  • 3.练习

所属专栏:C语言
博主首页:初阳785
代码托管:chuyang785
感谢大家的支持,您的点赞和关注是对我最大的支持!!!
博主也会更加的努力,创作出更优质的博文!!
关注我,关注我,关注我,重要的事情说三遍!!!!!!!!

1.for循环

1.2 语法

for(表达式1; 表达式2; 表达式3)
循环语句;
  • 表达式1
    表达式1为初始化部分,用于初始化循环变量的。
  • 表达式2
    表达式2为条件判断部分,用于判断循环时候终止。
  • 表达式3
    表达式3为调整部分,用于循环条件的调整。

例如:

#include <stdio.h>
int main()
{
 	int i = 0;
 	//for(i=1(初始化); i<=10(判断部分); i++(调整部分))
 	for(i=1; i<=10; i++)
 	{
 		printf("%d ", i);
 	}
 	return 0;
}

上面就会打印1-10。

for循环的流程图:
在这里插入图片描述
我们对比一下while:

int i = 0;
//实现相同的功能,使用while
i=1;//初始化部分
while(i<=10)//判断部分
{
 printf("hehe\n");
 i = i+1;//调整部分
}
//实现相同的功能,使用while
for(i=1; i<=10; i++)
{
  printf("hehe\n");
}

可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹;for循环使用的频率也最高。

1.3 break和continue在for循环中

我们一串代码:

#include <stdio.h>
int main()
{
    int i = 0;
    for (i = 1; i <= 10; i++)
    {
        if (5 == i)
            break;
        printf("%d ", i);
    }
   

这个结果是什么呢?
在这里插入图片描述
我们看到了当i==5的时候就跳出程序了,和while是一样的。

那如果我们改成continue会怎么样呢?
在这里插入图片描述
我们看到他并没有打印5,当i==5的时候就跳过了。

所以这里的break和continue是一样的,遇到break直接跳出循环,遇到continue跳过这个节点开始下一个节点。

1.4 for语句的循环控制变量

建议:

  1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
  2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。

就比如:

#include <stdio.h>
int main()
{
 	int i = 0;
 	for(i=1; i<=10; i++)
 	{
 		printf("%d ", i);
 		i=5;
 	}
 	return 0;
}

对于第一点:
如果你想上面那样i=5的话就会出现错误,这样的话就陷入了死循环,每次你打印完后i=5,i就永远到不了10就会一直循环下去,这样就出错了。

对于第二点:
这个点主要是针对数组,因为我们的数组下标是从0开始的。

#include <stdio.h>
int main()
{
	int arr[5]={1,2,3,4,5};
	int i=0;
	for(i=0;i<5;i++)
	{
		printf("%d",arr[i]);
	}
	return 0;
}

这里我们取值的范围是i=0;i<5即:0 1 2 3 4,刚好是数组的下标,这样子的话就会更方便的定义数组,防止后续因下标问题出现一系列的问题。

1.5 一些for循环的变种

#include <stdio.h>
int main()
{
 //代码1
 for(;;)
 {
 printf("hehe\n");
 }
    //for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问题。

我们看上面一串代码它执行的结果是什么呢?
答案是死循环。
因为我们的初始化部分,条件部分以及调整部分都是空,也就是说没有谁限制for循环,那么for循环就可以为所欲为,就会一直循环下去停不下来 。

  //代码2
    int i = 0;
    int j = 0;
    //这里打印多少个hehe?
    for(i=0; i<10; i++)
   {
        for(j=0; j<10; j++)
       {
 			printf("hehe\n");
       }
   }
    //代码3
    int i = 0;
    int j = 0;
    //如果省略掉初始化部分,这里打印多少个hehe?
    for(; i<10; i++)
   {
        for(; j<10; j++)
       {
 			printf("hehe\n");
       }
   }

我们先看代码2,两给for循环嵌套,打印100个hehe。
但是如果我们省略吊我们的初始部分会怎么样?
在这里插入图片描述
会发现他只打印了10个hehe并没有打印100个hehe。
但我们进入for循环的时候i和j在外部初始化为0,进入后初始值是0,后面经过i++,和j++后由于我们for循环没有初始化部分所以i和j都会又累加效果所以当j++到4的时候它的条件语句就不会通过也就是说它不会在进入第二个for循环中打印hehe了。

同时我们的for循环里面的表达式可以是多个的:

#include <stdio.h>
int main()
{
 //代码4-使用多余一个变量控制循环
 	int x, y;
    for (x = 0, y = 0; x<2 && y<5; ++x, y++)
   {
        printf("hehe\n");
   }
	return 0;
 }

1.6一道笔试题

//请问循环要循环多少次?
#include <stdio.h>
int main()
{
 int i = 0;
 int k = 0;
 for(i =0,k=0; k=0; i++,k++)
        k++;
 return 0;
}

这里循环0次。
因为这里我们的初始化部分i=0,k=0;而我们条件部分是k=0是一个赋值操作,这个时候k就等于0,0为假就跳出循环。

2. do……while()循环

2.1 do语句的语法

do
	循环语句;
while(条件表达式);

2.2 do语句的特点

循环至少执行一次,使用的场景有限,所以不是经常使用。

#include <stdio.h>
int main()
{
 	int i = 1;
 	do
 	{
 		printf("%d ", i);
        i=i+1;
 	}while(i<=10);
 	return 0;
}

这里我们同样可以打印出1-10;

2.3 do while循环中的break和continue

#include <stdio.h>
int main()
{
 	int i = 1;
 	do
 	{
 		if(i==5)
 			break;
 		printf("%d ", i);
        i=i+1;
 	}while(i<=10);
 	return 0;
}

在这里插入图片描述
同样是跳过了5;

#include <stdio.h>
int main()
{
    int i = 1;
    do
    {
        if (i == 5)
            continue;
        printf("%d ", i);
        i = i + 1;
    } while (i <= 10);
    return 0;
}

在这里插入图片描述
我们发现死循环了,那是因为我们continue是回到头部,这个时候就不进行我们的条件语句i++
所以i就一直等于5为真就一直打印下去了。

3.练习

  1. 计算n的阶乘。
#include <stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    int i = 0;
    int sum = 1;
    for (i = 1; i <= n; i++)
    {
        sum = sum * i;
    }
    printf("%d", sum);
    return 0;
}
  1. 计算1!+2!+……10!阶乘的和。
#include <stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    int i = 0;
    int j = 0;
    int sum2 = 0;
    for (j = 1; j <= n; j++)
    {
        int sum = 1;
        for (i = 1; i <= j; i++)
        {
            sum = sum * i;
        }
        sum2 += sum;

    }
    printf("%d", sum2);
    return 0;
}

优化

#include <stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    int i = 0;
    int j = 0;
    int sum2 = 0;
    for (j = 1; j <= n; j++)
    {
        sum = sum * j;
        sum2 += sum;
    }
    printf("%d", sum2);
    return 0;
}
  1. 在一个有序的数组中查找具体的某个数字n。
#include <stdio.h>
int main()
{
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    int i = 0;
    int k = 5;
    int flag=0;
    for (i = 0; i < 10; i++)
    {
        if (arr[i] == k)
        {
            printf("找到了,下标是%d", i);
            flag=1;
        }
    }
    if(flag==0)
    	printf("没找到");
    return 0;
}

二分查找法(折半查找法)

int main()
{
	int arr[] = {1,2,3,4,5,6,7,8,9,10};
	int left = 0;
	int right = sizeof(arr)/sizeof(arr[0])-1;
	//sizeof是计算的字节数,这里sizeof(arr)是计算这个数组的字节数我们除于首元素的大小就得到了数组的个数。
	int key = 7;
	int mid = 0;
	while(left<=right)
	{
		mid = (left+right)/2;
		if(arr[mid]>key)
		{
			right = mid-1;
		}
		else if(arr[mid] < key)
		{
			left = mid+1;
		}
		else
			break;
	}
	if(left <= right)
		printf("找到了,下标是%d\n", mid);
	else
		printf("找不到\n");
}
  1. 编写代码,演示多个字符从两端移动,向中间汇聚。
#include <stdio.h>
#include <string.h>
int main()
{
    char s1[] = "*********************";
    char s2[] = "abcdefghijklmnopqrstu";
    int left = 0;
    int right =strlen(s2) - 1;
    printf("%s\n", s1);
    while (left <= right)
    {
        s1[left] = s2[left];
        s1[right] = s2[right];
        printf("%s\n", s1);
        left++;
        right--;
    }
    return 0;
}

优化:
如果我们想要子我们的显示屏上展示出动态的效果该怎么办呢?

#include <stdio.h>
#include <string.h>
#include<windows.h>
int main()
{
    char s1[] = "*********************";
    char s2[] = "abcdefghijklmnopqrstu";
    int left = 0;
    int right =strlen(s2) - 1;
    printf("%s\n", s1);
    while (left <= right)
    {
        s1[left] = s2[left];
        s1[right] = s2[right];
        printf("%s\n", s1);
        Sleep(1000);
        system("cls");
        left++;
        right--;
    }
    printf("%s",s2);
    return 0;
}

这里介绍三个个函数:
1.Sleep()睡眠函数,单位毫秒。头文件#include<windows.h>
2…system(“cls”) // system函数是可执行命令,cls是清理屏幕的命令
3.strlen计算字符串长度的函数,头文件#include<string.h>

这里要注意的是我们计算字符串的长度的时候不能用sizeof计算,因为我们字符串是包含了\0的但是字符串长度是不计算\0 的,而我们的sizeof是会把\0 的大小计算进去的。

  1. 编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。
#include <stdio.h>
#include <string.h>
int main()
{
    int i = 0;
    int flag=0;
    char password[20] = { 0 };
    for (i = 0; i < 3; i++)
    {
        printf("输入密码");
        scanf("%s", password);
        if (strcmp(password, "123456") == 0)
        {
            printf("登录成功\n");
            flag=1;
        }
        else
        {
            printf("密码错误\n");
        }
    }
    if(flag=0)
    {
    	printf("退出程序");
    }
    return 0;
}

这里又得引入一个函数:字符串比较函数。
当我们比较两个字符串是否相等的时候不能直接用等号判断,而是要用专门的字符串比较函数
strcmp(exp1,exp2)头文件是#include<string.h>
他的特点是:
如果exp1==exp2,返回0;
如果exp1>exp2,返回大于0的数;
如果exp1<exp2,返回小于0的数;

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

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

相关文章

Python多线程慎用shutil.make_archive打包

Python多线程慎用shutil.make_archive打包 记一下在工作中遇到一个错误&#xff0c;先说一下结论shutil.make_archive是线程不安全的&#xff0c;要慎重使用&#xff01;&#xff01;&#xff01; 参考&#xff1a;https://stackoverflow.com/questions/41625702/is-shutil-mak…

【C++】从C语言入门C++的基础知识

C基础知识 前言1. C关键字2. 命名空间namespace命名空间的创建命名空间的使用命名空间的注意事项 3. C输入&输出4. 缺省参数概念分类全缺省参数半缺省参数 5. 函数重载概念实现C为什么能进行函数重载C和C的相互调用&#xff08;可以不用看&#xff09; 6. 引用概念注意事项…

相参积累

原理 在探测远距离目标时&#xff0c;由于目标回波信号比较微弱&#xff0c;信号幅度很小&#xff0c;从而导致接收信号的信噪比&#xff08;SNR&#xff09;过低&#xff0c;以至于信号处理算法检测不到目标&#xff0c;从而发生漏检。 在脉冲体制雷达中&#xff0c;雷达系统…

Oracle创建物化视图

Oracle创建物化视图 物化视图的语法物化视图的创建关于手动刷新创建手动刷新的物化视图 查看物化视图删除物化视图 物化视图的语法 物化视图的创建语法&#xff0c;如下所示&#xff1a; create materialized view [view_name] [ build immediate | build deferred ] [ refre…

LRU算法和LFU算法

LRU&#xff08;Least Recently Used&#xff09;最近最少使用&#xff0c;淘汰最近最少使用的数据&#xff0c; LFU&#xff08;Least Frequently Used&#xff09;最近最不频繁用&#xff0c;淘汰最不常用的数据。 LRU算法 传统的LRU基于链表实现。基本的一个LRU算法实现就…

Opencv 基本操作八 不均匀光照下的图像二值化探讨

在进行图像二值化时总是存在一些明部、暗部的干扰&#xff0c;单一的使用opencv提供的原始二值化方法很难做到预期效果。一般我们都会采用分块二值化&#xff08;将图像切为多个局部进行二值化&#xff09;、对比度提升&#xff08;对值域进行线性或者非线性变换、直方图均衡化…

C#串口通信从入门到精通(2)——串口相关参数介绍

1、端口号&#xff08;Port&#xff09; 我们使用一个串口的时候&#xff0c;首先是要打开这个串口&#xff0c;那么我们怎么知道电脑上现在支持几个串口呢&#xff1f;对应的端口号又是什么呢&#xff1f; 由于我的电脑系统是window11&#xff0c;下面就以window11为例介绍如…

网络请求实战-缓存、缓存清理和HTTP缓存

目录 缓存介绍 清空策略&#xff08;FIFO&#xff09; 实战&#xff1a;fifo的memory函数 实战&#xff1a;LRU算法 HTTP缓存 Cache-Control 强制缓存 协商缓存 协商缓存-2&#xff08;用的最多的&#xff09; 小结 缓存介绍 早期cpu&#xff0c;内存设计上都有缓存…

开发常用的 Linux 命令4(系统、进程和其它)

开发常用的 Linux 命令4&#xff08;系统、进程和其它&#xff09; 作为开发者&#xff0c;Linux是我们必须掌握的操作系统之一。因此&#xff0c;在编写代码和部署应用程序时&#xff0c;熟练使用Linux命令非常重要。这些常用命令不得不会&#xff0c;掌握这些命令&#xff0…

【JUC】volatile和JMM

【JUC】volatile和JMM 文章目录 【JUC】volatile和JMM1. volatile1.1 特点1.2 内存语义 2. 内存屏障2.1 分类2.2 什么叫保证有序性&#xff1f;2.3 内存屏障的4种插入策略 3. volatile特性3.1 保证可见性3.2 volatile读写过程3.3 没有原子性3.4 指令禁重排(有序性) 4. 正确使用…

python标识符概念及规范

在python中 能取名字的东西非常非常多 例如 我们之前学的变量 以及后面要接触的 函数 类&#xff0c;等等&#xff0c;等等 而我们给这些取的名字 被统称为 标识符 而 python中 标识符的命名也是有限制的 主要有三种 1 内容限定 2 大小写铭感 3 不能使用关键字 内容限定来讲…

leetcode6_N字形变换

如有错误&#xff0c;感谢不吝赐教、交流 leetcode6 题目描述 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时&#xff0c;排列如下&#xff1a; P A H N A P L S I…

HTB-SecNotes

HTB-SecNotes 信息收集8808端口80端口通过CSRF获取通过二次注入 立足tyler -> administrator 信息收集 8808端口 Windows IIS 10.0 可以从官方文档查看10.0版本可能的操作系统。 80端口 通过CSRF获取 目录扫描发现需要登陆后继续进一步操作啊。 对其进行简单的SQL注入测…

数据库基础篇 《7.单行函数》

目录 1. 函数的理解 1.1 什么是函数 1.2 不同DBMS函数的差异 ​编辑1.3 MySQL的内置函数及分类 ​编辑 2. 数值函数 2.1 基本函数 ​编辑 2.2 角度与弧度互换函数 2.3 三角函数 ​编辑 2.4 指数与对数 ​编辑 2.5 进制间的转换 ​编辑3. 字符串函数 ​编辑…

SAM(segment anything model)分割一切 Demo测试及API调用

SAM 分割一切 一&#xff0c;SAM介绍1.1 介绍1.2 项目链接 二&#xff0c;Demo-Test&#xff1a;2.1 Demo功能介绍2.1.1&#xff0c;首页就是这个SAM&#xff0c;点击try demo&#xff0c;可以选择它的自带图片&#xff0c;也可以自己添加。2.1.2 , 自己上传图片测试&#xff1…

[java基础]面向对象(五)

访问控制修饰符&#xff1a;--------------保护数据的安全(隐藏数据、暴露行为)&#xff0c;实现封装 public&#xff1a;公开的&#xff0c;任何类 private&#xff1a;私有的&#xff0c;本类 protected&#xff1a;受保护的&#xff0c;本类、派生类、同包类 默认的&…

learn_C_deep_3 (最名不符实的关键字 - static、static关键字总结、基本数据类型、最冤枉的关键字 - sizeof)

目录 最名不符实的关键字 - static stati修饰全局变量和函数 static修饰局部变量 static关键字总结 几个问题 1.c语言要设置全局变量和函数可以跨文件使用的原因 2.C程序地址空间是什么样的&#xff1f; 3.局部变量为什么具有临时性 4.全局变量为什么具有全局性 5.为…

vue-cli版本号始终是2.9.6,且无法删除,安装更新无效的问题。

参考博客 目录 1.问题出现原因2.我的解决办法&#xff1a;删除原脚手架&删除原vuevue.cmd 1.问题出现原因 从各种博客我得知&#xff0c;这种问题出现在2处&#xff1a; 没有卸载原来的脚手架原来的vue和vue.cmd没删除干净 2.我的解决办法&#xff1a;删除原脚手架&…

[oeasy]python0135_命名惯用法_name_convention

命名惯用法 回忆上次内容 上次 了解了isidentifier的细节 关于 关键字关于 下划线 如何查询 变量所指向的地址&#xff1f; id 如何查询 已有的各种变量&#xff1f; locals 如果 用一个变量a的值 给另一个变量b 赋值是什么样的过程 呢&#xff1f;&#xff1f;&#x1f914;…