本文是C语言的基础知识,主要讲解三种程序设计结构、数组、字符串 和字符数组、数组元素查询以及字符串处理函数。
程序结构设计
包括C语言在内的几乎任何编程语言都支持以下三种程序设计结构,它们分别是:
- 顺序结构程序设计
- 选择结构程序设计
- 循环结构程序设计
程序设计是什么
程序设计就是用各种程序设计语言(C、C++、Java、VB、Pascal 等)将算法流程转化为可以被计算机执行的代码的过程。
顺序结构
顺序结构的程序设计就是把解决问题的过程一步一步由上至下,按顺序编制成可执行代码。 顺序结构程序设计一般由三部分组成:
- 输入部分:把已知的值输入电脑并存储在变量中。
- 处理部分:按解决问题的次序进行计算处理。
- 输出部分:把计算处理结果返回给用户。
实例
随机产生一个四位数整数。输出整数和其各位数字。
好了咱先把代码搞出来
#include <stdio.h> #include <stdlib.h> #include <time.h> int main( ) { int number,a,b,c,d,s; srand(time(NULL)); number = 1000+rand()%9000; a = number % 10; b = number / 10 % 10; c = number / 100 % 10; d = number / 1000; s = a + b + c + d; printf("随机生成四位整数:%d\n",number); printf("各位数字:%d , %d , %d , %d ",d,c,b,a); return 0; }
运行结果
随机生成四位整数:8534 各位数字:8 , 5 , 3 , 4
1.首先生成一个随机的四位数整数。
rand()函数产生的是一个伪随机数,重复调用该函数所产生的随机数字是相同的。要想每次执行产生不同的随机数,就需要用srand()函数进行随机初始化。
随机初始化函数srand()可以设置随机数生成器的种子,不同的种子将产生不同的随机数。在程序运行过程中时间是一直变化的,所以我们可以借助 time.h 库中的 time(NULL) 函数返回计算机当前的时间数,把它作为随机数生成器的种子,从而在每次执行 rand( ) 函数时产生一个不同的随机数。
将当前时间设置为随机数生成器种子的代码如下:
srand(time(NULL));
2.拆分这个四位整数,获得其各位上的数字。
拆分一个数可以利用%和/运算符实现。假设 a、b、c、d 分别表示四位整数 number 的个、十、百、千位上的数,则它们的值可以分别表示为:
a = number % 10; //个位数 b = bumber / 10 % 10 //十位数 c = number / 100 % 10 //百位数 d = number / 1000 //千位数
好了齐活。
选择结构
选择结构也称分支结构,是一种根据判断条件的成立与否来确定程序执行方向的一种程序设计结构。if 和 else 是两个新的关键字,if 意为如果,else 意为否则,用来对条件进行判断,并根据判断结果执行不同的语句。
C 语言把任何非零和非空的值假定为 true,把零或 null 假定为 false。
最简单的if语句
if(判断条件) { 语句块 }
前置条件:表达式必须要有,表达式外面的()也是必须的。
功能:如果表达式为真就执行语句块,否则就向下执行。
if实例
#include <stdio.h> int main( ) { if (9>5) { printf("公众号:帅次"); } return 0; }
运行结果
公众号:帅次
9>5,表达式为真,所以执行语句块。
语句块
所谓语句块(Statement Block),就是由{ }包围的一个或多个语句的集合。如果语句块中只有一个语句,也可以省略{}
if else语句
if (判断条件) { 语句块1 } else { 语句块2 }
功能:如果表达式为真就执行语句块1,否则执行语句块2 。
if else实例
1.#include <stdio.h> int main( ) { int number=63; if(number>=60) printf("及格啦!\n"); else printf("不及格!\n"); return 0; }
运行结果
及格啦!
多个if else语句
#include <stdio.h> int main( ) { if (判断条件1){ 语句块1 } else if (判断条件2){ 语句块2 }else if (判断条件3){ 语句块3 }else if (判断条件m){ 语句块4 }else{ 语句块5 } }
if else语句的嵌套
#include <stdio.h> int main( ) { if (判断条件1){ if (判断条件2){ 语句块1 }else{ 语句块2 } } else{ if (判断条件3){ 语句块3 }else{ 语句块4 } } }
switch case语句
在C语言中,应用条件语句 if-else 可以很方便地使程序实现两个分支,但是如果出现多个分支的情况,虽然可以使用 if-else 语句的嵌套,但是程序会显得比较复杂,不易阅读。
switch 是另外一种选择结构的语句,用来代替简单的、拥有多个分枝的 if else 语句。 基本格式如下:
switch(判断条件) //表达式的值只能在下面的 case 值表中出现一次 { case 值 1: 语句块1 break; //break 语句的功能是跳出 switch 语句,执行其后面的语句 case 值 2: 语句块2 break; case 值 3: 语句块3 //如果没有 break 语句,则会自动继续执行后续 case 的语句序列 case 值 n: 语句块 n; break; default: 语句块n+1; //default 部分是可选项 }
switch 语句的执行流程
实例
#include <stdio.h> int main( ) { int number = 5; switch(number){ case 1: printf("Monday\n"); case 2: printf("Tuesday\n"); case 3: printf("Wednesday\n"); case 4: printf("Thursday\n"); case 5: printf("Friday\n"); case 6: printf("Saturday\n"); case 7: printf("Sunday\n"); default:printf("error\n"); } return 0; }
运行结果
Friday Saturday Sunday error
循环结构
C语言的循环控制结构一般有三种基本形式:
- while 循环语句:先判断,条件判断为真则执行循环体;
- do-while 循环语句:先执行一次循环体,再判断条件是否为真;
- for 循环语句:多次执行一个语句序列,简化管理循环变量的代码。 循环结构中有一个循环体,根据判断的结果来决定执行循环体的次数。
while 语句和 do-while 语句可以相互转换。for 循环的循环处理次数比 while 和 do-while 更加简洁,for 循环的执行顺序是先初始化循环变量,再判断条件是否为真,条件为真则执行循环体;执行完毕则改变循环变量,再次对条件进行判断,循环执行直至条件不成立。
循环控制语句
循环控制语句改变你代码的执行顺序。通过它你可以实现代码的跳转。
- break 语句:终止循环或 switch 语句,程序流将继续执行紧接着循环或 switch 的下一条语句。
- continue 语句:告诉一个循环体立刻停止本次循环迭代,重新开始下次循环迭代。
- goto 语句:将控制转移到被标记的语句。但是不建议在程序中使用 goto 语句。
注意事项:
- 用 break 可以提前终止 for、while 和 do-while 循环。
- 用 continue 可以强迫循环进入新的循环周期。
- break 和 continue 前通常有 if 语句进行某种关系测试。
while 循环
while 语句适用于当条件成立时重复操作的循环控制结构,因而常被称作当型循环。其一般格式如下:
while (判断表达式) { 循环体; //一条或多条 C 语句 }
它与 if 语句中的 condition 一样,其外面的括号是必需的。循环体是 while 语句的主体部分,是需要重复操作的一条或多条 C 语句,它包含多条语句时,其外侧必须加上花括号{}。
判断表达式为真执行循环体,否则退出 while 语句,继续执行后续语句。
实例
#include <stdio.h> int main( ) { int number = 0; while(number<5){//number必须小于5 printf("number:%d\n",number); number++;//number=number+1 } return 0; }
运行结果
number:0 number:1 number:2 number:3 number:4
当number=5时,结束循环。
do while 循环
do-while 语句适用于重复操作直到条件不成立为止的循环控制结构,因而常被称作直到型循环。其一般格式如下:
do { 循环体; //一条或多条 C 语句 } while (判断表达式);
特别注意: 和 while 语句不一样的是,要在 do-while 语句 判断表达式 外的括号后面加上分号。
实例
#include <stdio.h> int main( ) { int number = 0; do{ printf("number:%d\n",number); number++;//number=number+1 } while(number<5);//number必须小于5 return 0; }
运行结果
number:0 number:1 number:2 number:3 number:4
while语句和do-while语句的互换
do-while 语句和 while 语句都擅长于解决循环次数未知的重复操作,但两者在实际应用中还是有区别的:
- do-while 语句是先执行循环体语句,后判断循环条件是否成立;while 语句是先判断循环条件是否成立,后执行循环体语句。
- do-while 语句中,无论循环条件是否成立,总要执行一次循环体语句;while 语句中,如果循环条件不成立,则不执行循环体语句。
while和do-while小结
左图为while执行过程,右图为do-while执行过程
- 需要重复执行一段代码时,使用 while 或 do-while 循环语句。
- 不要在 while 语句的 condition 外的括号后面加上分号。
- 要在 do-while 语句的 condition 外的括号后面加上分号。
- 不要在 while 或 do-while 语句的循环体外的花括号后面加上分号。
- 循环体内只有一条语句时,其外面的花括号可以不写。
- 确保 while 或 do-while 语句的循环体内有语句修改了 condition 中的某个变量值。否则循环将永远重复下去,成为死循环。
for循环
如果已知重复操作的次数,可以使用 for 循环语句,其一般格式如下
for(表达式1;表达式2;表达式3) { 循环体 //一条或多条 C 语句 } //若循环体内只有一条语句,则花括号可以不写
for 循环中的表达式1(初始化条件)、 表达式2(循环条件) 和 表达式3(自增或自减) 都是可选项,都可以省略(但分号 ;必须保留 )。
实例
#include <stdio.h> int main( ) { int number; for(number=0;number<5;number++){ printf("number:%d\n",number); } return 0; }
运行结果
number:0 number:1 number:2 number:3 number:4
结果分析
- 1.可以将number=0移到了 for 循环的外面,省略表达式1(初始化条件),如下
int number=0; for(;number<5;number++){ printf("number:%d\n",number); }
- 2.省略了表达式2(循环条件),如果不做其它处理就会成为死循环。如下:
for(number=0;;number++){ printf("number:%d\n",number); }
死循环,就是循环条件永远成立,循环会一直进行下去,永不结束。死循环对程序的危害很大,一定要避免。
- 3.省略了表达式3(自增或自减),就不会修改“表达式2(循环条件)”中的变量,这时可在循环体中加入修改变量的语句。如下:
for(number=0;number<5;){ printf("number:%d\n",number); number++; }
- 4.3个表达式可以同时省略。如下:
for(;;)语句
相当于
while(1)语句
for循环语句的嵌套
如果把一个 for 循环语句放在另一个 for 循环语句的循环体中,就构成了 for 循环的嵌套。其一般格式如下:
for(外层循环变量 i 初始化;外层循环条件;外层循环变量 i 增量) { …… for(内层循环变量 j 初始化;内层循环条件;内层循环变量 j 增量) { 内层循环体 } …… }
实例
计算 1+2+3+…+100。
#include <stdio.h> int main(){ int i, sum=0; i = 1; //while循环 while(i<=100){ sum+=i; i++; } printf("总和(while):%d\n",sum); //do-while循环 sum=0; i = 1; do{ sum+=i; i++; }while(i<=100); printf("总和(do-while):%d\n",sum); //for循环 sum=0; for(i=1;i<=100;i++) sum+=i; printf("总和(for):%d\n",sum); return 0; }
运行结果
总和(while):5050 总和(do-while):5050 总和(for):5050