c语言入门day06~day07

数组

概念和定义

数组是连续存储多个相同数据类型的变量的集合,数组属于构造数据类型。

连续存储,说明这多个变量的地址是连续的

相同数据类型,说明同一个数组中的每个变量的数据类型都是一样的

变量的集合:说明数组定义时不能为空

定义格式: 数据类型 数组名[常量]

               int    arr[5]

1、数据类型:可以是基本数据类型,也可以是构造数据类型、指针类型或者空类型

2、数组名:标识符,要符合标识符的命名规则

1) 只能由字母、数字、下划线组成

2) 不能以数字开头

3) 不能使用关键字

4) 严格区分大小写

5) 做到见名知意

3、中括号:表示这是数组的标识,正在定义一个数组

4、常量:表示定义的数组长度,或者说是定义的变量的个数

1)不能为0

2) 不能为小数

3) 不能空着 

一个长度为N的数组中,没有下标为N的数组元素 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
	int arr[5]={1,2,3,4,5};
	int brr[5]={1,2,3};
	int crr[]={1,2,3,4,5};
	printf("%d %d %d\n",arr[0],brr[0],crr[0]);
	printf("len of crr=%ld\n",sizeof(crr)/sizeof(crr[0]));
	return 0;
}

数组的初始化

1、全部初始化:数组的长度为多少,就初始化几个元素的值

int arr[5] = {520, 1415, 666, 999, 1234}; arr[0] arr[1] arr[2] arr[3] arr[4]

2、部分初始化:初始化元素的个数,小于数组的长度,此时,默认从前面元素进行初始化,没有初始化的元素用0补齐

int arr[5] = {520, 1415, 666}; 0 0 arr[0] arr[1] arr[2] arr[3] arr[4]

3、特殊初始化:在定义数组并初始化时,可以不用给定数组的长度,数组的长度由初始化元素个数而定

int arr[] = {520, 1415, 666, 999, 1234}; arr[0] arr[1] arr[2] arr[3] arr[4]

对数组元素的常规操作 

1. 输入输出

所谓对数组进行输入输出,其实就是对任意一个元素进行重复性输入输出,重复性的动作我们使用循环解决

注意:C语言不允许对除字符数组外的其他数组整体进行输入输出,只能找到数组元素,对单个元素进行操作

2. 求和值、均值

所谓求和值,就是将所有任意值进行累加,需要定义一个变量存储总和,但是要求,在使用之前,必须清零

所谓均值,就是将数据总和除以总个数,均值不需要循环求

3. 求最值

套路:将数组中的第一个先设置成当前的最值,然后拿着当前的最值与数组中的任意一个元素进行比较,如果比较过程中,不满足条件,则更新最值,直到所有数据都跟最值比较一遍后,得到最值

4. 查找

存在性查找:当数组中出现要查找的数据时,立即结束本次查找

统计性查找:将数组全部元素进行遍历一遍,统计出要查找数据的个数

#include<stdio.h>
#define MAX 10            //宏定义一个常量
int main(int argc, const char *argv[])
{
    //定义一个数组,用于存储班级所有成员的成绩
    int score[MAX] = {0};     

    //完成对成员成绩的输入
    for(int i=0; i<MAX; i++)
    {
        //找到任意一个元素:score[i]
        printf("请输入第%d个学生的成绩:", i+1);
        scanf("%d", &score[i]);
    }

    //程序执行至此,表示数组元素全部赋值成功
    //输出数组元素
    printf("数组中的元素分别是:");
    for(int i=0; i<MAX; i++)
    {
        printf("%d\t", score[i]);
    }
    putchar(10);              //输出一个回车换行

    //求和值、均值
    int sum = 0;         //记录总和
    double avg = 0;      //记录平均值
    for(int i=0; i<MAX; i++)          //遍历数组中的所有元素
    {
        sum += score[i];         //讲任意一个数据进行累加
    }
    //程序执行至此,表示总和已经求出来
    avg = 1.0*sum/MAX;
    printf("总和为:%d, 平均值为:%.2lf\n", sum, avg);

    //求最值(以求最大值为例)
    int max = 0;             //存储数组的中最大值
    int maxi = 0;            //记录最大值所在的下标

    //先将数组中的第一个当做最值
    max = score[0];
    maxi = 0;                //记录当前最值所在的下标
    for(int i=0; i<MAX; i++)
    {
        //将当前的最值,与任意一个数据进行比较
        if(max < score[i])
        {
            max = score[i];           //更新最值中的数据
            maxi = i;                 //更新记录最值下标的变量
        }
    }
    //程序执行至此,表示最值以及最值的下标已经求出
    printf("当前数组的最大值为:%d, 在数组的第%d个位置\n", max, maxi+1);
    

    //查找
    int search = 0;
    int i = 0;            //用于遍历数组的循环变量
    printf("请输入您要查找的值:");
    scanf("%d", &search);
    //开始遍历数组,实现存在性查找
    for(i=0; i<MAX; i++)
    {
        //判断数据是否是要查找的数据
        if(search == score[i])
        {
            break;
        }
    }
    //判断是否查找到
    if(i==MAX)
    {
        printf("查找失败\n");
    }
    else
    {
        printf("您要查找的值,存在于数组中\n");
    }

    //遍历数组,完成统计性查找
    int count = 0;              //计数器
    for(int i=0; i<MAX; i++)
    {
        if(search == score[i])
        {
            count++;           //计数器自增
        }
    }
    //循环结束后,对计数器进行判断
    if(count == 0)
    {
        printf("查找失败\n");
    }
    else
    {
        printf("查找成功,您要找的值一共出现%d次\n", count);
    }
    
    return 0;
}

5.冒泡排序 
//冒泡排序
    for(int i=0;i<MAX;i++)
    {
        for(int j=0;j<MAX-i;j++)
        {
        if(score[j]>score[j+1])
        {
            int temp=score[j];
            score[j]=score[j+1];
            score[j+1]=temp;
        }
        }
    }
    printf("结果为");
    for(int i=0;i<MAX;i++)
    {
        printf("%d\t",score[i]);
    }
    putchar(10);
6. 选择排序
//选择排序
    int maxj=0;
    for(int i=0;i<MAX;i++)
    {
        maxj=i;
        for(int j=i+1;j<MAX;j++)
        {
          if(score[maxj]<score[j])
          {
            maxj=j;
          }
        }
        if(maxj!=i)
        {
            int temp=score[i];
            score[i]=score[maxj];
            score[maxj]=temp;
        } 
    }
    printf("结果为");
    for(int i=0;i<MAX;i++)
    {
        printf("%d\t",score[i]);
    }
    putchar(10);

二维数组 

引入目的

1.需要定义大量一维数组是可以用二维数组代替

2.是多个一维数组的组合

3.二维数组也是变量的集合,是一个有行有列的容器

1、数组名[行标]:表示下标为"行号"的那个一维数组的数组名

2、数组名[行标][列标]:表示下标为 [行标][列标] 的一个变量

举个例子: int arr[3][4]; //该语句定义了一个3*4的二维数组,也可以理解成 定义了3个长度为4的一维数组

arr[0]: 表示第一个一维数组的数组名

arr[1]: 表示第二个一维数组的数组名

arr[2]: 表示第三个一维数组的数组名

arr[0][0]: 表示第一行第一列的一个变量

3、定义数组时,中括号中的数字表示定义二维数组的行数和列数,而使用数组元素时,中括号中的数字表示的是坐标

4、无论是行标还是列表,都是从0开始,到对应数据减1的位置 例如:int arr[M][N]; 行标范围:【0,M-1】 列标范围:【0,N-1】

 二维数组的常规操作

1.输入输出

#include<stdio.h>
#define N 3
#define M 4
int main(int argc, char const *argv[])
{
    int arr[N][M]={0};
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<M;j++)
        {
           printf("输入第%d行第%d列的数字\n",i+1,j+1);
           scanf("%d",&arr[i][j]);
        }
        putchar(10);
    }
    printf("数组元素分别是:\n");
    for(int i=0; i<N; i++)
    {
        for(int j=0; j<M; j++)
        {
            printf("%d\t", arr[i][j]);
        }
        printf("\n");
    }
 2.求数组中的最大值



    int max=arr[0][0];
    int maxi=0;
    int maxj=0;
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<M;j++)
        {
            if(max<arr[i][j])
            {
                maxi=i;
                maxj=j;
                max=arr[maxi][maxj];
            }
        }
    }
    printf("最大值为:%d",max);
    putchar(10);

   
3.求某行的最大值 


    for(int i=0;i<N;i++)
    {
        max=arr[i][0];
        for(int j=0;j<M;j++)
        {
            if(max<arr[i][j])
            {
                max=arr[i][j];
            }
        }
        printf("第%d行的最大值为%d\n",i+1,max);
    }
    
   
4.二维数组转置 

    
    int brr[M][N]={0};
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<M;j++)
        {
            brr[j][i]=arr[i][j];
        }
    }
    printf("二维数组转置后的结果\n");
    for(int i=0;i<M;i++)
    {
        for(int j=0;j<N;j++)
        {
            printf("%d\t",brr[i][j]);
        }
        putchar(10);
    }
    
经典练习题:杨辉三角 
include<stdio.h>
#define max 10
int main(int argc, char const *argv[])
{
    int h=0;
    int arr[max][max]={0};
    printf("输入阶数");
    scanf("%d",&h);
    for(int i=0;i<h;i++)
    {
        for(int j=0;j<=i;j++)
        {
            if(j==0||j==i)
            {
                arr[i][j]=1;
            }
            else{
                arr[i][j]=arr[i-1][j-1]+arr[i-1][j];
            }
        }
    }
    printf("%d阶杨辉三角如下:\n", h);
    for(int i=0; i<h; i++)
    {
        for(int j=0; j<=i; j++)
        {
            printf("%d\t", arr[i][j]);
        }
        printf("\n");
    }

    return 0;
}

一维字符数组 

一维字符数组初始化

1、单字符处理字符数组

全部初始化:char arr[5] = {'h', 'e', 'l', 'l', 'o'};

部分初始化:char arr[5] = {'h', 'e', 'l'}; //没有初始化的部分用 0('\0') 补齐

特殊初始化:char arr[] = {'h', 'e', 'l', 'l', 'o'}; //此时字符数组的长度为 5

2、字符串的形式初始化

整体初始化:char arr[10] = {"hello"}; //或者 char arr[6] = "hello";

特殊字符串初始化: char arr[] = "ni hao"; //此时,数组的实际长度7 但是,字符串实际长度为6

字符数组的输入输出 

字符串的输入输出:需要将字符数组看成一个整体,不需要使用循环完成

对于字符串的输入输出,有两组函数可供使用 格式化输入输出:printf、scanf

使用的格式控制符为:%s 专门针对于字符串的输入输出函数:puts、gets

 字符串的求长度
#include<stdio.h>
#include<string.h>
int main(int argc, char const *argv[])
{
    //定义两个字符数组初始化字符串
    char str1[20] = "hello world";
    char str2[] = "I Love China";

    //测试strlen
    int len = strlen(str2);           //求字符串2的实际长度
    printf("len = %d\n", len);           //12
    int size = sizeof(str2);          //求字符串所占字符数组的长度
    printf("size = %d\n", size);         //13
    size = sizeof(str1);             //求字符数组1的大小
    printf("size = %d\n", size);         //20

    
比较两个字符串的大小 


   
    if(strcmp(str1, str2) >0)
    {
        printf("%s大\n", str1);
    }else if(strcmp(str1, str2) < 0)
    {
        printf("%s小\n", str1);
    }else
    {
        printf("一样大\n");
    }

 
字符串的赋值

    strcpy(str1, str2);             // str1 = str2
    printf("拷贝后:str1 = %s, str2 = %s\n", str1, str2);

   
字符串的连接 

    strcat(str1, str2);
    printf("连接后:str1 = %s, str2 = %s\n", str1, str2);

 习题

1、提示并输入一个字符串,统计该字符串中字母、数字、空格以及其他字符的个数

#include<stdio.h>
#include<string.h>
int main(int argc, char const *argv[])
{
    char arr[10];
    int z=0,s=0,k=0,q=0;
    printf("输入字符串\n");
    gets(arr);
    int l=strlen(arr);
    for(int i=0;i<=l;i++)
    {
        if(arr[i]>='A'&&arr[i]<='z')
        {
            z++;
        }
        else if(arr[i]>='0'&&arr[i]<='9')
        {
            s++;
        }
        else if(arr[i]=' ')
        {
            k++;
        }
        else{
            q++;
        }
    }
    printf("字母%d个,数字%d个,空格%d个,其他%d个\n",z,s,k,q);
    return 0;
}

2、提示并输入一个字符串,求出该字符串中所有数字的总和

#include<stdio.h>
#include<string.h>
#define max 10
int main(int argc, char const *argv[])
{
    char arr[max];
    int sum[max]={0};
    int k=0,h=0;
    printf("输入字符串\n");
    gets(arr);
    int l=strlen(arr);
    for(int i=0;i<=l;i++)
    {
        if(arr[i]>='0'&&arr[i]<='9')
        {
            sum[i]=arr[i]-48;
        }
    }
    for(int i=0; i<10; i++)          
    {
        h+=sum[i];
    }
    printf("数字之和为%d\n",h);
    
    return 0;
}

3定义一个4*3的二维整形数组,完成对二维数组的输入、输出。并将该二维数组中每一行的最值放入到一个一维数组中,并对该一维数组进行升序排序后输出。

#include<stdio.h>
#define N 3
#define M 4
int main(int argc, char const *argv[])
{
    int arr[N][M]={0};
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<M;j++)
        {
           printf("输入第%d行第%d列的数字\n",i+1,j+1);
           scanf("%d",&arr[i][j]);
        }
        putchar(10);
    }
    printf("数组元素分别是:\n");
    for(int i=0; i<N; i++)
    {
        for(int j=0; j<M; j++)
        {
            printf("%d\t", arr[i][j]);
        }
        printf("\n");
    }

    int max=arr[0][0];
    int maxi=0;
    int maxj=0;
    int k=0;
    int brr[12]={0};
    for(int i=0;i<N;i++)
    {
        max=arr[i][0];
        for(int j=0;j<M;j++)
        {
            if(max<arr[i][j])
            {
                max=arr[i][j];
            }
           
        }
        brr[i]=max; 
        printf("%d\t",brr[i]);
    }
    putchar(10);

    for(int i=0;i<N;i++)
    {
        for(int j=0;j<N-i-1;j++)
        {
        if(brr[j]>brr[j+1])
        {
            int temp=brr[j];
            brr[j]=brr[j+1];
            brr[j+1]=temp;
        }
        }
    }
    printf("结果为");
    for(int i=0;i<N;i++)
    {
        printf("%d\t",brr[i]);
    }
    putchar(10);
    return 0;
}

4、提示并输入两个一维整形数组,求这两个数组的交集。

#include<stdio.h>
#define M  5
#define N  5
int main()
{
     int arr[M]={0},brr[N]={0};
     printf("请输入第一个数组");
     for (int i = 0; i < M; i++)
     {
         scanf("%d",&arr[i]);
     }
     printf("请输入第二个数组");
     for (int i = 0; i < N; i++)
     {
         scanf("%d",&brr[i]);
     }
     printf("两个数组交集为");
     for (int i = 0; i < M; i++)
     {
        for (int j = 0; j< N; j++)
        {
            if (arr[i]==brr[j])
            {
                printf("%d   ",arr[i]);
            }
            
        }
        
     }
     printf("\n");
     return 0;
}

5,完成注册和登录功能,使用两个一维字符数组储存账号和密码

#include<stdio.h>
#include<string.h>
#include<stdio.h>
#include<string.h>
int main()
{
    char arr[10]="";
    char brr[10]="";
    char crr[10]="";
    char drr[10]="";
    printf("注册\n");
    printf("请输入你的账号\n");
    gets(arr);
    printf("请输入你的密码\n");
    gets(brr);
    printf("登录\n");
    printf("请输入你的账号\n");
    gets(crr);
    printf("请输入你的密码\n");
    gets(drr);
    if (strcmp(arr,crr)==0&&strcmp(brr,drr)==0)
    {
        printf("登录成功\n");
    }
    else
    {
        printf("登录失败\n");
    }
    
 
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值