← 返回首页
C语言基础(二)
发表时间:2024-05-09 02:27:07
字符与字符串/程序结构/数组

字符与字符串

1.字符

char的使用实例如下:

单个字符定义:char ch = 'A';
如果输出占位符是 %d,输出对应ASCII码
如果占位符是 %c 直接输出该字符
!!!只能有一个字母,不能是汉字
char a=65;
数字是某个字符对应的ASCII码值
如果输出占位符是 %c 就输出对应字符
如果是 %d 就输出原本数字
如果该数字没有对应的ASCII码值,输出结果乱码
char d='\n';
可以使用各种转义字符

2.字符串

字符串就是很多连在一起的字符,而且字符串可以是汉字哦。我们 一般用字符数组来存放字符串。字符串总是以 \0 结尾。

char str[4]={'c','a','t','\0'};
单引号中只能引用一个字节
最后的\0 其实不用手动添加,系统会自动帮你加上
数组下标最少要比字符多一个,因为要给\0 留位置

char str[]={'c','a','t'};
当你已经给数组内每一个元素赋值,就可以免去数组下标
这时候系统也会自动帮你添加\0

char str[]={"I love cats!"};
这种赋值方式算是最简便的,我称之为YYDS

//或者更简便的方式如下
char str[]="I love cats!";
\0 是字符串结束的方式,但输出时不会显示\0 。一定一定加上\0或预留足够空间让系统自动加上。

程序结构和控制语句

C语言的程序结构也分为:顺序、选择和循环。顺序结构就是自上而下,依次执行。我们无需探讨。我们从选择结构开始。

1.选择语句结构

判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。

C 语言把任何非零非空的值假定为 true,把null 假定为 false

下面是大多数编程语言中典型的判断结构的一般形式:

C 中的判断语句

C 语言提供了以下类型的判断语句。点击链接查看每个语句的细节。

语句 描述
if 语句 一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。
if...else 语句 一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行。
多重 if-else 语句 您可以在一个 if 语句后跟上 多个 else if 语句,最后跟上 else
嵌套 if 语句 您可以在一个 ifelse 语句内使用另一个 ifelse 语句。
switch 语句 一个 switch 语句允许测试一个变量等于多个值时的情况。

1).if语句

一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。

1.语法

C 语言中 if 语句的语法:

if(boolean_expression)
{
   /* 如果布尔表达式为真将执行的语句 */
}

如果布尔表达式为 true,则 if 语句内的代码块将被执行。如果布尔表达式为 false,则 if 语句结束后的第一组代码(闭括号后)将被执行。

C 语言把任何非零非空的值假定为 true,把null 假定为 false

2.流程图

C 中的 if 语句

3.实例

#include <stdio.h>
#include <string.h>

int main(){

    int score;
    printf("%s\n","请输入考试成绩:");
    scanf("%d",&score);
    if(score==100){
        printf("%s","奖励变形金刚一个!"); 
    }   
    return 0;
}

2).if...else语句

一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为 false 时执行

1.语法

C 语言中 if...else 语句的语法:

if(boolean_expression)
{
   /* 如果布尔表达式为真将执行的语句 */
}
else
{
   /* 如果布尔表达式为假将执行的语句 */
}

如果布尔表达式为 true,则执行 if 块内的代码。如果布尔表达式为 false,则执行 else 块内的代码。

C 语言把任何非零非空的值假定为 true,把null 假定为 false

2.流程图

C 中的 if...else 语句

3.实例

#include <stdio.h>
#include <string.h>

int main(){

    int score;
    printf("%s\n","请输入考试成绩:");
    scanf("%d",&score);

    if(score>100||score<0){
    printf("成绩非法!");
    return -1;
    }

    if(score>=60){
        printf("%s","恭喜你考试及格!"); 
    }else{
    printf("%s","暴打一顿!");
    }   
    return 0;
}

3).多重if语句

一个 if 语句后可跟一个可选的 else if...else 语句,这可用于测试多种条件。

当使用 if...else if...else 语句时,以下几点需要注意:

1.语法

C 语言中的 if...else if...else 语句的语法:

if(boolean_expression 1)
{
   /* 当布尔表达式 1 为真时执行 */
}
else if( boolean_expression 2)
{
   /* 当布尔表达式 2 为真时执行 */
}
else if( boolean_expression 3)
{
   /* 当布尔表达式 3 为真时执行 */
}
else 
{
   /* 当上面条件都不为真时执行 */
}

2.实例
#include <stdio.h>
#include <string.h>

int main(){

    int score;
    printf("%s\n","请输入考试成绩:");
    scanf("%d",&score);

    if(score>100||score<0){
        printf("成绩非法!");
    return -1;
    }

    if(score>=90&&score<=100){
        printf("%s","成绩优秀!");  
    }else if(score>=80&&score<90){
        printf("%s","成绩良好!");
    }else if(score>=60&&score<80){
        printf("成绩及格!");
    }else{
        printf("不及格!");
    }   
    return 0;
}

4.嵌套if语句

在 C 语言中,嵌套 if-else 语句是合法的,这意味着您可以在一个 ifelse if 语句内使用另一个 ifelse if 语句。

1.语法

C 语言中 嵌套 if 语句的语法:

if( boolean_expression 1)
{
   /* 当布尔表达式 1 为真时执行 */
   if(boolean_expression 2)
   {
      /* 当布尔表达式 2 为真时执行 */
   }
}
2.实例
#include <stdio.h>
#include <string.h>

int main(){
    char gender[10];
    int height;
    printf("请输入性别:");
    scanf("%s",&gender);
    printf("请输入身高(cm):");
    scanf("%d",&height);

    if(strcmp(gender, "男")==0){
    if(height>=180){
       printf("恭喜您,入选校男子篮球队!");
    }else{
       printf("很遗憾您未能入选校男子篮球队!");
    }
    }else{
    if(height>=170){
       printf("恭喜您,入选校女子篮球队!");
    }else{
       printf("很遗憾您未能入选校女子篮球队!");
    }
     }
    return 0;
}

5).switch语句

switch 语句是一种有限制的控制流语句,它用于根据表达式的值执行不同的代码块。

一个 switch 语句允许测试一个变量等于多个值时的情况,每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查

1.语法

C 语言中 switch 语句的语法:

switch(expression){
    case constant-expression  :
       statement(s);
       break; /* 可选的 */
    case constant-expression  :
       statement(s);
       break; /* 可选的 */

    /* 您可以有任意数量的 case 语句 */
    default : /* 可选的 */
       statement(s);
}

switch 语句说明:

switch 语句必须遵循下面的规则:

2.流程图

C 中的 switch 语句

3.实例
#include <stdio.h>
#include <string.h>

int main(){
    int score;
    printf("%s\n","请输入考试成绩:");
    scanf("%d",&score);

    if(score>100||score<0){
        printf("成绩非法!");
    return -1;
    }
    int level = score/10;

    switch(level){
    case 10:
    case 9:
          printf("成绩优秀!");
          break;
        case 8:
          printf("成绩良好!");
          break;
        case 7:
        case 6:
          printf("成绩及格!");
          break;
        default:
          printf("不及格!");
          break;            
    }
    return 0;
}

2.循环语句结构

有的时候,我们可能需要多次执行同一块代码。一般情况下,语句是按顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推。

编程语言提供了更为复杂执行路径的多种控制结构。

循环语句允许我们多次执行一个语句或语句组,下面是大多数编程语言中循环语句的流程图:

循环结构

1).循环类型

C 语言提供了以下几种循环类型。点击链接查看每个类型的细节。

循环类型 描述
while 循环 当给定条件为真时,重复语句或语句组。它会在执行循环主体之前测试条件。
do...while 循环 除了它是在循环主体结尾测试条件外,其他与 while 语句类似。
for 循环 多次执行一个语句序列,简化管理循环变量的代码。
多重循环 您可以在 while、for 或 do..while 循环内使用一个或多个循环。

2).循环控制语句

循环控制语句改变你代码的执行顺序。通过它你可以实现代码的跳转。

C 提供了下列的循环控制语句。点击链接查看每个语句的细节。

控制语句 描述
break 语句 终止循环switch 语句,程序流将继续执行紧接着循环或 switch 的下一条语句。
continue 语句 告诉一个循环体立刻停止本次循环迭代,重新开始下次循环迭代。
goto 语句 将控制转移到被标记的语句。但是不建议在程序中使用 goto 语句。

3).死循环

所谓死循环,就是循环条件永远成立,循环会一直进行下去,永不结束。死循环对程序的危害很大,一定要避免。出现死循环通常是因为不满足循环结束的条件,比如忘记更新循环变量的值。

常见的死循环结构有以下三种:

while(1){
   //循环体
}

do{
   //循环体
}while(1);

for(int i=0;;i++){
   //循环体
}

4).while循环

只要给定的条件为真,C 语言中的 while 循环语句会重复执行一个目标语句。

1.语法

C 语言中 while 循环的语法:

while(condition)
{
   statement(s);
}

在这里,statement(s) 可以是一个单独的语句,也可以是几个语句组成的代码块。

condition 可以是任意的表达式,当为任意非零值时都为 true。当条件为 true 时执行循环。 当条件为 false 时,退出循环,程序流将继续执行紧接着循环的下一条语句。

2.流程图

C 中的 while 循环

在这里,while 循环的关键点是循环可能一次都不会执行。当条件为 false 时,会跳过循环主体,直接执行紧接着 while 循环的下一条语句。

3.实例
#include <stdio.h>
#include <string.h>

int main(){

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

5).do...while循环

不像 forwhile 循环,它们是在循环头部测试循环条件。在 C 语言中,do...while 循环是在循环的尾部检查它的条件。

do...while 循环与 while 循环类似,但是 do...while 循环会确保至少执行一次循环。

1.语法

C 语言中 do...while 循环的语法:

do
{
   statement(s);

}while( condition );

请注意,条件表达式出现在循环的尾部,所以循环中的 statement(s) 会在条件被测试之前至少执行一次。

如果条件为真,控制流会跳转回上面的 do,然后重新执行循环中的 statement(s)。这个过程会不断重复,直到给定条件变为假为止。

2.流程图

C 中的 do...while 循环

3.实例
#include <stdio.h>
#include <string.h>

int main(){

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

6).for循环

for 循环允许您编写一个执行指定次数的循环控制结构。

1.语法

C 语言中 for 循环的语法:

for ( init; condition; increment )
{
   statement(s);
}

下面是 for 循环的控制流:

  1. init 会首先被执行,且只会执行一次。这一步允许您声明并初始化任何循环控制变量。您也可以不在这里写任何语句,只要有一个分号出现即可。
  2. 接下来,会判断 condition。如果为真,则执行循环主体。如果为假,则不执行循环主体,且控制流会跳转到紧接着 for 循环的下一条语句。
  3. 在执行完 for 循环主体后,控制流会跳回上面的 increment 语句。该语句允许您更新循环控制变量。该语句可以留空,只要在条件后有一个分号出现即可。
  4. 条件再次被判断。如果为真,则执行循环,这个过程会不断重复(循环主体,然后增加步值,再然后重新判断条件)。在条件变为假时,for 循环终止。
2.流程图

C 中的 for 循环

3.实例
#include <stdio.h>
#include <string.h>

int main(){

    int sum=0;
    for(int n=1;n<=100;n++){
       sum+=n;
    }
    printf("sum=%d\n",sum);
    return 0;
}

三种循环的对比: - while循环do-while循环适合在不确定循环次数的情况下使用,while循环先判断,再循环,有可能一次也不循环,do-while循环先循环,再判断,至少循环一次。 - for循环适合在确定循环次数的情况下使用,语法更简洁,编程中使用频率最高。 - 三种循环都可以相互转换,从本质讲没有任何区别。

7).break

C 语言中 break 语句有以下两种用法:

  1. break 语句出现在一个循环内时,循环会立即终止,且程序流将继续执行紧接着循环的下一条语句。
  2. 它可用于终止 switch 语句中的一个 case。

如果您使用的是嵌套循环(即一个循环内嵌套另一个循环),break 语句会停止执行最内层的循环,然后开始执行该块之后的下一行代码。

1.语法

C 语言中 break 语句的语法:

break;

img

2.流程图

img

3.实例

实例:判断输入的正整数是否是素数。

#include <stdio.h>
#include <string.h>
#include <math.h>

int main(){

    int num;
    printf("请输入一个正整数:\n");
    scanf("%d",&num);

    int flag = 1; //默认是素数
    for(int i=2;i<=sqrt(num);i++){
         if(num%i==0){
        flag = 0;
        break; //已经不是素数了则跳出循环。     
        }
   }

    if(flag){
       printf("num= %d是素数!",num);
    }else{
       printf("num= %d不是素数!",num);
    }

    return 0;
}

8).continue

C 语言中的 continue 语句有点像 break 语句。但它不是强制终止,continue 会跳过当前循环中的代码,强迫开始下一次循环。

对于 for 循环,continue 语句执行后自增语句仍然会执行。对于 whiledo...while 循环,continue 语句重新执行条件判断语句。

1.语法

C 语言中 continue 语句的语法:

continue;

img

2.流程图

C continue 语句

3.实例

实例:玩家输入年龄,如果年龄非法则不停输入。

#include <stdio.h>
#include <string.h>
#include <math.h>

int main(){
    int age;
    while(1){
        printf("请输入玩家的年龄:\n");
    scanf("%d",&age);

    if(age<0||age>200){ //认为年龄非法 
           printf("您输入的年龄不合法!\n");
           continue;
    }
    printf("玩家的年龄是:%d",age);
    break;
     } 
    return 0;
}

4.数组

C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。

数组的声明并不是声明一个个单独的变量,比如 runoob0、runoob1、...、runoob99,而是声明一个数组变量,比如 runoob,然后使用 runoob[0]、runoob[1]、...、runoob[99] 来代表一个个单独的变量。

所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。

C 中的数组

数组中的特定元素可以通过索引访问,第一个索引值为 0

C 语言还允许我们使用指针来处理数组,这使得对数组的操作更加灵活和高效。

img

1.一维数组

1.声明数组

在 C 中要声明一个数组,需要指定元素的类型和元素的数量,如下所示:

type arrayName [ arraySize ];

这叫做一维数组。arraySize 必须是一个大于零的整数常量,type 可以是任意有效的 C 数据类型。例如,要声明一个类型为 double 的包含 10 个元素的数组 balance,声明语句如下:

double balance[10];

现在 balance 是一个可用的数组,可以容纳 10 个类型为 double 的数字。

数组有三大特征:

  1. 连续
  2. 大小固定
  3. 类型一致

2.初始化数组

在 C 中,您可以逐个初始化数组,也可以使用一个初始化语句,如下所示:

double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};

大括号 { } 之间的值的数目不能大于我们在数组声明时在方括号 [ ] 中指定的元素数目。

如果您省略掉了数组的大小,数组的大小则为初始化时元素的个数。因此,如果:

double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};

您将创建一个数组,它与前一个实例中所创建的数组是完全相同的。下面是一个为数组中某个元素赋值的实例:

balance[4] = 50.0;

上述的语句把数组中第五个元素的值赋为 50.0。所有的数组都是以 0 作为它们第一个元素的索引,也被称为基索引,数组的最后一个索引是数组的总大小减去 1。以下是上面所讨论的数组的的图形表示:

数组表示

下图是一个长度为 10 的数组,第一个元素的索引值为 0,第九个元素 runoob 的索引值为 8:

img

3.遍历数组元素

数组元素可以通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后边。例如:

double salary = balance[9];

上面的语句将把数组中第 10 个元素的值赋给 salary 变量。下面的实例使用了上述的三个概念,即,声明数组、数组赋值、访问数组:

#include <stdio.h>

int main ()
{
   int n[ 10 ]; /* n 是一个包含 10 个整数的数组 */
   int i,j;

   /* 初始化数组元素 */         
   for ( i = 0; i < 10; i++ )
   {
      n[ i ] = i + 100; /* 设置元素 i 为 i + 100 */
   }

   /* 输出数组中每个元素的值 */
   for (j = 0; j < 10; j++ )
   {
      printf("Element[%d] = %d\n", j, n[j] );
   }

   return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

Element[0] = 100
Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104
Element[5] = 105
Element[6] = 106
Element[7] = 107
Element[8] = 108
Element[9] = 109

2.多维数组

C 语言支持多维数组。多维数组声明的一般形式如下:

type name[size1][size2]...[sizeN];

例如,下面的声明创建了一个三维 5 . 10 . 4 整型数组:

int threedim[5][10][4];

1.声明二维数组

多维数组最简单的形式是二维数组。一个二维数组,在本质上,是一个一维数组的列表。声明一个 x 行 y 列的二维整型数组,形式如下:

type arrayName [ x ][ y ];

其中,type 可以是任意有效的 C 数据类型,arrayName 是一个有效的 C 标识符。一个二维数组可以被认为是一个带有 x 行和 y 列的表格。下面是一个二维数组,包含 3 行和 4 列:

int x[3][4];

C 中的二维数组

2.初始化二维数组

多维数组可以通过在括号内为每行指定值来进行初始化。下面是一个带有 3 行 4 列的数组。

int a[3][4] = {  
 {0, 1, 2, 3} ,   /*  初始化索引号为 0 的行 */
 {4, 5, 6, 7} ,   /*  初始化索引号为 1 的行 */
 {8, 9, 10, 11}   /*  初始化索引号为 2 的行 */
};

内部嵌套的括号是可选的,下面的初始化与上面是等同的:

int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};

3.访问二维数组

二维数组中的元素是通过使用下标(即数组的行索引和列索引)来访问的。例如:

int val = a[2][3];

上面的语句将获取数组中第 3 行第 4 个元素。您可以通过上面的示意图来进行验证。让我们来看看下面的程序,我们将使用嵌套循环来处理二维数组:

#include <stdio.h>

int main ()
{
   /* 一个带有 5 行 2 列的数组 */
   int a[5][2] = { {0,0}, {1,2}, {2,4}, {3,6},{4,8}};
   int i, j;

   /* 输出数组中每个元素的值 */
   for ( i = 0; i < 5; i++ )
   {
      for ( j = 0; j < 2; j++ )
      {
         printf("a[%d][%d] = %d\n", i,j, a[i][j] );
      }
   }
   return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

a[0][0] = 0
a[0][1] = 0
a[1][0] = 1
a[1][1] = 2
a[2][0] = 2
a[2][1] = 4
a[3][0] = 3
a[3][1] = 6
a[4][0] = 4
a[4][1] = 8