C语言学习——3

一、数组

  1. 数组:相同元素的集合,在内存中会分配——片连续的空间
  2. 构造数据类型之一 int a[6]
  3. 数组是具有-定顺序关系的若千个变量的集合,组成数组的各个变量称为数组的元素。
  4. 数组中各元素的数据类型要求相同,用数组名和下标确定。数组可以是- -维的,也可以是多维的。

1.定义

所谓一维数组是指只有一个下标的数组。它在计算机的内存中是连续存储的。

C语言中,一维数组的说明一般形式如下:

<存储类型>	<数据类型>	<数组名>[<表达式>];

eg:
	int array[10];

下标: 
	访问元素时,需要通过下标确定要访问的元素
    下标从0开始,到n-1结束
    例如: arr[0] ~ arr[5]
赋值:
	arr[1] = 10;	//"只能单独给某个元素赋值"

计算数组所占空间大小:
	sizeof(数组名);
计算元素个数:
	sizeof(数组名)/sizeof(元素数据类型)  

2.初始化

  1. 完全初始化

    int arr[5] = {1,2,3,4,5};
    
  2. 部分初始化

    int arr[5] = {1,2,3};	//未赋值的元素为0
    
  3. 利用下标初始化

    int arr[5] = {0}		//初始化(全0)
    arr[0] = 1;
    arr[1] = 2;
    
    
    int arr[5] = {10 , [2] = 3 , 6}		//初始化
    //输出结果:	10 0 3 6 0
    
  4. 自动计数原则(不定义数组的大小)

    int arr[] = {1,2,3};	//必须赋初值,共有3个元素
    
  5. 可变数组(C99语法才支持)

    可变数组不能初始化,一旦被定义,数组大小就不会改变

    int n = 10;
    int a[n];
    a[0] = 10;
    

3.赋值

int a[5];
a[0] = 10;
a[1] = 20;


int a[5] = {1,2,3,4,5};
int b[5];
b = a;		//错误,数组不可以直接复制

注意:

1.只有在初始化时,才可以对多个元素进行操作,后续的所有使用操作都只能使用单个元素

2.数组越界问题

练习

定义一个数组,遍历数组并将所有元素加起来求和并打印

/*===============================================
*   文件名称:eg1.c
*   创 建 者:青木莲华
*   创建日期:2025年07月16日
*   描    述:定义一个数组
================================================*/
#include <stdio.h>

int main(int argc, char *argv[])
{ 
    int arr[5] = {1,2,3,4,5};
    for(int i = 0 ; i < 5 ; i++) 
        printf("arr[%d] = %d\n",i,arr[i]);
    return 0;
} 

运行截图

alt

二、字符型数组

char str[32] = {0};
char str[32] = "hello world";
//遍历字符串
	char str[] = "abcdefg";
	for(i = 0 ; str[i] != '\0' ; i++)
        printf("%c",str[i]);
	printf("\n");
//输出结果:	abcdefg
//字符串遍历以结束符'\0'为结束位置

字符型数组 又叫 字符串

  1. C语言中没有字符串数据类型,但是有字符串常量
  2. 字符串由字符和结束符('\0')组成
  3. 字符串在C语言中一般使用数组或者指针存储
  4. 只要是用" " 双引号引用的都叫字符串
  5. 字符串长度不包括结束符,但是字符个数会包含结束符

练习

输入一个数组的所有元素,找出最大值及其下标

/*===============================================
*   文件名称:eg2.c
*   创 建 者:青木莲华     
*   创建日期:2025年07月16日
*   描    述:找数组最大值
================================================*/
#include <stdio.h>

int main(int argc, char *argv[])
{ 
    int arr[10] = {0};
    int i = 0,max = 0,index = 0;
    while(i < 10)
    {
        scanf("%d",&arr[i]);
        getchar();
        i++;
    }
    while(i >= 0)
    {
        if(arr[i] > max)
        {
            max = arr[i];
            index = i;
        }
        i--;
    }
    printf("The array's max_num is : %d\n",max);
    printf("The max_num's index is : %d\n",index);
    return 0;
} 

运行截图

alt

1.字符串相关函数

#include <string.h>
1. strlen字符串长度函数
size_t strlen(const char *s);
//参数:
	const char *s;	//字符串首地址
//返回值:
	size_t : 		//字符串长度 long型
//eg:
	char str[] = "hello world";
	printf("%ld\n",strlen(str));
	printf("%ld\n",strlen("1111111"));
//长度不包含结束符
2.strcpy字符串拷贝函数
/*
注意:
	strcpy会拷贝'\0'
*/


	char *strcpy(char *dest, const char *src);
/*
参数:
	char *dest : 拷贝目标首地址
	const char *src : 被拷贝字符串的首地址
返回值:
	char *:返回拷贝的目标的首地址
*/



//拷贝指定数目(不完全拷贝)
	char *strncpy(char *dest,const char *src , size_t n);
/*
参数:
	char *dest : 拷贝目标首地址
	const char *src : 被拷贝字符串的首地址
	size_t n : 拷贝字符的数目
返回值:
	char *:返回拷贝的目标的首地址
*/

eg:

int main(){
	char str[] = "hello world";
    char str2[strlen(str)+1];
 	//完全复制   
    strcpy(str2,str);
    printf("str2 = %s\n",str2);
    
    //替换string (这里设置为0  清空了数组)
    memset(str2 , 0 ,sizeof(str2));
    //部分复制
    strncpy(str2,str,5);
    printf("str2 = %s\n",str2);
}
3.strcat字符串追加函数(拼接)
/*
注意 : 会追加结束符
*/


char *strcat(char *dest,const char *src);
/*
参数:
	char *dest : 拷贝目标首地址
	const char *src : 被追加字符串的首地址
返回值:
	char *:返回追加后字符串的首地址
*/


char *strncat(char *dest,const char *src,size_t n);
/*
参数:
	char *dest : 拷贝目标首地址
	const char *src : 被追加字符串的首地址
	size_t : 追加的字符个数
返回值:
	char *:返回追加后字符串的首地址
*/

eg:

char s1[] = {"hello "};
char s2[] = {"world"};

strcat(s1,s2);

strncat(s1,s2,5);
4.strcmp字符串比较函数
int strcmp(const char *s1,const char *s1);
/*
参数:
	const char *s1;	字符串1的首地址
	const char *s2; 字符串2的首地址
返回值:
	如果两个字符串相同,返回0
	不相同返回非0
	比较逻辑是用两个字符串的ASCII码相减的方式来比较的
*/

eg:

char s1[] = {"hello "};
char s2[] = {"world"};

//接收返回参数  0 为相同  非0为不同
int ret = strcat(s1,s2);
练习

实现strlen功能,在终端输入字符串打印并输出字符串长度

/*===============================================
*   文件名称:eg3.c
*   创 建 者:青木莲华     
*   创建日期:2025年07月16日
*   描    述:手动实现strlen功能
================================================*/
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{ 
    char str[20];
    gets(str);
    int length = 0,i = 0;
    while(str[i] != '\0') 
    {
        i++;
        length++;
    }
    printf("length : %d\n",length);
    printf("str : %s\n",str);
    return 0;
} 

alt

三、多维数组

/*
<存储类型>	<数据类型>	<数组名>[<常量表达式1>] [<常量表达式2>]....
*/
int a[2][3];		//二维数组 2行3列
int b[1][2][3];		//三位数组

1.初始化:

/*
	定义方式:
		数据类型 数组名[常量表达式1][常量表达式2]
*/
//1.完全初始化
int a [3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int a [2][3] = {{1,2,3} , {2,3,4}};
//2.部分初始化
int a[3][4] = {1,2,3,4,5};
int a[3][4] = {{1,2,3} , {4} , {5}};	//a[1][0] = 4  a[2][0] = 5
int a[3][4] = {{1,[2]=2,3},{[2]=4},{5}};
//3.自动计数原则(只能缺省第一个,不能缺省第二个)
int a[][4] = {1,2,3,4};

2.赋值

int a[3][4];
a[0][0] = 10;

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

//遍历
for(int i = 0 ; i < 3 ; i++)
{
    for(int j = 0 ; j < 4 ; j++)
    {
        printf("arr[%d][%d] = %d\n",i,j,a[i][j]);
    }
}

char arr[][] = {"hello" , "world" , "!"};

3.二维字符型数组

char arr[3][32] = {"hello","world","abc"};
puts(arr[0]);								//输出: hello
puts(arr[1]);								//输出: world

练习:冒泡排序

alt

/*===============================================
*   文件名称:eg4.c
*   创 建 者:青木莲华     
*   创建日期:2025年07月16日
*   描    述:冒泡排序
================================================*/
#include <stdio.h>

int main(int argc, char *argv[])
{ 
    int arr[8] = {32,12,5,9,8,11,2,3};
    int len = sizeof(arr)/sizeof(int),temp = 0;
    for(int k = 0 ; k < len; k++)
    {   
        printf("%4d",arr[k]);
    }
    printf("\n");
    for(int i = 0 ; i < len - 1; i++)
    {
        for(int j = 0 ; j < len - 1 - i ; j++)
        {
            if(arr[j] > arr[j + 1])
            {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
    for(int k = 0 ; k < len; k++)
    {
        printf("%4d",arr[k]);
    }
    printf("\n");
    return 0;
} 

作业:

  1. 二维数组冒泡排序

    /*===============================================
    *   文件名称:work1.c
    *   创 建 者:青木莲华     
    *   创建日期:2025年07月16日
    *   描    述:二维数组冒泡排序
    ================================================*/
    #include <stdio.h>
    
    int main(int argc, char *argv[])
    { 
        int arr[3][6] = {{23,5,43,2,58,8} , {33,44,22,11,77,5} , {12,31,11,56,7,1}};
        int temp = 0;
        for(int i = 0 ; i < 3 ; i++)
        {
            for(int j = 0 ; j < 5 ; j++)
            {
                for(int k = 0 ; k < 5 - j ; k++)
                {
                    if(arr[i][k] > arr[i][k + 1])
                    {
                        temp = arr[i][k];
                        arr[i][k] = arr[i][k + 1];
                        arr[i][k + 1] = temp;
                    }
                }
            }
        }
        for(int i = 0 ; i < 3 ; i++)
        {
            printf("arr[%d] : ",i);
            for(int j = 0 ; j < 6 ; j++)
                printf("%3d",arr[i][j]);
            printf("\n");
        }
        return 0;
    } 
    
    

alt

  1. 手动实现strcpy、strcmp 功能

    /*===============================================
    *   文件名称:work2.c
    *   创 建 者:青木莲华     
    *   创建日期:2025年07月16日
    *   描    述:手动实现strcpy、strcmp函数功能
    ================================================*/
    #include <stdio.h>
    #include <string.h>
    
    int main(int argc, char *argv[])
    { 
        //1.初始化参数
        char arr1[32];
        char arr2[32];
        char arr3[32] = "hello world!";
        int i = 0,flag = 1;
        //2.输入字符串
        printf(">:");
        gets(arr1);
        //3.复制
        while(arr1[i] != '\0')
        {
            arr2[i] = arr1[i];
            i++;
        }
        arr2[i] = '\0';
        printf("copy >: ");
        puts(arr2);
        //4.比较
        i = 0;
        //先判断两字符串长度是否相等
        if(strlen(arr1) == strlen(arr3))
        {
            while(arr1[i] != '\0')
            {
                if(arr1[i] != arr3[i])
                    flag = 0;
                i++;
            }
        }
        else
            flag = 0;
    
    
        if(flag)
            printf("is_equal\n");
        else
            printf("not_equal\n");
    
        return 0;
    } 
    
    

alt

  1. 选择排序

    /*===============================================
    *   文件名称:work3.c
    *   创 建 者:青木莲华     
    *   创建日期:2025年07月16日
    *   描    述:选择排序
    ================================================*/
    #include <stdio.h>
    
    int main(int argc, char *argv[])
    { 
        int arr[10] = {32,4,6,43,77,95,45,68,12,98};
        int len = sizeof(arr)/sizeof(int);
        int temp,index;
        //未排序输出
        printf("before>:");
        for(int i = 0 ; i < len ; i++)
        {
            printf("%3d",arr[i]);
        }
        printf("\n");
        //选择排序
        for(int i = 0 ; i < len - 1 ; i++)
        {
            index = i;
            for(int j = i + 1 ; j < len ; j++)
            {
                if(arr[index] > arr[j])
                {
                    
                    index = j;
                }
            }
            //交换
            temp = arr[i];
            arr[i] = arr[index];
            arr[index] = temp;
        }
        //输出
        printf("after>:");
        for(int i = 0 ; i < len ; i++)
        {
            printf("%3d",arr[i]);
        }
        printf("\n");
        return 0;
    } 
    
    

alt

  1. 逆序输出字符串

    /*===============================================
    *   文件名称:work4.c
    *   创 建 者:青木莲华     
    *   创建日期:2025年07月16日
    *   描    述:逆序输出字符串
    ================================================*/
    #include <stdio.h>
    #include <string.h>
    int main(int argc, char *argv[])
    { 
        char str[32];
        printf(">:\n");
        gets(str);
    
        for(long i = strlen(str) - 1 ; i >= 0 ; i--)
        {
            printf("%c",str[i]);
        }
        printf("\n");
        return 0;
    } 
    
    

alt

  1. 打印杨辉三角前10行
/*===============================================
*   文件名称:work5.c
*   创 建 者:青木莲华     
*   创建日期:2025年07月16日
*   描    述:输出10行杨辉三角
================================================*/
#include <stdio.h>

int main(int argc, char *argv[])
{ 
    //初始化
    int arr[10][10] = {0};
    arr[0][0] = 1;
    arr[1][0] = 1;
    arr[1][1] = 1;
    //输出第一行
    printf("%-5d\n",arr[0][0]);
    //输出第二行
    printf("%-5d%-5d\n",arr[1][0],arr[1][1]);
    for(int i = 2 ; i < 10 ; i++)
    {
        for(int j = 0 ; j <= i ; j++ )
        {
            if(j == 0 || j == i)
            {
                arr[i][j] = 1; 
                printf("%-5d",arr[i][j]);
                continue;
            }
            else
            {
                arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
                printf("%-5d",arr[i][j]);
            }
        }
        printf("\n");
    }
    return 0;
} 

alt