在学习一维数组之前请先查数组的概念

更重要了,听不懂的话就听不懂指针了

思考

如何保存50名学生的信息

理论讲解

数组的概念

数组的概念
一组具有同样类型的数据的结合
if(int i<5) 和 if(a[0]<5)一样的用法

一维数组的定义和引用

定义

一般形式:类型说明符 数组名[常量表达式]
int num[10];
float score[40];
char name[20];

作用:分配一组连续的内存单元

应用说明

说明
  • 数组必须先定义后使用
  • 数组的命名规则与变量相同。(回顾)
  • 常量表达式表示数组的长度。常量表达式不允许包含变量,即数组的长度是固定的,不能动态定义。
  • 数组下标从0开始
    int i = 10;
    int num[i];
    //这是错的,i 是变量!定义的时候只能是数字


引用
逐个引用元素,不能进行整体的引用
引用的一般形式:
数组名[下标表达式]
例:
a[0]=50;
a[1]=100;
a[2]=a[0]+a[1];

下标表达式可以是整型常量、整型变量 或 整型表达式。
例如:

int a[10];
a[i](0<=i<10)
a[2*3]



例:
从键盘输入10个数

方法一:用变量
scanf
方法二:用数组
循环控制
int a[10],i;
for(i=0;i<10)
{
    scanf("%d",&a[i]);
}
for(i=0;i<10;i++)
{
    printf("%d\n",a[i]);
}


初始化

初始化:指在定义时指定初始值,编译器把初值赋给数组变量
1.对全部数组元素赋初值

int a[4]={1,2,3,4};
int a[]={1,2,3,4,5,6};给全部元素赋初值时,数组长度可省略。

2.可以只给一部分元素赋初值

int a[10]={0,1,2,3};    //剩余值自动赋0;
int a[10]={0};   //全部赋为0;
在运行阶段赋值
for(i=0;i<10;i++)
    {
        scanf("%d",&a[i]);
    }

习题

第一题

  1. 定义一个int类型数组,数组里有5个元素。
  2. 在屏幕上输入5个元素的值
  3. 将所有元素的数值输出到屏幕上
  4. 使数组中小于5的数组元素加10,并在屏幕上输出修改后的完整数组。

注意三个循环,分别是输入、输出、判断是否需要+10


输出结果样图:
样图

答案

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
    int a[5],i;
    printf("输入一个5个数的数组\n");
    for(i=0;i<5;i++)
    {
        printf("请输入第%d个数组:",i+1);  //i+1是为了美观,等同于i。
        scanf("%d",&a[i]);
        if(i==4)
        {
            printf("\n\n");
        }
    }

    for(i=0;i<5;i++)
    {
        printf("第%d个数字为:%d\n",i+1,a[i]);
    }
    printf("\n\n");
    for(i=0;i<5;i++)
    {
        if(a[i]<5)
        {
            a[i]=a[i]+10;
        }
        printf("修改后的第%d个数组为%d\n",i,a[i]);
    }
    return 0;
 }

第二题

从键盘输入10个整形数据,找出最大值和最大值的下标并输出。
结果样图
2024-07-17T11:21:15.png

答案

int _tmain(int argc, _TCHAR* argv[])
{
    int num[10],i,max=0,max_i=0;
    printf("请输入一个10个数的数组:\n");
    for(i=0;i<10;i++)
    {
        printf("请输入第%d个数:\n",i);
        scanf("%d",&num[i]);
        if(i==9)
        {
               printf("\n\n");
        }
    }
    for(i=0;i<10;i++)
    {
        printf("输入的第%d个数字是:%d\n",i,num[i]);
            if(i==9)
        {
                printf("\n\n");
        }
    }
    for(i=0;i<10;i++)
    {
        if(num[i]>max)
        {
            max=num[i];
                max_i=i;
        }
    }
    printf("最大值是:%d\n",max);
    printf("最大值的下角标是:%d\n",max_i);
    return 0;
}

字符数组

理论讲解

  • 字符数组的定义、初始化及应用

字符数组也是数组,只是数组元素的类型为字符型。所以字符数组的定义、初始化,字符数组数组元素的引用与一般的数组类似。

char a[10]:

a[0]a[1]a[2]a[3]      (char i;)

char 是字符型,标准是'i','a',''空格也可以。第一节课就说了。
跟之前的数组区别于:

  • 字符数组:存放字符型数据的数组。

C语言没有提供字符串变量,对字符串的处理常常采用字符数组实现。

C语言许多字符串处理库函数可以使用字符串,也可以使用字符数组。

C语言为了处理字符串方便,规定了以'\0'作为“字符串结束标志”。

字符数组和字符串有关系

  • 字符数组的初始化

                1. 以字符常量的形式对字符数组初始化。
                2. 以字符串(常量)的形式对字符数组初始化。
                (系统会自动在最后一个字符后加'\0')
例如:char str[100]={'c','h','i','n','a'};

CHINA

例如:char str[100]="china";

CHINA\0

区别在\0

应用

char c1[10] = {'I',' ','a','m',' ','h','a','p','p','y'};
char c2[] = {'I',' ','a','m',' ','h','a','p','p','y'};
char c3[11] = {'I',' ','a','m',' ','h','a','p','p','y'};    //其余元素值会给 \0
int i;
for(i=0;i<10;i++)
{
        printf("%c",c1[i]);
}
printf("\n");

char d[] = {"I am happy"};
char c4[] = {'I',' ','a','m',' ','h','a','p','p','y','\0'};
printf("d--%s\n",d);
printf("c4--%s\n",c4);

结果参考

字符串处理函数

#include <string.h>

 1. 字符串输入 / 输出函数。gets(str1) / puts(str1)     //void
 2. 字符串长度strlen(str)                             //有返回值,int,int i=strlen(str1)
 3. 字符串连接函数strcat(str1,str2)                   //void
 4. 字符串复制函数strcpy(str1,str2)                   //void
 5. 字符串比较函数strcmp(str1,str2)                  //void

看批注
引用 #include <string.h> 就省略了定义和声明,可以直接调用了。
void是无返回值,函数那节课讲过

理论讲解

  1. 字符串输入、输出函数

字符串输入 gets(str);
功能:从键盘输入一个字符串(可包含空格),直到遇到回车符,并将字符串存放到由str指定的字符数组(或内存区域)中。

字符串输出 puts(str);
功能:从str指定的地方开始,依次将存储单元中的字符输出到显示器,直到遇到“字符串”结束标志。

使用

printf("\n使用puts输出\n");
puts(str);

<----------------------------------------------------------------->

printf("\n\ngets puts---------------\n\n");
char str[100];//1 2 3 4 \0
printf("请输入字符串");
gets(str);
printf("直接使用s输出:%s\n",str);


  1. 字符串长度strlen(str);

功能:统计str为起始地址的字符串的长度(不包括“字符串的结束标志”),并将其作为函数值返回。

使用

printf("\n\nstrlen()函数\n");
int len;
len = strlen(str);//不包括字符串结束标志\0      1 2 3 4 \0
printf("\n111字符串长度为%d\n",len);
printf("\n222字符串长度为%d\n",strlen(str));


  1. 字符串连接函数strcat(str1,str2)
    功能:将str2为首地址的字符串连接到str1字符串的后面。从str1原来的‘\0’(字符串结束标志)处开始连接。
char str1[100]=1234\0
char str1[100]=6789\0
str1=str1+str2
str1=1 2 3 4 6 7 8 9 \0
str2不变
str2=6789\0

使用

printf("\n\nstract函数\n");
char str1[100];
char str2[100];
printf("使用gets输入str1:\n");
gets(str1);//A B C \0
printf("使用puts输入str2:\n");
gets(str2);//C D D \0
printf("使用stract拼接str1+str2:\n");
strcat(str1,str2);//str1 = abc\0    str2 = cdd\0
//str1 = abccdd\0
//str2 = cdd\0
printf("拼接后的str1\n");
puts(str1);//把第二个变量拼接到第一个变量之后,需要使用string头文件
//printf("%s",str1);
printf("拼接后的str2\n");
puts(str2);

void类型,无返回值。


  1. 字符串复制函数strcpy(str1,str2)
    功能:将str2为首地址的字符串复制到str1为首地址的字符数组中。

str2的内容复制到str1,没有变量去接,所以无返回值
使用

//str1 abccda\0
//str2 cdd\0
printf("\n\nstrcpy函数\n");
strcpy(str1,str2);//str2 abc\0        str1 cde\0
printf("执行strcpu(str1,str2)后的str1\n");
puts(str1);//把第二个变量覆盖到第一个变量之后,需要使用string头文件
printf("执行strcpy(str1,str2)str2\n");
puts(str2);


  1. 字符串比较函数strcmp(str1,str2)
    功能:将str1,str2为首地址的两个字符串进行比较,比较的结果由返回值表示。
    当str1=str2,函数的返回值为0;
    当str1<str2,函数的返回值为-1;
    当str1>str2,函数的返回值为1;

两个字符串自左向右逐个字符相比(按ASCII值大小比较),直到出现不同的字符或‘\0’为止。
如:

1."A"<"B"
2."A"<"AB"
3."Apple"<"Banana"
4."A"<"a"
5."compare"<"computer"

不等于的情况下返回非零
使用

printf("\n\n    strcmp函数\n");
//数据库里存的是123456,屏幕上输出的是1234567
printf("输入str1:\n");
gets(str1);//132
printf("输入str2:\n");
gets(str2);//132
int cmp = strcmp(str1,str2);
if(cmp = 0)
{
    printf("相等\n");
}
else
{
    printf("不相等\n");
}

总结

回顾总结

最后修改:2024 年 08 月 12 日
如果觉得我的文章对你有用,请随意赞赏