Linux C语言基础 day8

发布于:2024-07-11 ⋅ 阅读:(18) ⋅ 点赞:(0)

目录

思维导图:

学习目标:

学习内容:

1. 字符数组

1.1 二维字符数组

1.1.1 格式

1.1.2 初始化

1.1.3 二维字符数组输入输出、求最值、排序

2. 函数

2.1 概念

关于函数的相关概念

2.2 函数的定义及调用

2.2.1 定义函数的格式

2.3 函数的分类

1. 无参无返回值函数

2、有参无返回值函数

3、无参有返回值函数

4、有参有返回值函数

例如:

课堂练习:

课外作业:


思维导图:


学习目标:

例如:

  • 一周掌握 C基础知识

学习内容:

1. 字符数组

1.1 二维字符数组

1.1.1 格式

        char 数组名[常量1][常量2];

        常量1:表示的是定义的字符串的个数

        参数2:表示的是每个字符串的最大长度+1

1.1.2 初始化

        1、单字符初始化:该方式跟二维整形数组一致

        2、字符串初始化:

                全部初始化:char arr[3][8] = {"apple", "banana", "orange"}; arr[0] arr[1] arr[2]

                特殊初始化:char arr[ ][8] = {"apple", "banana", "orange"}; //此时省略的第一维,会根据初始化字符串的个数确定

                部分初始化:char arr[5][8] = {"apple", "banana", "orange"}; //没有初始化的字符串 默认为空串

1.1.3 二维字符数组输入输出、求最值、排序

例如:

#include<stdio.h>
#include<string.h>
#define MAX 5
int main(int argc, const char *argv[])
{
    char arr[MAX][20]={""};
    char brr[MAX][20]={""};
    for (int i = 0; i < MAX; i++)
    {
        printf("请输入第%d个字符串:", i+1);
        scanf("%s", arr[i]);
    }
    //输出所有的字符串
    printf("目前的字符串分别是:");
    for(int i=0; i<MAX;i++)
    {
        printf("%s\t", arr[i]);
    }
    puts("");
    char max[20]={""};
    stpcpy(max,arr[0]);
    for(int i=0;i<MAX;i++){
        if(strcmp(max,arr[i])){
            strcpy(max,arr[i]);
        }
    }
    printf("最大字符串为:%s\n", max);
    //将所有字符串进行排序
    char temp[20]={""};
    for(int i=0;i<MAX;i++){
        for ( int j= 0; j < MAX-i; j++)
        {
            if(strcmp(arr[j],arr[j+1]) > 0){
                strcpy(temp,arr[i]);
                strcpy(arr[i],arr[i+1]);
                strcpy(arr[i+1],temp);
            }
        }
       
    }
     //输出排序后的结果
    printf("目前的字符串分别是:");
    for(int i=0; i<MAX;i++)
    {
        printf("%s\t", arr[i]);
    }
    puts("");
}

2. 函数

2.1 概念

        将能实现某些功能的代码封装成代码块,然后通过通过代码块的名字就能调用到该部分的代码,这样,在多次相同操作的场景下,可以减少由于重复代码导致的劳动量,这个代码块,就是函数,代码块的名字,就是函数名。

        例:strlen strcpy printf scanf atoi。

关于函数的相关概念

        主调函数:调用别的函数的函数叫做主调函数

        被调函数:被别的函数调用的那个函数称为被调函数

        形式参数:也称形参,定义函数时,括号里面的参数称为形参

        实际参数:也称实参,函数调用时,括号里面的参数称为实参

2.2 函数的定义及调用

2.2.1 定义函数的格式

        返回值类型 函数名(函数的形参列表){ 函数体; }

2.3 函数的分类

1. 无参无返回值函数

        该函数,仅仅只是单纯执行特定的代码,没有数据传入,也不需要返回结果,仅仅只是执行一个过程 函数定义格式: void 函数名(void) {} 例如:void print_menu(void);

2、有参无返回值函数

        该函数,需要主调函数传入给定的数据后,才能进行执行该功能,但是,执行结束后,没有返回结果 函数定义格式:void 函数名(形参列表) {} 例如:void print_arr(int arr[], int n);

3、无参有返回值函数

        该函数无需外界传入数据,直接执行内部语句,并且执行结束后,会向主调函数返回一个确定的数据 函数定义格式:返回值类型 函数名(void){} 例如:int getchar(void);

4、有参有返回值函数

        该函数需要外界提供对应的参数,执行函数体代码后,并向主调函数返回一个确定的值 函数定义格式:返回值类型 函数名(参数列表) {} 例如:int strlen(char *src);

例如:

#include<myhead.h>

//定义菜单函数
void print_menu()
{
        printf("\t\t======1、无参无返回值函数======\n");
        printf("\t\t======2、有参无返回值函数======\n");
        printf("\t\t======3、无参有返回值函数======\n");
        printf("\t\t======4、有参有返回值函数======\n");
        printf("\t\t======0、退出======\n");
}

//定义无参无返回值函数
void sum_1(void)
{
    int num,key;
    printf("请输入两个数:");
    scanf("%d%d", &num, &key);
    int sum = num + key;          //求两数的和
    printf("sum = %d\n", sum);
}

//定义有参无返回值函数
void sum_2(int m, int n)
{
    int sum = m+n;        //将传入的两个数据求和

    printf("sum = %d\n", sum);        //输出结果

}

//定义无参无返回值函数
int sum_3()
{
    int num,key;
    printf("请输入两个数:");
    scanf("%d%d", &num, &key);
    int sum = num + key;          //求两数的和

    //将求出的和值,返回值给主调函数使用
    return sum;
}

//定义有参有返回值函数
int sum_4(int m, int n)
{
    int sum = m+n;

    return sum;
}

/************************主程序****************************/
int main(int argc, const char *argv[])
{
    //做个菜单
    int menu = 0;
    while(1)
    {
        print_menu();           //调用菜单函数

        printf("请输入>>>");
        scanf("%d", &menu);
        getchar();

        //多分支选择
        switch(menu)
        {
        case 1:
            {
                sum_1();      //调用无参无返回值函数
            }
            break;

        case 2:
            {
                int num,key;         //这两个数据是主调函数中的
                printf("请输入两个数:");
                scanf("%d%d", &num, &key);    

                sum_2(num, key);        //调用有参无返回值函数

            }
            break;
        case 3:
            {
                //要求调用一个函数,不传递任何数据
                //并且要得到该函数的结果,由主调函数输出
                int sum = sum_3();      //无参有返回值函数调用

                printf("sum = %d\n", sum);
            }
            break;
        case 4:
            {
                int num,key;         //这两个数据是主调函数中的
                printf("请输入两个数:");
                scanf("%d%d", &num, &key);    
                
                int sum = sum_4(num, key);          //调用有参有返回值函数
                
                printf("sum = %d\n", sum);

            }
            break;
        case 0: goto END;
        default:printf("您输入的功能有误,请重新输入\n");
        }
    }

END:

    return 0;
}


课堂练习:

#include<stdio.h>
void print_menu()
{
        printf("\t\t======1、第一题======\n");
        printf("\t\t======2、第二题======\n");
        printf("\t\t======3、第三题======\n");
        printf("\t\t======0、退出======\n");
}
void max1(int num,int key){
    if(num > key){
        printf("最大值为%d\n",num);
    }else
    {
        printf("最大值为%d\n",key);
    }
    
}
int max2(){
    int a[5]={0};
    for (int  i = 0; i < 5; i++)
    {
        printf("请输入该数组的第%d个值",i+1);
        scanf("%d",&a[i]);
    }
    printf("\n");
    int max1=a[0];
    for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
            if(max1 < a[j]){
                max1=a[j];
            }
        }
    }
    return max1;
    
}
int con(int a,int b,int c){
    if((a+b)<=c || (a+c)<=b || (c+b)<=a){
        return -1;
    }else if (a==b && b==c && c==a)
    {
       return 2;
    }else if (a==b || b==c || c==a )
    {
       return 1;
    }else
    {
        return 0;
    }
}
int main(int argc, char const *argv[])
{
     int menu=0;
    while (1)
    {
    print_menu();
    printf("请输入>>>");
    scanf("%d", &menu);
    getchar();  
    switch(menu)
    {
    case  1:{
    int num,key;        
    printf("请输入两个数:");
    scanf("%d%d", &num, &key);
    max1(num,key);}
    break;
    case 2:
    {
    int max1=max2();
    printf("最大值为%d\n",max1);
    }
    break;
    case 3:
    {
        int x=0,y=0,z=0;
        while (1)
        {   
        printf("请输入三角形的三条边:");
        scanf("%d%d%d",&x,&y,&z);
        int a=con(x,y,z);
        if(a==-1){
            printf("不能构成三角形,请重新输入\n");
        }else if (a==0)
        {
            printf("构成普通三角形\n");
            break;
        }else if (a==1)
        {
            printf("构成等腰三角形\n");
            break;
        }else if (a==2)
        {
            printf("构成等边三角形\n");
            break;
        }
        }
        
    }
    break;
    case 0: goto END;
    default:printf("您输入的功能有误,请重新输入\n");
    }
    }
    END:
    return 0;
    }
 


课外作业:

完成学生管理系统

1> 使用菜单完成

2> 有学生的信息录入功能:输入学生个数,并将学生的姓名、分数录入

3> 查看学生信息:输出所有学生姓名以及对应的分数

4> 求出学习最好的学生信息:求最大值

5> 按姓名将所有学生进行升序排序

6> 按成绩将学生学生进行升序排序

要求每个功能使用函数完成

解析:

方法一:

#include<stdio.h>
#include<string.h>
#define MAX 50
char names[MAX][50];
int scores[MAX];
int count = 0;
void print_menu();                                 //菜单
void enterstu();                                        // 学生信息录入
void findstu();                                          // 查看所有学生信息
void findtopstu();                                  // 寻找学习成绩最好的学生
void sortnamestu();                             // 按姓名将学生进行升序排序
void sortscorestu();                                // 按成绩将学生进行升序排序


int main(int argc, char const *argv[])
{
   //做个菜单
    int menu = 0;
    while(1)
    {
        print_menu();           //调用菜单函数

        printf("请输入>>>");
        scanf("%d", &menu);
        getchar();

        //多分支选择
        switch (menu)
        {
        case 1:
        enterstu();
        break;
        case 2:
        findstu();
        break;
        case 3:
        findtopstu();
        break;
        case 4:
        sortnamestu();
        break;
        case 5:
        sortscorestu();
        break;
        case 0: goto END;
        default:printf("您输入的功能有误,请重新输入\n");
        }
    }
END:
return 0;
}

//菜单
void print_menu()
{
        printf("\t\t======1、学生信息录入======\n");
        printf("\t\t======2、查看学生信息======\n");
        printf("\t\t======3、查看成绩最好的学生(姓名加成绩)======\n");
        printf("\t\t======4、按姓名将所有学生就行升序排序======\n");
        printf("\t\t======5、按成绩将所有学生就行升序排序======\n");
        printf("\t\t======0、退出======\n");
}
// 学生信息录入
void enterstu(){
    printf("请输入学生个数:");
    scanf("%d",&count);//输入学生个数
    for(int i=0;i<count;i++){
    printf("输入第%d个学生姓名:",i+1);
    scanf("%s", names[i]);
    if (strcmp(names[i], "\n") == 0) {  //换行
        return;
    }
    printf("输入学生分数:");
    scanf("%d", &scores[i]);     
    }
}
// 查看所有学生信息
void findstu(){
    for(int i=0;i<count;i++){
        printf("学生姓名:%s成绩:%d\n",names[i],scores[i]);                //输出学生姓名以及对应的成绩
    }
    printf("\n");
}
// 寻找学习成绩最好的学生
void findtopstu(){
    int top = 0;
    for (int i = 0; i < count; i++)
    {
       if(scores[top] < scores[i] ){
           scores[top] = scores[i];                 //寻找成绩最高的学生
       }
    }
    printf("最好成绩学生姓名为:%s,成绩为%d。\n",names[top],scores[top]);                  //输出最好成绩的学生姓名和成绩
}
// 按姓名将学生进行升序排序
void sortnamestu(){
    char temp[MAX];
    int tempx=0;
    for (int i = 1; i < count; i++)
    {
       for (int j = 0; j < count - i; j++)
       {
           if(strcmp(names[j],names[j+1]) > 0){               //进行交换三部曲
               strcpy(temp,names[j]);
               strcpy(names[j],names[j+1]);
               strcpy(names[j+1],temp);
               tempx = scores[j];
               scores[j]=scores[j+1];
               scores[j+1]=tempx;
           }
       }
      
    }
     findstu();
}
// 按成绩将学生进行升序排序
void sortscorestu(){
    char temp[MAX];
    int tempx=0;
    for (int i = 1; i < count; i++)
    {
       for (int j = 0; j < count - i; j++)
       {
           if(scores[j] > scores[j+1]){                                    //进行交换三部曲
               strcpy(temp,names[j]);
               strcpy(names[j],names[j+1]);
               strcpy(names[j+1],temp);
               tempx = scores[j];
               scores[j]=scores[j+1];
               scores[j+1]=tempx;
           }
       }
    }
        findstu();   
}
 

方法二:

#include <stdio.h>
#include <string.h>

#define MAX 5

// 函数声明
void print_menu();
void enterstu(char students[][50],int scores[], int *count);
void findstu(char students[][50],int scores[], int count);
void findtopStu(char students[][50], int scores[], int count, int top);
void sortnamestu(char students[][50], int scores[], int count);
void sortscorestu(char students[][50], int scores[], int count);

int main() {
    char students[MAX][50];
    int scores[MAX];
    int count = 0;
    int top=0;
    int menu=0;

while(1)
    {
        print_menu();           //调用菜单函数

        printf("请输入>>>");
        scanf("%d", &menu);
        getchar();

        //多分支选择
        switch (menu)
        {
        case 1:
        enterstu(students,scores, &count);

        break;
        case 2:
        findstu(students,scores, count);
        break;
        case 3:
        findtopstu(students, scores, count, top);
        break;
        case 4:
        sortnamestu(students, scores, count);
        break;
        case 5:
        sortscorestu(students, scores, count);
        break;
        case 0: goto END;
        default:printf("您输入的功能有误,请重新输入\n");
        }
    }
END:
return 0;
}
//菜单
void print_menu()
{
        printf("\t\t======1、学生信息录入======\n");
        printf("\t\t======2、查看学生信息======\n");
        printf("\t\t======3、查看成绩最好的学生(姓名加成绩)======\n");
        printf("\t\t======4、按姓名将所有学生就行升序排序======\n");
        printf("\t\t======5、按成绩将所有学生就行升序排序======\n");
        printf("\t\t======0、退出======\n");
}
// 学生信息录入
void enterstu(char students[][50],int scores[], int *count) {
    printf("输入学生个数:");
    scanf("%d", count);
    for (int i = 0; i < *count; i++) {
        printf("输入学生 #%d 的姓名:", i + 1);
        scanf("%s", students[i]);
        printf("输入学生 #%d 的分数:", i + 1);
        scanf("%d", &scores[i]);
    }
}

// 查看所有学生信息
void findstu(char students[][50], int scores[],int count) {
    for (int i = 0; i < count; i++) {
        printf("姓名:%s 分数:%d\n", students[i], scores[i]);
    }
}

// 寻找学习最好的学生
void findtopstu(char students[][50], int scores[], int count, int top) {
    for (int i = 0; i < count; i++)
    {
       if(scores[top] < scores[i] ){
           scores[top] = scores[i];                 //寻找成绩最高的学生
       }
    }
    printf("最好成绩学生姓名为:%s,成绩为%d。\n",students[top],scores[top]);                //输出最好成绩的学生姓名和成绩
}

// 按姓名将学生进行升序排序
void sortnamestu(char students[][50], int scores[], int count) {
    char temp[MAX];
    int tempx=0;
   for (int i = 1; i < count; i++)
    {
       for (int j = 0; j < count - i; j++)
       {
           if(strcmp(students[j],students[j+1]) > 0){               //进行交换三部曲
               strcpy(temp,students[j]);
               strcpy(students[j],students[j+1]);
               strcpy(students[j+1],temp);
               tempx = scores[j];
               scores[j]=scores[j+1];
               scores[j+1]=tempx;
           }
       }
      
    }
    printf("按姓名排序后的学生信息:\n");
    findstu(students, scores,count);
}

// 按成绩将学生进行升序排序
void sortscorestu(char students[][50], int scores[], int count) {
    char temp[MAX];
    int tempx=0;
   for (int i = 1; i < count; i++)
    {
       for (int j = 0; j < count - i; j++)
       {
           if(scores[j] > scores[j+1]){               //进行交换三部曲
               strcpy(temp,students[j]);
               strcpy(students[j],students[j+1]);
               strcpy(students[j+1],temp);
               tempx = scores[j];
               scores[j]=scores[j+1];
               scores[j+1]=tempx;
           }
       }
      
    }
    printf("按成绩排序后的学生信息:\n");
    findstu(students, scores,count);
}