算法的基础结构

一个程序由算法和数据结构组成。

什么是数据结构?

        简单来说就是程序中需要使用的数据包括它们的类型和逻辑结构、存储结构以及这些数据运算的定义和实现。

什么是算法?

        简单来说就是用来描述解决一个具体问题的步骤,即多个指令的有限数列,而每个指令由一个或多个操作组成,最终通过这些算法解决需要求解的问题。一个算法应该具有五个特性,即:

  1. 有穷性(一个算法必须在执行有穷步后结束,并且每步都必须在有穷时间内完成);
  2. 确定性(算法中每个指令都有确定的定义,对于相同的输入都有相同的输出);
  3. 可行性(每个操作都可通过有限次基本运算执行来实现);
  4. 输入(一个算法有零个或多个输入);
  5. 输出(一个算法有一个或多个输出);

我们可以使用自然语言、流程图、伪代码等等来表示算法,在这我们介绍下流程图的使用方法:

图片

如上图所示就是常使用的流程图符号。

我们由三种基本结构表示一个算法,即:顺序结构、选择结构、循环结构;

顺序结构:

图片

即:程序按我们编写的执行语句的顺序依次执行操作;

选择结构:

图片

        不难看出,经过判断框P的时候判断满足哪一个条件从而进行对应的操作,而且只能执行一个操作。

用if语句实现选择结构:

//1.仅有if语句没有else语句
if(表达式)
    操作语句;


//2.有if语句也有else语句
if(表达式)
    操作语句1;
else
    操作语句2;


//3.有多个if判断条件,使用else if一一列举
if(表达式1) 操作语句1;
else if(表达式2) 操作语句2;
else if(表达式3) 操作语句3;
......
else if(表达式n) 操作语句n;
else 操作语句n+1;

        补充://为注释符号,为了解释说明语句含义,帮助他人更快地读懂你的代码;我们也可以使用/*    */符号进行注释。//只能单行注释,/*   */可以跨行注释,即以/*为起点,以*/为终点,中间部分皆为注释,若只有/*则其之后部分都为注释直到程序结束,若只有*/则没有影响,注释部分不会参与编译,所以不会对程序结果产生影响。要成为一个好的程序员,要习惯边写边注释,可大大增加程序的可读性。

条件运算符和条件表达式:

一般形式:表达式1?表达式2:表达式3;

例如:

#include<stdio.h>

int main()
{
  int a=3,b=4;
  printf("%d",a>b?a:b);
}

        程序中表达式1为a>b,即我们先判定表达式1是否成立,若成立则执行表达式2,即输出a;若不成立则执行表达式3,即输出b。

这个程序等价于:

#include<stdio.h>

int main()
{
    int a=3,b=4;
    if(a>b)
        printf("%d",a);
    else
        printf("%d",b);
}

        上述程序中我们在定义变量a,b的同时给其分别赋值,当然,我们也可以使用scanf函数从键盘给a,b分别赋值。

int a,b;
scanf("%d %d",&a,&b);     
//给变量赋值我们需要使用&取地址符,否则不给变量分配存储地址我们无法赋值

 

if语句的嵌套:

if() 
  if() 语句1;
  else 语句2; 
else
  if() 语句3;
  else 语句4;

        形如上述形式的为if表达式,注意:if和else总是一一配对的,当配对关系不平衡时,else总是会和上述最近的if进行配对。

switch语句的多分支选择语句:

switch(表达式a)
{
  case 常量1:语句1;break;
  case 常量2:语句2;break; 
  case 常量3:语句3;break; 
  ...... 
  case 常量n:语句n;break;
  default:语句n+1; 
  }
  1. switch语句将表达式a的值与每个常量进行比较,当匹配上则执行其对应的语句操作,并使用break语句跳出switch语句,即结束。若语句后最后没有break,则系统会继续执行此操作下一个语句中的操作,不再进行判断,直到遇到break为止或者程序结束。
  2. 若上述case中没有与其配对的选项,则会执行default语句中的操作。但default语句不是必须的,当没有常量能与a配对且没有default语句,则执行结束后直接跳出语句,不执行任何一条语句操作。
  3. 每个case出现的次序不一定,switch只会选择与之对应的语句进行操作。
  4. 每个case对应的常量必须不同,否则会出现矛盾的情况。
  5. switch中的case只起标记作用,即根据表达式a找到匹配项的入口标号。

循环结构:

图片

        上述流程图,前者对应while循环,即当满足某条件执行,后者对应until循环,即直到满足什么条件为止。

while语句循环:

while(表达式)            
{
     语句;
}
//当满足表达式时执行while中的语句,执行完继续判断表达式是否继续执行,反之跳出

do{
    语句;
}while(表达式)
//先执行do...while语句中的语句,然后与表达式进行判定,当满足条件时继续执行语句,反之跳出

for语句循环:

for(表达式1;表达式2;表达式3)
{语句;}

//等价于
表达式1;
while(表达式2)
{
    语句;
    表达式3;
}

表达式1:对需要使用的变量进行赋值,可以对一个或者多个赋值,只在循环开始时执行依次。

表达式3:循环的调整,例如使循环变量递增或递减,使循环有尽头,在执行完循环语句后执行

表达式2:循环条件表达式,除开始时先判定表达式1是否满足条件,后面都在表达式3执行结束之后执行,若满足条件继续循环,反之则结束循环。

例如: 

int i;
for(i=0;i<100;i++)     //i++为i自增,即每次执行加1
{}

        补充:i++为先使用后自增,即:先使用i的值再使自身增加1;++1为先自增后使用,即:先使自身增加1再使用i的值。同样,i--为先使用后自增,即:先使用i的值再使自身减1;--1为先自增后使用,即:先使自身减1再使用i的值。

for语句中可以不需要表达式1,但需要在循环开始前对循环变量赋初值,如:

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

for语句中可以不需要表达式3,但需要在循环语句中对循环变量进行值的调整,如:

int i=0;
for(;i<100;)
{
    语句;
    i+=2;
}

        补充:i+=2为左加运算符,等价于i=i+2;类似的还有-=,/=,*=。这都是C语言特有的。

  • 若for语句没有表达式2,即不设置条件,则程序会无休止地进行下去。
  • 若没有表达式1和表达式3,也没有在其他地方设置,只有表达式2,则程序没有初值无法执行。
  • 若三个表达式都没有,则程序无无限循环,此时没有任何意义。
for( ; ; )
//等价于
while(1)

此外,while,do...while,for都可以互相嵌套,大家可以自己尝试尝试。

改变循环体执行的状态:

  • break——提前终止循环

        在循环体中遇到break,则跳出循环体执行循环下面的语句。

  • continue——提前结束本次循环

        在循环体中遇到continue,则结束本次循环,开始下一次循环,即continue语句后面的操作不执行。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值