首页 > 其他分享 >学习C语言的第六天

学习C语言的第六天

时间:2023-09-19 23:32:48浏览次数:25  
标签:10 arr 下标 int mid C语言 学习 第六天 循环

先说下今天的心情吧,今天看的课感觉真的是开始上难度了,有一些逻辑复杂的地方要把视频反复看四五遍才能明白,不知道我这种笨蛋能不能学好C语言。。。还是对自己得有点信心,肯定能学好!下面是今天的内容啦!

For循环

之前不是很明白for循环和while循环的区别,这两天在chatgpt刨根问底了一下,总结来说,for循环更适合在已知循环次数时使用,while更适合在未知循环次数下使用;而且,for循环有个好处,就是它初始化、判断、调整的部分都在一起,如for(int i = 0; i < 10; i++)

而while的初始化、判断、调整部分可能是分散开的,如果后续需要在循环内添加语句,可能不太好找这三部分的具体位置。

for循环体内不可以修改循环变量,为防止for循环失去控制,比如:

int i = 0;
for (i = 0; i < 10; i++)
{
    if(i = 5)  //这里一个“=”是赋值,而不是判断
         printf("哈哈\n");
     printf("呵呵\n");
}

这段代码运行起来打印的是无数个呵呵和哈哈,for失去控制。

for循环的初始化、判断、调整都是可以省略的,但是,如果判断部分被省略,那么判断的条件就会恒为真,比如:

for ( ; ; )  //省略了判断
{
   printf("呵呵\n");
}

此时打印出无数个呵呵,因为条件为真就会一直重复进入循环。

一道面试题

这个循环中循环了几次,答案:0次

int main()

{
int i = 0;
int k = 0;
for (i = 0, k = 0; k = 0; i++, k++)//一个“=”是赋值
{
   k++;
}
return 0;
}

第五行for循环里的内容,这里反复看了好几遍,一直觉得把0赋值给了K,那K不就是等于0吗,等于0不就是真命题吗,不就该进入循环吗……

后来才弄明白不对,for循环第二部分应该是判断, 但是这里把0赋值给了K,而0表示是假,非0才表示为真,此时0为假,所以不进入循环

二分查找算法

这里看视频觉着不难,但是有点绕,弹幕里有一条说二分查找算法是所有算法里最简单的……妈呀,最简单的都这么复杂,那以后学的得多复杂啊。。。

二分查找算法,就是说,比如我定义了一个数组

char arr[10] = {1,2,3,4,5,6,7,8,9,10};

然后我想找数字7对应的下标是几,此时我们最坏的情况是第十次找到数字7,

而如果我们第一个数找中间的数,也就是5,因为7大于5,所以我们要找的7在5的右边,这时候只需要在6到10之间去找我们要的数,以此类推,我们最坏的情况是第四次就能找到7,这种方法就叫二分查找算法,例如:

#include<stdio.h>
int main()
{
 char arr[10] = {1,2,3,4,5,6,7,8,9,10};
 int k = 7;
 int sz = = sizeof(arr)/sizeof(arr[0]); //计算元素个数
 int lift = 0;//左下标为0,代表数字1
 int right = sz-1;
 
 while(lift < right)  //当左下标小于右下标才进入循环
 {
  int mid = (lift + right)/2;
  if (arr[mid] > k)
  {
     right = mid-1;  //新的右下标变成mid左边的值
  }
  else if (arr[mid] < k)
  {
     lift = mid+1;  //新的左下标变成mid右边的值
  }
  else
  {
     printf("找到了,下标是:%d\n",mid);
     break;
  }
 }
 if (lift > right)
  {
     printf("找不到")
  }
 return 0;
}

计算n的阶乘

#include<stido.h>
int main()
{
 int i = 0;
 int n = 0;
 int ret = 1;  //这里不能等于0
 scanf("%d",&n);
 for (i=1; i <= n; i++)
  {
   ret = ret * i;  //上面如果让ret=0的话,这里就是0乘以i,结果还是0
  }
 printf("结果是:%d",ret);
 return 0;
}

标签:10,arr,下标,int,mid,C语言,学习,第六天,循环
From: https://blog.51cto.com/u_16263798/7530377

相关文章

  • 学习的目的是什么?
    学习的目的不该是踩低别人彰显自己,也不是为了争口气证明什么,更不该是找份工作仅仅为稻梁谋。学习是利用已有的知识和技能,丰富自己,帮助自己更好的理解这世界;完善自己,帮助自己开拓进取;升华自己,使自己在生活的苟且之余能仰望星空;贡献自己,力争为人类的文明和进步付出自己应有的一份力量......
  • 马毅教授新作:白盒ViT成功实现分割涌现,经验深度学习时代即将结束?
    前言 CRATE模型完全由理论指导设计,仅用自监督学习即可实现分割语义涌现。本文转载自新智元仅用于学术分享,若侵权请联系删除欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。CV各大方向专栏与各个部署框架最全教程整理【CV技......
  • Vue学习八:vue3
    一、vue3创建项目与介绍vue3创建项目与vue2使用vue-cli(基于webpack)脚手架不同,vue3使用create-vue(基于vite,更快)。创建项目的指令如下,首先看一下node的版本(node-v),16以上才支持。第一次创建项目会去下载create-vue比较慢,等一会就好了。npminitvue@latest然后关掉命令行,重新......
  • SQL语句的入门学习运用
    查看版本mysql-Vselectversion();查看帮助信息mysql--help 或者mysql-?登录mysql-hIP地址-p端口-u用户名-p密码说明:-hIP地址:连接到指定ip的数据库-p端口:需要连接数据库对应的端口(一般是3306)-u用户名:需要登录的用户名的密码-p密码:用户名登录数据库的密码列如:mysql-hlocaho......
  • 基于wsl的ubuntu vscode调试环境搭建--Apple的学习笔记
    一,前言正好在网上搜索文章的时候看到了wsl,我想起来它也是一个虚拟机环境,所以我要用用,没想要一用,感觉比vmware还要方便。二,环境搭建A,在wsl中安装ubuntu1.     首先打开powershell 输入命令wsl--list–online,来查看支持安装的ubuntu版本。 注意:若提示连接超时,则是自动ip......
  • 【学习笔记】(27) 整体 DP
    1.算法简介整体DP就是用线段树合并维护DP。有一些问题,通常见于二维的DP,有一维记录当前x的信息,但是这一维过大无法开下,O(nm)也无法通过。但是如果发现,对于x,在第二维的一些区间内,取值都是相同的,并且这样的区间是有限个,就可以批量处理。所以我们就可以用线段树来维护DP。......
  • NTT(快速数论变换)学习
    回顾:FFTFFT(快速傅立叶变换)学习-Isakovsky-博客园(cnblogs.com)目的:将多项式的系数表示法形式转换为点值表示法形式,或者说,快速计算出多项式在若干个点上的值.中心思想:适当地选取自变量,使得自变量两两互为相反数,求出的多项式值可重复利用,减少运算次数例如上面那篇......
  • MySQL学习03
    一、自动增加字段设置了自动步长字段,可以不用手动插入值,由系统提供的默认值和默认的步长自动增加,例如学号字段要求:1、只有主键才能设置2、只有数值型字段3、一张表最多只能设置一个设置方法:createtable表名(字段类型primarykeyauto_increment);设置初始值:1、......
  • Go项目学习(2)-viper
    前言GitHub地址Api地址详细教程可直接参考Github,已经很详细了,这里只进行简单入门知识总结。介绍用来获取配置,配置可来自flag、环境变量、配置文件、远程配置……获取配置的优先级:Set,flag,env,config,key/valuestroe,default。配置项的值可以直接通过Viper中一系列get函数获取,......
  • 每日学习之phoenix快速入门
    1.建表语句createtableifnotexists表名(ROWKEY名称数据类型primarykey,列簇名.列名1数据类型NOTNULL,列簇名.列名2数据类型NOTNULL,列簇名.列名3数据类型,列簇名.列名4数据类型);2.删除表droptableifexists表名;3.插入数据up......