gcc环境下演示C语言变长数组

news2024/11/20 1:42:49

前言
👻作者龟龟不断向前
👻简介宁愿做一只不停跑的慢乌龟,也不想当一只三分钟热度的兔子。
👻专栏:C++初阶知识点

👻工具分享

  1. 刷题: 牛客网 leetcode
  2. 笔记软件:有道云笔记
  3. 画图软件:Xmind(思维导图) diagrams(流程图)

在这里插入图片描述

如果觉得文章对你有帮助的话,还请点赞,关注,收藏支持博主🙊,如有不足还请指点,博主及时改正

分支与循环(一)–分支篇

课前扩展–变长数组(gcc演示)

课前小扩展

之前文章中我们在初识C语言中讲了数组的定义方法,元素个数要必须是常量

在这里插入图片描述


不过 C99标准提出了变长数组 ,即我们可以用变量来定义一个数组

但是vs编译器下是不支持的,无论是vs2013还是vs2022,咱们用linux下的gcc编译器进行演示一下

编辑器选择的是编辑器界的天花板vim

在这里插入图片描述

由于变长数组和**for(int i = 0)(在循环里面定义i)**,是C99提出的,所以咱们使用gcc编译时要加一句-std=c99

不然会报以下的错误

在这里插入图片描述

正确的解决方法:

在这里插入图片描述


1.if语句

单分支if

咱们主要通过流程图的方式来讲解,画图工具在最前面已经推荐。

在这里插入图片描述

#include<stdio.h>

//单分支
int main()
{
  int age = 0;
  scanf("%d",&age);
  if(age >= 18)
  {
      printf("成年\n");
  }
  return 0;
}

这样给大家讲解一下,计算机是如何判断真假的,我们人可以看真/假,yes/no,点头/摇头,但是计算机可没有这么多的理解方式

计算机将0判断为假,非0判断为真

例如上述的age如果是16,将age>=18的值为0,计算机识别0–为假,不执行if里面的语句,结束


双分支if-else

​ 如果我们想达到以下的效果。

在这里插入图片描述

#include<stdio.h>

//双分支
int main()
{
  int age = 0;
  scanf("%d",&age);
  if(age >= 18)
  {
    printf("成年\n");
  }
  else
  {
    printf("未成年\n");
  }
  return 0;
}


多分支if-else if-else

else if的原理其实是if语句的嵌套

20岁以上都叫叔叔,阿姨

在这里插入图片描述

在这里插入图片描述

#include<stdio.h>

//多分支
int main()
{
  int age = 0;
  scanf("%d",&age);
  if(age <=16)
  {
    printf("少年\n");
  }
  else if(age >= 16 && age <= 20)
  {
    printf("青少年\n");
  }
  else
  {
      printf("叔叔\n");
  }
  return 0;
}

当然了也可以实现更多的分支,为了方便表示,咱们不再细画流程图

在这里插入图片描述

#include<stdio.h>

int main()
{
  int age = 0;
  while(scanf("%d",&age)!=EOF)//这里使用多组测试,只是为了好测试
  {

      if(age < 16)
      {
        printf("少年\n");
      }
      else if(age >= 16 && age < 30)
      {
        printf("青年\n");
      }
      else if (age >=30 && age < 40)
      {
        printf("中年\n");
      }
      else if(age >= 40 && age < 56)
      {
        printf("壮年\n");
      }
      else if(age >= 56 && age < 80)
      {
        printf("老年\n");
      }
      else 
      {
        printf("老寿星\n");
      }
  }
  return 0;
}

在这里插入图片描述


2.那些不好的if代码风格

悬空else

大家可以思考一下下面代码输出什么,来看看自己的分支学的是否到位了

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
        if(b == 2)
            printf("hehe\n");
    else
        printf("haha\n");
    return 0;
}

答案是:什么都不输出,你答对了吗?(如果不相信可以ctrl+cctrl+v到自己的编译器下面进行测试)写出一个良好的代码风格你就理解了

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
    {
        if(b == 2)
            printf("hehe\n");
    	else
        	printf("haha\n");
    }
    return 0;
}

if-else语句算一个语句,都会被算进if(a == 1)的区域里面

在没加{}的情况,判断else到底是和谁匹配的:else与最近的未配对的if进行匹配就近原则


如果非要达到输出haha的效果,可以这样写

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
    {
        if(b == 2)
            printf("hehe\n");
    }
    else
        printf("haha\n");
    return 0;
}

以后还是建议写if-else语句加上{}


效果一样,风格差异的if语句对比

示例1:

//代码1
if (condition) 
{
    return x;
}
return y;

//代码2
if(condition)
{
    return x;
}
else
{    
    return y;
}

上述代码1会让一些同学默认为是return y是必执行的,但是其实效果和代码2是一致的,这个涉及到函数的返回值问题


示例2:

//代码3
int num = 1;
if(num == 5)
{
    printf("hehe\n");
}

//代码4
int num = 1;
if(5 == num)
{
    printf("hehe\n");
}

咱们建议使用代码4,一个变量与一个常量比较是否相等,建议使用下面的写法,因为很多同学,相信也有在场的各位,很容易把==不小心写成了=,最后的结果你有可能对了,但是逻辑上是天差地别的。

因为num = 5–这个表达式的值是5,即条件判断一直为真,无论num是否为5都会输出hehe

大家可以思考一下下面程序输出什么?

#include<stdio.h>

int main()
{
	int i = 0;
	for (i = 0; i < 10; ++i)
	{
		if (i = 5)
		{
			printf("%d ", i);
		}
	}
	return 0;
}

在这里插入图片描述

答案是:死循环的输出5,场面一度混乱,就是因为i = 5改变了i,影响了循环的迭代条件

如果将5写在左边,i写在右边,就会让自己意识到了if(5 = num)这个是编译不过的,会让你意识到是不是==泄露了一个=


3.if-else的例题

判断奇数

偶数–可以被2整除,奇数–不能被2整除

所以操作符%取模就派上用场了

#include<stdio.h>

int main()
{
    int num = 0;
    printf("请输入一个数\n");
    while(scanf("%d",&num)!=EOF)
    {
      
        if(num % 2 != 0)
        {
          printf("奇数\n");
        }
        else
        {
          printf("偶数\n");
        }
        printf("请输入一个数\n");
    }

    return 0;
}

打印1-100的奇数

在第一个问题的基础上外加一个循环即可

#include<stdio.h>

int main()
{
    //方法1
  for(int i = 1;i<=100;++i)
  {
    if(i%2!=0)
    {
      printf("%d ",i);
    }
  }
  printf("\n");

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

逢7游戏

游戏规则:同学们依次从1数到100,其中遇到7的倍数,或者数位中带有7的数字都不能说出了

否则就输掉了比赛。==continue关键字是,跳过本次循环,进入下一次循环

#include<stdio.h>

#define M 100
int main()
{
  //十位--/10%10
  //个位--%10
  for(int i = 1;i<=M;++i)
  {
    if(i % 7 ==0)
    {
      continue;
    }
    if(i % 10 == 7)
    {
      continue;
    }
    if((i/10)%10==7)
    {
      continue;
    }
    printf("%d ",i);
  }
  return 0;
}

判断最大公因数

相信大家小学就学过求最大公因数的方法,但是计算机可不是适合每一种方法,可能你觉得简单的使用计算机去实现反而不方便

我们将计算机理解成一个笨笨的但是计算能力极强的铁块,适合做那些无脑的重复计算事情

那么数学中还存在着一种方法叫做辗转相除法

在这里插入图片描述

#include<stdio.h>

int main()
{
  //辗转相除法求最大公因数
  int m,n;
  scanf("%d %d",&m,&n);
  if(m < n)
  {
    swap(&m,&n);
  }
  int r = m%n;
  while(r)
  {
    m = n;
    n = r;
    r = m%n;
  }
  printf("最大公因数为:%d\n",n);
  return 0;
}

4.switch语句

语法介绍

if语句的特性使得其在多分支的时候会显得比较绕,一般建议在分支比较多的情况下尽量少用if语句

C语言还提供switch语句,也可以实现分支,通过switch里面的值,确定之后的入口,向下执行

图片解释

在这里插入图片描述

#include<stdio.h>

int main()
{
	int input = 0;
	scanf("%d", &input);
	switch (input)
	{
	case 1:
		printf("星期一\n");
	case 2:
		printf("星期二\n");
	case 3:
		printf("星期三\n");
	case 4:
		printf("星期四\n");
	case 5:
		printf("星期五\n");
	case 6:
		printf("星期六\n");
	case 7:
		printf("星期天\n");
	default://当没有找到入口,就走这一条
		printf("输出错误\n");
	}
	return 0;
}

但是非常可惜,程序运行结构还是不如意

在这里插入图片描述

很明显,小人将入口后面的内容都走了一遍,所以咱们得让小人在适当时刻停下来

break-推出switch语句

#include<stdio.h>

int main()
{
  int input = 0;
  scanf("%d",&input);
  switch(input)
  {
    case 1:
      printf("星期一\n");
      break;
    case 2:
      printf("星期二\n");
      break;
    case 3:
      printf("星期三\n");
      break;
    case 4:
      printf("星期四\n");
      break;
    case 5:
      printf("星期五\n");
      break;
    case 6:
      printf("星期六\n");
      break;
    case 7:
      printf("星期天\n");
      break;
    default:
      printf("输出错误\n");
      break;//可有可无
  }
  return 0;
}

在这里插入图片描述


语法小细节

switch后面只能跟整形表达式

case后面只能跟整形常量表达式

在这里插入图片描述


那些不需要break的情况

在这里插入图片描述

#include<stdio.h>
int main()
{
  int input = 0;
  scanf("%d",&input);
  switch(input)
  {
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
      printf("工作日\n");
      break;
    case 6:
    case 7:
      printf("休息日\n");
      break;
    default:
      printf("选择错误\n");
  }
  return 0;
}

5.编程好习惯

if语句后面尽量根据需求加上{}

case:结束后加上break

本篇文章就到这,咱们下期间!

点赞

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

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

相关文章

安全帽佩戴识别算法

安全帽佩戴识别算法采用SuiJi-AI人工智能深度学习技术计算机智能视觉识别算法&#xff0c;且通过规模化的安全帽数据识别训练。安全帽佩戴识别算法借助现场已有的监控摄像头对监控画面中人员着装行为进行实时分析识别。假如检测人员不戴安全帽&#xff0c;SuiJiAi将立即记录和警…

致敬第一个1024(第一次Java代码编程)

昨日&#xff0c;笔者刚刚下载好IDEA&#xff0c;今日&#xff0c;笔者将会实现第一次的Java代码&#xff01;&#xff01;信心满满&#xff01;&#xff01;下面请看笔者的代码吧&#xff01;&#xff01;骄傲的小心&#xff0c;已经澎湃&#xff01; 因此&#xff0c;本篇文…

如何实现一个SQL解析器

作者&#xff1a;vivo 互联网搜索团队- Deng Jie 一、背景 随着技术的不断的发展&#xff0c;在大数据领域出现了越来越多的技术框架。而为了降低大数据的学习成本和难度&#xff0c;越来越多的大数据技术和应用开始支持SQL进行数据查询。SQL作为一个学习成本很低的语言&#…

【正点原子I.MX6U-MINI应用篇】5、嵌入式Linux在LCD上显示BMP、JPG、PNG图片

一、BMP图像介绍与显示 我们常用的图片格式有很多&#xff0c;一般最常用的有三种&#xff1a;JPEG(或 JPG)、PNG、BMP和GIF。其中 JPEG(或JPG)、PNG以及 BMP 都是静态图片&#xff0c;而 GIF 则可以实现动态图片。 BMP(全称 Bitmap)是Window操作系统中的标准图像文件格式&am…

计算机学院第五次ACM周赛题解

目录 HF的智能小车车 Do you like Van game&#xff1f; 好姐姐的三角形 帮帮小陈 卷点 签个到就下班 现在是摸鱼时间 现在是摸鱼时间 PLUS HF的智能小车车 签到题目&#xff0c; #include<iostream>using namespace std;int main() {string arr;cin>>ar…

学生会信息管理系统

1、项目介绍 学生会信息管理系统拥有两种角色&#xff1a;学生和管理员 学生&#xff1a;查看活动和新闻信息、发布活动、登录注册 管理员&#xff1a;公共新闻管理、用户管理、活动审核等 2、项目技术 后端框架&#xff1a; Servlet、mvc模式 前端技术&#xff1a;jsp、c…

Linux(centos)安装Jenkins

Jenkins 是一个开源的, 基于Java的自动服务器&#xff0c;提供了一种建立持续集成和持续交付(CI/CD)流水线的简单方法 。 持续集成 (CI)是DevOps实践中&#xff0c;团队成员定期将他们的代码更改提交到版本仓库, 然后运行自动化的构建和测试. 持续交付(CD)是自动构建、测试和部…

【附源码】计算机毕业设计SSM物业管理系统设计

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

第九章 Ambari二次开发之自定义Flink服务 -- 自定义quiklinks链接

1、自定义quiklink链接功能概述 主要功能&#xff1a;用来配置第三方服务界面链接&#xff0c;如Yarn的管理界面。 服务可以通过在metainfo中加入一串quicklink的引用&#xff08;一串预定义的JSON字符串&#xff09;即可。ambari server能解析json文件并将其提供给UI&#xff…

CSS 2 CSS 选择器 - 2 2.5 属性选择器

CSS 文章目录CSS2 CSS 选择器 - 22.5 属性选择器2.5.1 CSS [attribute] 选择器2.5.2 CSS [attribute"value"] 选择器2.5.3 CSS [attribute~"value"] 选择器2.5.4 CSS [attribute|"value"] 选择器2.5.5 CSS [attribute^"value"] 选择器…

渠道数字化有什么好处?如何实现渠道数字化营销?

数字化转型是企业如今谋求商业升维的一种主要方式&#xff0c;即利用数字化技术和能力来赋能企业经营思维数字化、商业模式创新化&#xff0c;达到业务重构升级、实现业务的转型、创新&#xff0c;增长的目的。对于企业而言&#xff0c;数字化其实正是升维企业业务、企业流程及…

【电子通识】为什么高速信号传输要用差分

早期很多设备要接到计算机上,需要通过一些线径粗连接器笨重的总线。如GPIB接口(通用接口总线)是曾经大多台式仪器与计算机相连接的方式。 在文章:【蓝牙专题】蓝牙测试工具及性能标准 中,电脑就是通过USB转GPIB接口与MT8852进行连接,对低功耗蓝牙模块进行测试。 …

稳压二极管有什么特性?稳压二极管的特点

笔者电子信息专业硕士毕业&#xff0c;获得过多次电子设计大赛、大学生智能车、数学建模国奖&#xff0c;现就职于南京某半导体芯片公司&#xff0c;从事硬件研发&#xff0c;电路设计研究。对于学电子的小伙伴&#xff0c;深知入门的不易&#xff0c;特开次博客交流分享经验&a…

Java泛型——帮助你更好的读懂源码<dog>

泛型 泛型就相当于集合的标签&#xff0c;我们在使用集合<>的时候&#xff0c;就是在使用泛型 要知道的是在jdk1.5以前我们只能把集合中的元素设计为Object&#xff0c;之后引入了泛型的概念来解决&#xff0c;我们把元素的类型设计成一个参数&#xff0c;这个类型参数…

【PyTorch深度学习项目实战100例】—— Pytorch时间序列电力数据多输出预测 | 第70例

前言 大家好,我是阿光。 本专栏整理了《PyTorch深度学习项目实战100例》,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmPy…

1024 你学算法了吗?

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

JUC - 多线程之 单例模式(八)

单例模式&#xff08;Singleton Pattern&#xff09;是一种非常简单的设计模式之一&#xff0c;当我们使用的对象要在全局唯一时就需要用到该模式&#xff0c;以保证对象的唯一性。除此之外&#xff0c;还能避免反复的实例化对象&#xff0c;减少内存开销 单例类提供了一种访问…

踩坑记录——USB键盘睡眠唤醒

踩坑记录——USB键盘睡眠唤醒 目录踩坑记录——USB键盘睡眠唤醒前言1 USB远程睡眠唤醒要注意的几个点2 MCU唤醒之后引起USB异常的几个点结束语前言 前段时间我用一个国产MCU实现了雷蛇键盘的效果&#xff0c;按键支持十键无冲&#xff0c;RGB灯支持单控任意一个灯任意一种颜色…

SpringAMQP (RabbitMQ五种模式 消息转换器)

一、简化Hello World模型实现步骤演示 代码步骤演示如下所示&#xff1a; 消息提供者publisher代码简化&#xff1a; 消息消费者consumer代码简化&#xff1a; 二、Work Queue 工作队列模型 消息提供者代码如下所示&#xff1a; 消息消费者代码如下所示&#xff1a; 消息…

SpringCloudAlibaba【六】微服务架构下的秒杀案例

背景 分布式微服务中的秒杀是怎么实现的呢&#xff1f;接着看下去吧 我们实现一个秒杀微服务&#xff0c;流程逻辑如下 项目搭建 MySQL create database if not exists demo;use demo;drop table if exists skill_goods;create table if not exists skill_goods (id bigint…