极简嵌入式C语言教程——从入门到入土

Posted 修灯泡的老张

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了极简嵌入式C语言教程——从入门到入土相关的知识,希望对你有一定的参考价值。

文章目录

第二章:渐入佳境(上)

前言:建议复习一下第一章内容防止遗忘。

1.结构及结构在编程中的应用

(1)选择结构(if & switch)

<1>if 语句的基本用法

if(条件表达式)  语句;

  括号中的条件表达式可以是逻辑表达式也可以是关系表达式,例如:

if(a>=10) a=b;
if(!a) a=b+1;

if 后的语句可以是多个语句,这时多个语句应用花括号包裹。例如:

  if(a||b==0)

  a=b;
  b=c;
  c=a;

  单个 if 在逻辑上表示判断,即,从另一方面来说,也就是有两个选择。当有多个选择条件时,单个if的两个选择已经不能满足,因此 if 可与 else 组合成双分支或多分支语句以提供更多选择,例如:

if(a>b) max=a;
else max=b;

  上面的代码是典型的 if 双分支语句,这里 else 可以理解成否则,那么整个程序的意思就是:如果a大于b,那么最大值就是a;否则,最大值就是b。
  当一个问题有多种选择时,一种方法是利用 if 编写多分支语句;另一种方法是利用关键字 switch,这种方法在下面会讲到。现在使用第一种方法,编写一元二次方程的判别式:

delta=b^2-4*a*c;
if(delta>0) printf("方程有两个不相等实数解");
else if(delta==0) printf("方程有两个相等的实数解");
else if(delta<0) printf("方程有一对共轭复根");

补充关于三目运算符
  C语言中唯一一个三目运算符“?:”由一个问号和一个冒号构成,其表达意义及使用示例如下:

//一般形式:
表达式1?表达式2:表达式3
//相当于:
if(表达式1) 表达式2;
else 表达式3;
/*********************************************************/
//例:从键盘上输入一个字符,如果是小写字母,就将其转换成大写字母,否则直接输出。
scanf("%c",&ch);
ch=(ch>='a' && ch<='z')?(ch-32):ch;//关于字符运算不理解的去第一章看,然后自己查ASCII码。
putchar(ch);
1 if 的高级用法:嵌套

  这里以求解一元二次方程为示例:

delta=b^2-4*a*c;
if(delta>=0)

  if(delta>0)
  
    x1=-b+sqrt(delta)/(2*a);
    x2=-b-sqrt(delta)/(2*a);
    printf("x1=.2%f;x2=%.2f\\n",x1,x2);//保留两位小数
  
  else
  
    x1=-b/(2*a);
    x2=x1;
    printf("x1=x2=%.2f\\n",x1);
  

else

  p=-b/(2*a);
  q=sqrt(fabs(delta))/(2*a);
  printf("x1=%.2f + %.2f i\\n",p,q);//一对共轭复根
  printf("x2=%.2f - %.2f i\\n",p,q);

提问:请自行画出该结构的流程图或示意图

2关于 if 的几点建议

.1.多分支选择优先选择switch结构,当switch不能满足要求时考虑if分支。
.2.使用 if 分支嵌套时一定注意各语句属于哪一级if结构,防止出现错误。

<2>switch语句的基本用法

switch 语句顾名思义,是选择多分支语句,其表达形式如下:

switch(表达式)

  case 常量表达式1 : 语句1; break;//break绝对不能丢!!!
  case 常量表达式2 : 语句2; break;
  ......
  case 常量表达式n : 语句n; break;
  default : 语句n+1;

  该表达形式的意义可以理解为:表达式与switch中的常量表达式进行匹配,一致的执行后面的语句,并由break跳出switch结构,如果与所有常量表达式都不匹配,那么执行default后的语句n+1,然后跳出switch结构。
示例:

scanf("%d",&num);
switch(num)

 case 1: printf("one!\\n");break;
 case 2: printf("two!\\n");break;
 case 3: printf("three!\\n");break;
 case 4: printf("four!\\n");break;
 case 5: printf("five!\\n");break;
 default : printf("error!!!\\n");break;

1关于switch语句的几点建议

.1.switch关键字后表达式可以是任何结果为整形或字符型的表达式
.2.case 关键字后面只能是整形或字符型的常量或常量表达式,不能处理非常量情况;
.3.各个case 后常量表达式不能相同;且不可丢掉break语句(丢掉break就代表你想有意的使多分支指向一个结果);
.4.default语句可有可无,你用不到的时候可以不写,不过在选择结构很多的时候还是建议加上;
.5.case关键字后可以接多个语句,但要用花括号括起来。

(2)循环结构(while & for)

<1>while结构

1 while 语句

while语句可以理解为:当满足一个条件的时候,进入while循环执行……;不满足就不进入while循环。**while **语句的一般形式为:

while(表达式)
  循环体语句;
/***************************例*************************/
int i=0
while(i<10)

  i++;

//i初始值为0,进入循环的条件是i<10,进入循环后i在初始值基础上+1,此时i=1,仍然小于10,继续进入循环,直到i=10才跳出循环。

  例:求 ∑ n = 1 n = 100 n \\sum_n=1^n=100n n=1n=100n

#include <stdio.h>

int main()

  int sum=0,n=1;
  while(n<=100)
  
    sum=sum+n;   
    n++;
  
  printf("sum=%d",sum);
  return 0;

2do…while 语句

do…while语句可以理解为:先执行do后面的语句,直到满足while中的条件,才跳出循环体do…while语句一般形式为:

do(循环体语句)
while(表达式)
/******************************例*************************/
int n=1,sum=0;
do

 sum=sum+n;  //该结构的特点为先循环再判断
 n++;
 
while(n<=100);//分号不可丢

<2>for 结构(不嵌套)

1for 语句的一般形式及等价while 语句

for 语句的一般形式为:

for(循环变量赋初值;循环条件;循环变量增值)

等价于:

循环变量赋初值;
while(循环条件)

  循环体语句;
  循环变量增值;


  仍以此题为例:求 ∑ n = 1 n = 100 n \\sum_n=1^n=100n n=1n=100n

#include <stdio.h>

int main()

  int sum=0,n=1;
  for(;n<=100;n++) //在变量初始化的时候就已经为i赋予了处置,因此此处可省略n=1
  
    sum=sum+n;
  
  printf("sum=%d",sum);
  return 0;

  相比于while 语句,for 语句在形式上更加简洁。

2关于 for 语句的几点建议

.1.循环体语句可以是单个语句,也可以是用花括号括起来的多个语句,个人建议无论是单个还是多个语句,都用花括号括起来,以免出现因格式错误而使循环出现问题。
.2.for 语句中三个表达式均可省略,但是分号不可省略。另外,省略的前提是这些被省略的语句已经在前或后提及。省略循环变量赋初值的前提是前面已有赋初值的语句;在电脑上不建议省略循环条件,因为那样是个死循环;省略循环变量增值的条件是在后面for 语句循环体中提及。

(3)改变控制流的语句(break & continue)

<1>break 语句

break 语句最直接的理解就是跳出,既可以跳出循环,又可以跳出switch语句这种多分支选择;例:

for(int i=0;i<100;i++)

  a=a+i;
  if(a=b)
  
    break;
  

<2>continue 语句

continue 语句作用是结束本次循环,即跳过循环体中下面未执行的语句,接着进行下一次是否执行循环体的判断,此处不过多赘述。

2.函数及函数在编程中的应用

(1)什么是函数、形式参数(形参)、实际参数(实参)

函数:你在前面程序中一直用的printf、scanf、getchar、putchar等等都是函数,只不过这些函数都是系统库里给出的,想使用它们,就要利用 #include 调用 stdio.h、stdlib.h等函数库。
形参:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数
实参:实参的本质是一个变量,“int a=1;”中,a就是实参

(2)如何定义和使用函数

<1>如何定义函数

  函数的定义一般格式如下:

返回值类型 函数名(形式参数列表) /*[函数头]*/
                          /*[函数体]*/
   变量声明
   函数实现过程

  这里以判断大小并输出最大值函数为例,展示函数定义过程:

int judgenum(int x,int y)//该函数叫做judgenum,有两个参数x,y,返回值为整数

  int max,min;              //定义最大值,最小值      
  if(x!=y)
  
    if(x>y) 
    
      max=x;
      min=y 
    
    else
    
      max=y;
      min=x;
    
  
  else return 0;       //如果x=y那么就返回0表示相等
  return max;          //如果x≠y那么返回最大值

注:这里函数头的返回值类型可以是int、float、char等等,根据需要而定
注:关于return

return函数:函数的返回值通过函数中的返回语句return将被调用函数中的一个确定的值带回到主调函数中去。
一般形式:
return(表达式);

<2>如何使用函数

  使用函数第一步就是要声明函数,不声明直接用鬼知道你用的啥函数(doge),举个栗子:
 求 ∑ n = 1 n = 100 n \\sum_n=1^n=100n n=1n=100n
程序如下:

#include <stdio.h>

int summation(int num);  //函数声明

int main()

  int sum=0;
  sum=summation(100);
  printf("sum=%d",sum);
  return 0;


int summation(int num)

  int temp=0;
  for(int n=1;n<=num;n++) 
  
    temp=temp+n;
  
  return temp;

  以上程序利用了自己编写的summation函数,这样做的好处是主函数main的结构更加简单清晰,当程序的复杂性增加,主函数中引用的各种函数仍然有较好的可读性,此外,函数更像是积木一样有良好的组合性,大大增加了程序的可移植性。学会引用函数,编写函数,以及编写头文件,自己组建函数库(函数库编写和组建在第二章(下)),无论是学习C语言本身,还是学习嵌入式,都是极其重要的。
  温馨提示:建议将第一章和第二章(上)多看几遍,多自己上手编程几次再开始第二章(下)的学习。目前,作者更新的速度是一天一篇博客。

以上是关于极简嵌入式C语言教程——从入门到入土的主要内容,如果未能解决你的问题,请参考以下文章

极简嵌入式C语言教程——从入门到入土

极简嵌入式C语言教程——从入门到入土

极简嵌入式C语言教程——从入门到入土

极简嵌入式C语言教程——从入门到入土

极简嵌入式C语言教程——从入门到入土

极简嵌入式C语言教程——从入门到入土