C learning_6

简介: C learning_6

语句的种类


1.表达式语句:表达式语句是指一个表达式后面跟随一个分号的语句。

#include<stdio.h>
int main()
{
  3 + 5;//表达式语句
  return 0;
}


2.函数调用语句:函数调用语句是指一个函数调用语句后跟随一个分号的语句

#include<stdio.h>
int main()
{
  printf("hello\n");//表达式语句
  return 0;
}


3.控制语句


4.复合语句:复合语句(也称为代码块)是指在一对花括号 {} 中包含的一系列语句。

#include<stdio.h>
int main()
{
  {
  }
  //复合语句
  return 0;
}


5.空语句:空语句是指不包含任何可执行语句的语句。

#include<stdio.h>
int main()
{
  ;
  //空语句
  return 0;
}


这里我们着重讲解控制语句。


       控制语句是一种编程语言中用来控制程序执行流程的语句。它可以通过改变程序的执行顺序、跳转到指定代码块和重复执行一段代码等,来实现程序的各种控制需求。控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序结构、选 择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。


可分成以下三类:


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

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

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


C语言:结构化是程序设计语言


顺序结构:


       顺序结构是一种程序控制结构,它按照代码书写的先后顺序依次执行每个语句。顺序结构是编程中最基本、最基础的结构,几乎所有的程序都包含顺序结构。


顺序结构中的代码会按照书写顺序顺次执行,没有任何条件、跳转或分支的控制。顺序结构通常用于执行一组逻辑上有序的指令序列,例如从文件中读取数据、对数据进行处理、将结果输出到屏幕等。

以下是一个简单的顺序结构示例,它实现了对两个数相加的操作:


       int a = 2;

       int b = 3;

       int c = a + b;

       printf("The result is: %d\n", c);


在上面的代码中,变量 a 和 b 分别赋值为 2 和 3,然后使用加号运算符将它们相加,将结果保存到变量 c 中。最后,使用 printf 函数输出变量 c 的值到屏幕上。


顺序结构是一种非常基础的编程结构,它通常是编写任何复杂程序或算法的基础。在编写程序时,需要按照逻辑流程将不同的操作语句按照正确的顺序排列,才能得到正确的结果。


选择结构(分支结构):


       选择结构是一种程序控制结构,它允许程序在满足不同条件的情况下执行不同的代码路径。选择结构通常用于根据特定的条件选择不同的处理路径,例如为一个变量赋值、输出不同的结果等。在大多数编程语言中,选择结构有两种类型:if...else 和 switch...case。if...else 结构的语法形式如下:


if (condition)

{  

       // 条件为真时执行的代码  // ...

}

else

{  

       // 条件为假时执行的代码  // ...

}


if...else 结构会根据指定的条件来判断执行哪段代码。如果条件为真,那么执行 if 代码块中的语句;否则,执行 else 代码块中的语句。else 代码块是可选的,如果不需要对条件为假的情况进行处理,可以省略该代码块。


选择结构都可以根据特定的条件来执行不同的代码路径,具有很强的灵活性和应用范围。

//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  语句
#include<stdio.h>
int main()
{
  int age = 0;
  //输入
  scanf("%d", &age);
  /*
    < 18      青少年
    18 - 30   青年
    31 - 50   中年
    51 - 80   中老年
    80 - 100  老年
    100 +     老寿星
  */
  if (age < 18)
    printf("青少年!\n");
  //else if (18 <= age <= 30)
  //18 <= age 当输入15,该表达式为假,假就为0,0<=30变为true,\
  执行下列语句,不符合逻辑,故改写法有误
  else if ((age >= 18) && (age <= 30))
    printf("青年!\n");
  else if ((age >= 31) && (age <= 50))
    printf("中年!\n");
  else if ((age >= 51) && (age <= 80))
    printf("中老年!\n");
  else if((age >= 81) && (age <= 100))
    printf("老年!\n");
  else//else后不可直接带判断
    printf("老寿星!\n");
}


当我们写代码时,一定要有良好的代码风格

//悬空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");
    //else是与最近的if语句匹配
    return 0;
}
//改进
#include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if (a == 1)
    {
        if (b == 2)//不要写成(b=2),这样写条件表达式将永远是true
        {
            printf("hehe\n");
        }
    }
    else
    {
        printf("haha\n");
    }
    //else是与最近的if语句匹配
    return 0;
}


接下来我们做两个题目练习一下:


1.判断一个数是否为奇数

#include<stdio.h>
int main()
{
  int n = 0;
  scanf("%d", &n);
  if (n % 2 == 1)
  {
    printf("%d是奇数\n", n);
  }
  else
  {
    printf("%d不是奇数\n", n);
  }
  return 0;
}


2.输出1-100之间的奇数

#include<stdio.h>
int main()
{
  int i = 0;
  for (i = 0; i <= 100; i++)
  {
    //判断i是否为奇数
    if (i % 2 == 1)
    {
      printf("%d ", i);
    }
  }
  return 0;
}


现在我们再来介绍一下switc-case-break语句

switch...case 结构的语法形式如下:


```switch (expression)

{  

       case value1:    // 匹配 value1 时执行的代码    

               // ...    

               break;  

       case value2:    // 匹配 value2 时执行的代码    

               // ...    

               break;  

       default:    // 所有值都不匹配时执行的代码    

               // ...    

               break;

}


switch...case 结构会根据指定的表达式值来判断执行哪个 case 代码块中的语句。如果表达式的值匹配某个 case 中的值,就会执行该代码块中的语句。break语句 的实际效果是把语句列表划分为不同的分支部分。如果没有任何一个值匹配表达式的值,则执行 default 代码块中的语句(default 块是可选的)。


有时候我们的需求变了:


1. 输入1-5,输出的是“工作日”;

2. 输入6-7,输出“休息日”


所以我们的代码就应该这样实现了:

#include<stdio.h>
int main()
{
  int day = 0;
  scanf("%d", &day);
  switch (day) // - day 整型表达式
  {
  case 1: 
  case 2:
  case 3:
  case 4:
  case 5:
    printf("工作日\n");
    break;
  case 6:
  case 7:
    printf("休息日\n");
    break;
  default:
    printf("输入错误\n");
    break;
  }
  return 0;
}


是时候来验证一下我们学的咋样啦?看代码。

#include <stdio.h>
int main()
{
    int n = 1;
    int m = 2;
    switch (n)
    {
    case 1:
        m++; // m = 3
    case 2:
        n++; // n = 2
    case 3:
        switch (n)
        {//switch允许嵌套使用
        case 1:
            n++;
        case 2: 
            m++; // m = 4
            n++; // n = 3
            break;
        }
    case 4:
        m++; // m =5
        break;
    default:
        break;
    }
    printf("m = %d, n = %d\n", m, n);// 5 3
    return 0;
}


1.switch语句是可以嵌套的

2.break语句只会跳出一层switch


循环结构:


       循环结构是一种程序控制结构,它允许程序在满足特定条件的情况下反复执行一段代码。

循环结构通常用于处理需要重复执行某一任务的情况,如打印九九乘法表、读取文件中的每一行数据等。在大多数编程语言中,循环结构有两种类型:while 循环和 for 循环。


while 循环的语法形式如下:

while (condition) {  

       // 待重复执行的代码  // ...

}


while 循环会在每一次循环开始时检查 condition 条件是否满足,只有当条件为真时,才会执行循环体中的代码块。一旦循环体执行完毕,程序将返回到循环开始处,重新检查条件,直到条件不再满足为止,循环结束。


for 循环的语法形式如下:

for (initialization; condition; increment)

{  

// 待重复执行的代码  // ...

}


for 循环通常用于计数器的循环。在 for 循环中,初始化语句会在循环开始前执行一次,用于设置计数器的初始值;条件语句会在每次循环开始时执行,用于检查计数器是否满足循环终止条件;增量语句会在每次循环结束时执行,用于更新计数器的值。当计数器不再满足条件时,循环结束。


       这两种循环结构都可以用来控制程序的重复执行次数和循环条件,具有很强的灵活性和应用范围。


现在我们来介绍一下循环结构 我们已经掌握了,


if(条件)

       语句;


当条件满足的情况下,if语句后的语句执行,否则不执行。 但是这个语句只会执行一次。 由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。 那我们怎么做呢? C语言中给我们引入了: while 语句,可以实现循环。


//while 语法结构

while(表达式)

        循环语句;

//在屏幕上打印1-10
#include <stdio.h>
int main()
{
  int i = 1;
  while (i <= 10)
  {
    printf("%d ", i);
    i++;
  }
  return 0;
}


while语句中的break和continue


break:


       break语句用于完全退出循环。break用于完全退出包含它的循环。当执行到break语句时,程序会跳出当前的循环,不再执行后续的循环代码,而是直接执行循环外的代码。break只能跳出一个循环,不能跳出多个循环。

#include <stdio.h>
int main()
{
  int i = 1;
  while (i <= 10)
  {
    if (i == 5)
      break;//跳出循环
    printf("%d ", i);// 1 2 3 4
    i++;
  }
  return 0;
}


continue:


       continue语句用于跳过当前单次循环中的某些语句,开始下一次循环。当执行到continue语句时,程序不会执行剩余的循环体,而是直接进行下一次循环。

#include <stdio.h>
int main()
{
  int i = 0;
  while (i < 10)
  {
    i++;
    if (i == 5)
      continue;
    //跳过本次循环continue后边的代码,直接去while循环的判断部分
    printf("%d ", i);// 1 2 3 4 6 7 8 9 10
  }
  return 0;
}


再看几个代码:

#include<stdio.h>
int main()
{
    char password[20] = { 0 };
    printf("请输入密码:>");//123456
    scanf("%d", password);
    printf("请确认密码(Y/N):>");
    char c = 0;
    scanf("%c", &c);
    if ('Y' == c || 'y' == c)
        printf("确认成功\n");
    else
        printf("确认失败\n");
    return 0;
}



我们发现此程序在我们输入密码之后,没有让我们输入Y程序就自己输出确认失败了,这是为什么呢?


这是因为在输入密码后,scanf函数还会将回车符('\n')留在输入缓冲区中,然后当我们输入确认字符时,scanf会读取到这个回车符,导致程序直接执行了确认失败的代码块。这种情况可以使用一个额外的getchar()函数来解决。

#include<stdio.h> 
int main() {
    char password[20] = { 0 };
    printf("请输入密码:>");//123456     
    scanf("%s", password);
    // 因为是读取字符数组,所以不需要使用 & 符号
    while(getchar()!='\n')
    {
        ; // 把输入缓冲区中的回车符读取掉
    }
    printf("请确认密码(Y/N):>");
    char c = getchar(); // 直接使用 getchar 读取字符
    if ('Y' == c || 'y' == c) // 注意对大小写的判断
        printf("确认成功\n");
    else
        printf("确认失败\n");
    return 0;
}


这个代码的作用是:只打印数字字符,跳过其他字符的、

//#include <stdio.h>
//int main()
//{
//    char ch = '\0';
//    while ((ch = getchar()) != EOF)
//    {
//        if (ch < '0' || ch > '9')
//            continue;
//        putchar(ch);
//    }
//    return 0;
//}
相关文章
|
6月前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
324 6
|
8月前
|
SQL NoSQL 关系型数据库
超强数据库管理软件推荐-没有之一-还在用Navicat管理本地数据库的吗?还在为Navicat寻求绿色版或者购买正版的费用望而却步吗?DBeaver让你解决所有数据库本地编写问题-优雅草央千澈-DBeaver下载和安装
超强数据库管理软件推荐-没有之一-还在用Navicat管理本地数据库的吗?还在为Navicat寻求绿色版或者购买正版的费用望而却步吗?DBeaver让你解决所有数据库本地编写问题-优雅草央千澈-DBeaver下载和安装
646 18
超强数据库管理软件推荐-没有之一-还在用Navicat管理本地数据库的吗?还在为Navicat寻求绿色版或者购买正版的费用望而却步吗?DBeaver让你解决所有数据库本地编写问题-优雅草央千澈-DBeaver下载和安装
|
10月前
|
算法 数据安全/隐私保护 索引
OFDM系统PAPR算法的MATLAB仿真,对比SLM,PTS以及CAF,对比不同傅里叶变换长度
本项目展示了在MATLAB 2022a环境下,通过选择映射(SLM)与相位截断星座图(PTS)技术有效降低OFDM系统中PAPR的算法实现。包括无水印的算法运行效果预览、核心程序及详尽的中文注释,附带操作步骤视频,适合研究与教学使用。
|
资源调度 JavaScript API
Vue3+TS+Vite开发组件库并发布到npm
这篇文章介绍了如何使用Vue 3、TypeScript和Vite开发一个包含35个常用UI组件和8个API功能函数的组件库`vue-amazing-ui`,并将其发布到npm,同时提供了组件库的安装使用说明和在线预览。
328 2
Vue3+TS+Vite开发组件库并发布到npm
|
6月前
|
数据采集 前端开发 JavaScript
PDF预览:利用vue3-pdf-app实现前端PDF在线展示
通过本文的介绍,我们详细了解了如何在Vue3项目中使用vue3-pdf-app实现PDF文件的在线展示。从项目初始化、插件集成到高级功能的实现和部署优化,希望对你有所帮助。在实际项目中,灵活运用这些技术可以大大提升用户体验和项目质量。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
11月前
|
Java Nacos 开发工具
Nacos入门到精通
本文详细介绍了Nacos的基本概念、安装过程、配置管理功能,并通过具体代码示例展示了如何使用Java SDK和Spring Boot拉取和监听Nacos中的配置信息。
712 0
Nacos入门到精通
QComboBox设置下拉item大小
QComboBox设置下拉item大小
531 0
|
算法 编译器 C++
C++一分钟之—Lambda表达式初探
【6月更文挑战第22天】C++的Lambda表达式是匿名函数的快捷方式,增强函数式编程能力。基本语法:`[capture](params) -&gt; ret_type { body }`。例如,简单的加法lambda:`[](int a, int b) { return a + b; }`。Lambda可用于捕获外部变量(值/引用),作为函数参数,如在`std::sort`中定制比较。注意点包括正确使用捕获列表、`mutable`关键字和返回类型推导。通过实践和理解这些概念,可以写出更简洁高效的C++代码。
175 13
|
移动开发 JavaScript 小程序
uniapp为什么能支持多端开发?uniapp底层是怎么做的?
uniapp为什么能支持多端开发?uniapp底层是怎么做的?
470 0