C语言 第七章 数组与字符串

简介: 一、数组 1.1、数组的概念 用来存储一组相同类型数据的数据结构。有点像班上放手机的手机袋,超市的储物柜。 特点:只能存放一种类型的数据,如全部是int型或者全部是char型,数组里的数据成为元素。

一、数组

1.1、数组的概念

用来存储一组相同类型数据的数据结构。有点像班上放手机的手机袋,超市的储物柜。

特点:只能存放一种类型的数据,如全部是int型或者全部是char型,数组里的数据成为元素。

1.2、数组的定义

格式: 类型 数组名[元素个数];

举例:存储5个人的年龄

int ages[5]; //在内存中开辟4x5=20个字节的存储空间

char str[]={'x','y'};

char str[]="xy";

double array[10];

可以在定义数组的同时对数组进行初始化:

int ages[5]={17,18,19,20,21};

遍历数组:

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

{

printf(“ages[%d]=%d\n”,i,ages[i]);

}

注意:

(1)数组的初始化

①.int ages[5]={17,18,19,20,21};//一般写法

②. int ages[5]={17,18};//只对前两个元素赋值

③. int ages[5]={[3]=10,[4]=11};//对指定的元素赋值,这里为第三个和第四个

④. int ages[]={11,12,13}.//正确,右边的元素确定,则个数可以省略这里为3个。

⑤. int ages[];//错误,编译器无法知道应该分配多少的存储空间

⑥. int ages[5];ages={17,18,19,20,21};//错误,只能在定义数组时这样进行初始化

⑦. int ages[‘A’]={1,2,3};//正确,相当于是ages[65]

⑧. int count=5;int ages[count];//如果不进行初始化,则这种写法正确,编译器不会报错为其分配20个字节的存储空间,ages[0]=1;ages[1]=2;可以像这样对数组的元素进行赋值,但是2,3,4等元素的值时不确定的。

⑨. 而int count=5;int ages[count]={1,2,3,4,5};//这种写法是错误的,在定义数组时对数组进行初始化,元素的个数必须为常量或者不写,不能是一个变量

但是访问数组时,是利用相同的数组名和其不同的下标来访问,下标必须从0开始计算,那么最后一个元素的下标就是“长度-1”。即数组元素的一般形式为:数组名[下标] 

#include "stdio.h"
void main()
{
    //数组定义
    int a[5],i;  //定义长度为5的int类型数组,相当于定义了5个变量
    
    //使用数组元素,0-5叫下标
    a[0]=100;
    a[1]=200;
    a[2]=300;
    a[3]=400;
    a[4]=500;
    
    //循环输入
    for(i=0;i<5;i++)
    {
        scanf("%d",&a[i]);
    }
    
    //遍历数组中的每一个元素
    for(i=0;i<5;i++)
    {
        printf("%d \n",a[i]);
    }
}

1.3、计算平均成绩与总分

/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{
    //定义一个长度为10的float类型的数组,
    //循环输入10个学生的成绩
    //计算出平均成绩与总分
    //数组定义
    int i;
    float mark[10],s=0;  //定义float数组,长度为10,0-9
    for(i=0;i<10;i++)
    {
        printf("mark[%d]=",i);
        scanf("%f",&mark[i]);
    }
    
    for(i=0;i<10;i++)
    {
        s=s+mark[i];
    }
    
    printf("总分:%.2f",s);
    printf("平均分:%.2f",s/10);
}

1.4、数组初始化

初始化赋值的一般形式为:
类型说明符 数组名[常量表达式]={值,值……值};
其中在{ }中的各数据值即为各元素的初值,各值之间用逗号间隔。例如:
int a[10]={ 0,1,2,3,4,5,6,7,8,9 };
相当于a[0]=0;a[1]=1...a[9]=9;

可以只给部分元素赋初值,但值的个数多于数组元素个数则不行;当{ }中值的个数少于数组元素个数时,则只给前面部分元素赋值,多于数组元素个数时,则越界。
只能给元素逐个赋值,不能给数组整体赋值。
如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。

#include "stdio.h"
void main()
{
    int i,a[]={1,2};
   
    for(i=0;i<3;i++)
    {
        printf("%d\n",a[i]);
    }
   
}

1

2

1.5、求数组中最大数

#include "stdio.h"
void main()
{
    int a[]={95,59,98,0,35,46,8,-1,99,98},max,i;
    
    //假定最大数为a[0]
    max=a[0];
    
    //遍历,枚举
    for(i=1;i<10;i++)
    {
        if(a[i]<max)
        {
            max=a[i];
        }
    }
    printf("%d",max);
}

99

1.6、冒泡排序

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。

冒泡排序算法的运作如下:(从后往前)
  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

冒泡排序舞蹈演示

/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{
   //冒泡排序
   int a[]={195,99,98,0,-35,46,8,-10,99,98},i,j,t;
   for(i=0;i<9;i++)
   {
        for(j=0;j<9-i;j++)
        {
            if(a[j]>a[j+1])
            {
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
   }
   
   for(i=0;i<10;i++)
    printf("%d \n",a[i]);
    
}

N个数排序,外重循环N-1,内重循环N-1-i,比较交换

二、字符串

2.1、字符串概念与定义

C语言中的字符数组就是一个字符串,字符串是一个特殊的字符数组。

单字符数组的定义
例如:
char c[10]; /*单字符数组,即一串字符*/
单字符数组的初始化
例如:
char c[10]={'H','e','l','l','o','\0'};
char c[]={'H','e','l','l','o',0};
这种初始化方法,系统不会自动给其加上字符串结束符,即’\0’字符,所以要人为加上。
字符串结束标志:在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。字符串常量总是以'\0'作为字符串的结束符。因此当把一个字符串存入一个数组时,也把结束符'\0'存入数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,就不必再用字符数组的长度来判断字符串的长度了。

/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{
   //字符串 (糖葫芦)
   char str[]={'H','e','l','l','o','\0'};
   int i;
   char str1[]="Kitty";
   printf("%s",str1);
   
   for(i=0;i<5;i++)
   printf("\n %c",str1[i]);
   
}

2.2、字符串输入与输出

2.2.1、使用scanf与printf可以完成字符串的输入

char str[100];

scanf("%[^\n]s",str);

printf("%s",str);

2.2.2、使用gets,puts完成

/* Note:Your choice is C IDE */
#include "stdio.h"
#include "string.h"

void main()
{
    //数组字符串输入时不需要&取地址
    char name[100];
    gets(name);  //从键盘输入字符串
    puts(name);  //输出字符串
}

2.3、字符串连接函数strcat

格式:
strcat (字符数组名1,字符数组名2)
功能:
把字符数组2中的字符串连接到字符数组1 中字符串的后面,并删去字符串1后的串标志“\0”。本函数返回值是字符数组1的首地址。
注意:第一个参数只能是字符数组变量,而不能是字符串常量

#include "stdio.h"
#include "string.h";

void main()
{
    char str1[100]="Hello";
    char str2[]=" Kitty";
    //使用strcat函数将str2的内容复制到
    //str1中,只适用于字符串
    strcat(str1,str2);
    printf("%s \n",str1);   
    printf("%s \n",str2);   
}

2.4、字符串拷贝函数strcpy 

格式:
strcpy (字符数组名1,字符数组名2)
功能:
把字符数组2中的字符串拷贝到字符数组1中。字符串结束标志“\0”也一同拷贝。字符数组2,也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组

/* Note:Your choice is C IDE */
#include "stdio.h"
#include "string.h";

void main()
{
    char str1[100]="Boy!";
    char str2[]="Girl!";
    printf("%s \n",str1);   
    printf("%s \n",str2); 
    
    //将str2的内容复制到str1中
    strcpy(str1,str2);
    
    printf("%s \n",str1);   
    printf("%s \n",str2);   
}

2.5、字符串比较函数strcmp

格式:
strcmp(字符数组名1,字符数组名2)
功能:
按照ASCII码顺序比较两个数组中同位字母的大小,并由函数返回值返回比较结果。
字符串1=字符串2的话,返回值=0;
字符串2>字符串2的话,返回值 >0;
字符串1<字符串2的话,返回值 <0。
本函数也可用于比较两个字符串常量,或比较数组和字符串常量。

/* Note:Your choice is C IDE */
#include "stdio.h"
#include "string.h";

void main()
{
    char str1[]="abe123";
    char str2[]="abd";
    //-1 小于
    //0 等于
    //1 大于
    printf("%d",strcmp(str1,str2));
}

 

 1

2.6、获得字符串长度函数strlen 

格式:
strlen(字符数组名)
功能:
计算数组里字符串的实际长度(不含字符串结束标志‘\0’) 并将长度作为函数返回值;也可以计算字符串常量的长度。

/* Note:Your choice is C IDE */
#include "stdio.h"
#include "string.h";

void main()
{
    char str1[]="abe123";
    //获得字符串长度,中文占两位
    printf("\n %d",strlen(str1)); 
}

6

更多函数请点击这里

2.7、数组移动作业 P181

/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{
    //10
    int a[]={3,6,9,15,18,26,98,0,0,0},n,p=7,i;
    
    //输入要插入的数
    scanf("%d",&n);
    
    //确定位置
    for(i=0;i<7;i++)
    {
        if(a[i]>=n)//如果数组中的当前数与n相同
        {
            p=i;
            break;
        }
    }
    
    //移动
    for(i=7;i>=p;i--)
    {
        a[i]=a[i-1];
    }
    
    //插入
    a[p]=n;
    
    //显示结果
    for(i=0;i<8;i++)
    {
        printf("%d \t",a[i]);
    }
    
}

三、二维数组

一组数组是线性的,二组数组是平面的

/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{
    int a[3][3],i,j;
    
    a[0][0]=1;
    a[0][1]=5;
    
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            a[i][j]=i*j;
        }
    }
    
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            printf("a[%d][%d]=%d \t",i,j,a[i][j]);
        }
        printf("\n");
    }
}

/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{
    int a[3][3]={{1,2,3},{4,5,6},{7,8,9}},i,j;
   
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            printf("a[%d][%d]=%d \t",i,j,a[i][j]);
        }
        printf("\n");
    }
}

四、上课示例与作业源文件下载

点击下载

 

目录
相关文章
|
1月前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
72 10
|
1月前
|
传感器 算法 安全
【C语言】两个数组比较详解
比较两个数组在C语言中有多种实现方法,选择合适的方法取决于具体的应用场景和性能要求。从逐元素比较到使用`memcmp`函数,再到指针优化,每种方法都有其优点和适用范围。在嵌入式系统中,考虑性能和资源限制尤为重要。通过合理选择和优化,可以有效提高程序的运行效率和可靠性。
119 6
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
76 5
|
2月前
|
存储 算法 C语言
C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项
本文深入探讨了C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项,并通过案例分析展示了实际应用,旨在帮助读者提高编程效率和代码质量。
134 4
|
2月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
2月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
2月前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
2月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
62 4
|
3月前
|
存储 编译器 C语言
【c语言】数组
本文介绍了数组的基本概念及一维和二维数组的创建、初始化、使用方法及其在内存中的存储形式。一维数组通过下标访问元素,支持初始化和动态输入输出。二维数组则通过行和列的下标访问元素,同样支持初始化和动态输入输出。此外,还简要介绍了C99标准中的变长数组,允许在运行时根据变量创建数组,但不能初始化。
67 6
|
3月前
|
存储 人工智能 BI
C语言:数组的分类
C语言中的数组分为一维数组、多维数组和字符串数组。一维数组是最基本的形式,用于存储一系列相同类型的元素;多维数组则可以看作是一维数组的数组,常用于矩阵运算等场景;字符串数组则是以字符为元素的一维数组,专门用于处理文本数据。
128 9