一个程序由算法和数据结构组成。
什么是数据结构?
简单来说就是程序中需要使用的数据包括它们的类型和逻辑结构、存储结构以及这些数据运算的定义和实现。
什么是算法?
简单来说就是用来描述解决一个具体问题的步骤,即多个指令的有限数列,而每个指令由一个或多个操作组成,最终通过这些算法解决需要求解的问题。一个算法应该具有五个特性,即:
- 有穷性(一个算法必须在执行有穷步后结束,并且每步都必须在有穷时间内完成);
- 确定性(算法中每个指令都有确定的定义,对于相同的输入都有相同的输出);
- 可行性(每个操作都可通过有限次基本运算执行来实现);
- 输入(一个算法有零个或多个输入);
- 输出(一个算法有一个或多个输出);
我们可以使用自然语言、流程图、伪代码等等来表示算法,在这我们介绍下流程图的使用方法:
如上图所示就是常使用的流程图符号。
我们由三种基本结构表示一个算法,即:顺序结构、选择结构、循环结构;
顺序结构:
即:程序按我们编写的执行语句的顺序依次执行操作;
选择结构:
不难看出,经过判断框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;
}
- switch语句将表达式a的值与每个常量进行比较,当匹配上则执行其对应的语句操作,并使用break语句跳出switch语句,即结束。若语句后最后没有break,则系统会继续执行此操作下一个语句中的操作,不再进行判断,直到遇到break为止或者程序结束。
- 若上述case中没有与其配对的选项,则会执行default语句中的操作。但default语句不是必须的,当没有常量能与a配对且没有default语句,则执行结束后直接跳出语句,不执行任何一条语句操作。
- 每个case出现的次序不一定,switch只会选择与之对应的语句进行操作。
- 每个case对应的常量必须不同,否则会出现矛盾的情况。
- 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语句后面的操作不执行。