linux 学习day7

数组

一维数组

1.1数组的排序

1.1.1冒泡排序

       将较大或者较小的数据,经由交换后,慢慢“浮到”数组顶端,如同水中的气泡一样,故名冒泡排序 原理:不断进行相邻的两个数据进行比较,如果满足条件,则进行交换,每一轮都会将一个最值数据"浮到"对应位置 对于每一轮重复上述操作,直到所有数据排序结束

#include <stdio.h>
#define Max 10
int main(){
    //数组的输入
    int score[Max]={0};
    for(int i=0;i<Max;i++){
        printf("请输入第%d位成绩:",i+1);
        scanf("%d",&score[i]);
    }

    //成绩排序-冒泡升序
    for(int i=0;i<Max;i++){
        for(int j=0;j<Max-i;j++){
            if(score[j]>score[j+1]){
                int score0=score[j];
                score[j]=score[j+1];
                score[j+1]=score0;
            }
        }
    }
    printf("成绩升序为");
    for(int i=0;i<Max;i++){
        printf("%d ",score[i]);
    }
    printf("\n");
}

 

1.1.2选择排序

       将要排序的序列分为已排序序列和待排序序列 不断从待排序序列中找到最值,放入已排序序列的最后位置,随着待排序序列不断减少,已排序序列不断增长 直到待排序序列没有元素,排序结束

#include <stdio.h>
#define Max 10
int main(){
    //数组的输入
    int score[Max]={0};
    for(int i=0;i<Max;i++){
        printf("请输入第%d位成绩:",i+1);
        scanf("%d",&score[i]);
    }
    //成绩排序-选择升序
    for(int i=0;i<Max;i++){
        int Mini=i;
        for(int j=i+1;j<Max;j++){
            if(score[Mini]>score[j]){
                Mini=j;
            }
        }
        int score0=score[i];
        score[i]=score[Mini];
        score[Mini]=score0;
    }
    printf("成绩升序为");
    for(int i=0;i<Max;i++){   
        printf("%d ",score[i]);
    }
    printf("\n");
}

 

二维数组

2.1 引入目的

1.当写程序时,需要同时定义多个相同类型的一维数组时,可以选用二维数组来完成

2.所谓二维数组,就是多个一维数组的集合

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

2.2 二位数组的概述

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

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

int arr[3][4];

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

arr[0][0]、arr[0][1]、arr[0][2]、arr[0][3]

arr[1][0]、arr[1][1]、arr[1][2]、arr[1][3]

arr[2][0]、arr[2][1]、arr[2][2]、arr[2][3]

无论是行标还是列表,都是从0开始,到对应数据减1的位置

例如:int arr[M][N]; 行标范围:【0,M-1】 列标范围:【0,N-1】

2.3 二维数组初始化

1、按行初始化:定义数组时,每一个一维数组的值使用一个花括号括起来

                         int arr[3][4] = { {1,2,3,4}, {5,6,7,8}, {9,9,9,9} };

2、按行部分初始化:每个一维数组中,可以不填满,没有初始化的部分用0补齐

                         int arr[3][4] = { {1,2}, {8}}; //1,2,0,0   8,0,0,0  0 ,0, 0, 0

3、按数组排列初始化:数组存储数据时,默认是按顺序存储,第一行存储满了,存第二行

                         int arr[3][4] = { 1,2,3,4,5,6,7,8, 9}; //1,2,3,4 5,6,7,8, 9,0,0,0

4、特殊初始化:定义二维数组并初始化时,可以不指定第一维的大小,由初始化总个数除以列数向上取整,得到行数

                         int arr[][4] = { 1,2,3,4,5,6}; // 1,2,3,4    5,6,0,0

5、注意:定义二维数组时,无论任何时候,第二维都不能省略

 

2.4二维数组的相关操作

2.4.1输入输出
#include<stdio.h>
int main(){
    int arr[5][5]={0};
    for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
            printf("请输入第%d行第%d列的元素",i,j);
            scanf("%d",&arr[i][j]);
        }
    }
    for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
            printf("%d\t",arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}
2.4.2求和,均值,最值

1.整体求和就是将任意一个元素进行累加

2.求每一行的和:将每一行的数据进行累加,求出结果后,可以放入一个新数组

3.求整体最值:先将第一个当做最值,然后遍历所有的元素,进行比较,给定比较条件后,适当更新最值

4.

//练习使用二维数组生产输出杨辉三角
#include<stdio.h>
int main(){
    int n=0;
    printf("请输入杨辉三角的阶数");
    scanf("%d",&n);
    int arr[50][50]={0};
    arr[0][0]=1;
    for(int i=1;i<n;i++){
        for(int j=0;j<n;j++){
            if(j==0){
                arr[i][j]=1;
            }else{
                arr[i][j]=arr[i-1][j]+arr[i-1][j-1];
            }
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<=i;j++){
            printf("%d\t",arr[i][j]);
        }
        printf("\n");
    }
    return 0;  
}

字符数组

3.1 一维字符数组

定义格式:char 数组名[常量]

3.2 字符数组的初始化

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

3.3字符数组的输入输出

二维字符数组 

作业

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

#include<stdio.h>
#include<string.h>
int main(){
    char st1[20]="";
    int spa=0,num=0,en=0;
    printf("请输入一个字符串");
    gets(st1);
    for(int i=0;i<strlen(st1);i++){
        if(st1[i] >= '0' && st1[i] <= '9'){
            num++;
        }else if((st1[i] >= 'a' && st1[i] <= 'z')||(st1[i] >= 'A' && st1[i] <= 'Z')){
            en++;
        }else if(st1[i] == ' '){
            spa++;
        }
    }
    printf("数字有%d个,字母有%d个,空格有%d个,其他字符有%d个\n",num,en,spa,strlen(st1)-num-en-spa);
    return 0;
}

 

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

#include<stdio.h>
#include<string.h>
int main(){
    char st1[20]="";
    int spa=0,sum=0,en=0;
    printf("请输入一个字符串");
    gets(st1);
    for(int i=0;i<strlen(st1);i++){
        if(st1[i] >= '0' && st1[i] <= '9'){
            sum+=st1[i]-48;
            printf("%d\n",sum);
        }
    }
    printf("数字有%d个,字母有个,空格有个,其他字符有个\n",sum);
    return 0;
}

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

#include<stdio.h>
int main(){
    int arr[4][3]={0};
    int brr[6];
    for(int i=0;i<4;i++){
        for(int j=0;j<3;j++){
            printf("请输入第%d行第%d列的数子",i+1,j+1);
            scanf("%d",&arr[i][j]);
        }
        printf("\n");
    }

    //数组输出
    for(int i=0;i<4;i++){
        for(int j=0;j<3;j++){
            printf("%d\t",arr[i][j]);
        }
        printf("\n");
    }

    //取最值
    int n=0;
    int max=0,min=0;
    for(int i=0;i<4;i++){
        max=arr[i][0];
        min=arr[i][0];
        for(int j=1;j<3;j++){
            if(max<arr[i][j]){
                max=arr[i][j];
            }
            if(min>arr[i][j]){
                min=arr[i][j];
            }
        }
        brr[n]=max;
        n++;
        brr[n]=min;
        n++;
    }

    //排序
    for(int i=0;i<7;i++){
        for(int j=0;j<8-i;j++){
            if(brr[j]>brr[j+1]){
                int Max=brr[j];
                brr[j]=brr[j+1];
                brr[j+1]=Max;
            }
        }
    }

    //排序后输出
    for(int i=0;i<8;i++){
        printf("%d ",brr[i]);
    }
}

 

 

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

 

#include<stdio.h>
#include<string.h>
int main(){
    char arr[20]="";
    char brr[20]="";
    char crr[20]="";
    int k1=0,n=0;
    printf("请输入两个数组\n");
    scanf("%s %s",arr,brr);
    for(int i=0;i<strlen(arr);i++){
        for(int j=0;j<strlen(brr);j++){
            if(arr[i]==brr[j]){
                for(int k=0;k<strlen(crr)+1;k++){
                    k1=1;
                    if(arr[i]==crr[k]){
                        k1=0;
                    }
                }
                if(k1==1){
                    crr[n]=arr[i];
                    n++;
                }
            }
        }
    }
    for(int i=0;i<n;i++){
        printf("%d\t",crr[i]-48);
    }
    printf("\n");
    return 0;
}

 

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

          注册:完成对账号和密码的输入

          登录:将登录账号

#include<stdio.h>
#include<string.h>
int main(){
    char name[20]="";
    char pastword[20]="";
    while(1){
        int n=0;
        printf("注册请摁1,登录请摁2\n");
        scanf("%d",&n);
        getchar();
        if(n==1){
            printf("请输入注册账号和密码\n");
            scanf("%s%s",name,pastword);
        }else if(n==2){
            char arr[20]="";
            char brr[20]="";
            printf("请输入账号和密码\n");
            scanf("%s%s",arr,brr);
            if(strcmp(name,arr)==0 && strcmp(pastword,brr)==0){
                    printf("登录成功\n");
                    return 0;
            }else {
                printf("登录失败\n");
            }
        }
    }
}

 

  • 21
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值