linux 学习day8

二维字符数组

1.1 引入目的:

对于处理多个一维字符数组不方便时,可以引入二维字符数组

从该角度来看,二维字符数组其实就是一维字符串数组

1.2 定义格式

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

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

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

1.3 二位字符数组的初始化

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.4 二位数组的使用

1、单字符使用:数组名[行标][列表] ---->找到了指定位置上的某个字符

2、字符串使用:数组[行标]; ---->找到了制定行的一个字符串

函数

2.1 引入目的

1.系统会提供一些库函数供大家使用,但是,提供的函数毕竟有限,如果想要使用特别定制的函数,需要自己封装

2. 对于一些重复调用的语句块而言,如果不加封装的话,会使得代码比较冗余

3. 为了提高编程效率,我们引入了函数,能够做到一处修改,处处修改

4. 目前接触的函数:printf、scanf、putchar、getchar、puts、gets、strlen、strcmp、strcat、strcpy

2.2 函数的定义

1.函数:执行特定功能的一段代码段

2.定义格式:返回值类型 函数名(参数列表){函数体代码}

1、返回值类型:函数执行后,向外界返回的一个结果值,可以有结果(非void),也可以没有结果(void)

                      定义函数时:有返无返看主调函数,主调函数想要数据,就定义有返回值函数,主调函数要什么类型的结果,就定义什么数据类型

                      主调函数不要数据,就定义void类型

2、函数名:是一个标识符,要符合命名规则

3、():小括号是函数的标识,即使是没有参数的函数调用时也要将括号加上

4、参数列表:可以有,也可以没有,表示外界向该函数体提供的数据

                    定义函数是:有参无参看主调,主调函数给数据,就定义有参函数,主调函数给几个数据,就定义几个参数接收,主调函数给什么类型的数据,就定义什么类型的参数接收

                    主调函数不给数据,就不定义参数

5、{}:要封装的函数体代码,要用花括号包裹起来

6、函数体代码:要被封装的内容

2.3 函数的分类 

1.对于函数定义格式而言,函数名和函数体代码是不可变的,但是,函数的返回值类型和函数的参数是可变的

2.对于一个函数而言,返回值是可有可无的,参数也是可有可无的,根据此,函数分为四大类

1.无参无返回值函数:该函数,仅仅只是单纯执行特定的代码,没有数据传入,也不需要返回结果,仅仅只是执行一个过程

                                 函数定义格式:void 函数名(void){}

                                 void print_menu(void){}

2.有参无返回值函数:该函数,需要主调函数传入给定的数据后,才能进行执行该功能,但是,执行结束后,没有返回结果

                                 函数定义格式:void 函数名(形参列表){}

                                 void print_arr(int arr[],int n){}

3.无参有返回值函数:该函数无需外界传入数据,直接执行内部语句,并且执行结束后,会向主调函数返回一个确定的数据

                                 函数定义格式:返回值类型 函数名(void){}

                                 int getchar(void)

 3. 函数的相关概念

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

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

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

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

4. 函数调用格式: 变量名 = 函数名(实参列表);

#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;
}

练习1:定义一个有参无返回值函数,主调函数传入两个整数,被调函数中输出两个整数的最大值

#include<stdio.h>

// 判断大小
void max(int n,int m){
    printf("%d大",n>m?n:m);
}

int main(){
    printf("请输入两个整数");
    int n=0,m=0;
    scanf("%d%d",&n,&m);
    max(n,m);
}

练习2: 定义无参有返回值函数,被调函数中定义并初始化一个长度为5的整形数组,求出该数组的最大值,传递给主调函数输出

#include<stdio.h>
int mas(){
    int arr[5]={0};
    for(int i=0;i<5;i++){
        printf("请输入第%d个数",i+1);
        scanf("%d",&arr[i]);
    }
    int max=arr[0];
    for(int i=1;i<5;i++){
        if(max<arr[i]){
            max=arr[i];
        }
    }
    return max;
}  
int main(){
    int max=mas();
    printf("最大的数为%d",max);
}

练习3: 

定义一个有参有返回值函数,主调函数传入三角形的三条边,被调函数判断为何种三角形,并返回给主调函数;返回值设定:

                                    -1:表示不能构成三角形

                                    0:表示构成普通三角形

                                    1:构成等腰三角形

                                    2:构成等边三角形

#include<stdio.h>

//判断三角形
int jud(int a,int b,int c){
    if(a+b>c && a+c>b && b+c>a ){
        if(a==b&&b==c){
            return 2;
        }else if(a==b || b==c || a==c){
            return 1;
        }else{
            return 0;
        }
    }else{
        return -1;
    }
}

int main(){
    printf("请输入三角形的三条边");
    int a=0,b=0,c=0;
    scanf("%d%d%d",&a,&b,&c);
    switch(jud(a,b,c)){
        case -1:printf("不能构成三角形");break;
        case 0:printf("构成普通三角形");break;
        case 1:printf("构成等腰三角形");break;
        case 2:printf("构成等边三角形");break;
    }
}

 2.4 函数与变量的关系

2.4.1 局部变量:

局部变量:定义在函数内部的变量称为局部变量

局部变量的表现形式:定义在函数体内的变量

                                          函数的形式参数

                                          定义在语句块内的变量

局部变量的作用域:从定义开始,到函数结束(语句块内的变量到语句结束)

注意:不同作用域下的局部变量可以同名

2.4.2 全局变量

全局变量:也称全程变量和外部变量,就是定义在函数体外部的变量

作用域:从定义开始到整个程序结束为止,该变量定义后的任意一个函数都可以使用他

注意:局部变量可以跟全局变量同名,函数体内使用的默认是局部变量(就近访问原则,局部优先原则)

如果非要使用全局变量,也不是不可以,需要使用关键字 extern 来声明

#include<myhead.h>

void fun();          //将函数提前声明

int value = 1314;          //该变量是全局变量


//自定义函数
void fun()
{
    int argc = 520;       //不同作用域下允许定义同名的变量

    //函数只能使用提前定义的全局变量,后面的全局变量不能使用
    //printf("value = %d, value_1 = %d\n", value, value_1);
}

//定义全局变量
int value_1 = 666;



int main(int argc, const char *argv[])
{
    printf("argc = %d\n", argc);        //输出传入参数的个数
    for(int i=0; i<argc; i++)
    {
        printf("argv[%d] = %s\n", i, argv[i]);  //输出传入的值
    }

    int num = 520;       //定义函数内部的变量,该变量的作用域从定义到程序结束
    
    //定义语句块内的变量
    if(1)
    {
        int key = 1314;   //这里也是局部变量,作用域仅仅在if语句块内
    }

    //此处可以使用局部变量num但是不能使用局部变量key
    //printf("argc = %d, num = %d, key = %d\n", argc, num, key);

    int value = 999;        //定义一个与全局变量同名的局部变量
    printf("value = %d\n", value);          //999

    {
        extern  int value;              //表示要使用全局变量的value
        printf("value = %d\n", value);          //1314
    }


    return 0;
}

2.4.3静态局部变量

静态局部变量:在函数体内定义一个功能上类似于全局变量的局部变量

定义格式:static 数据类型 变量名;

作用域:只能在函数体内被使用,但是,生命周期随着整个程序的结束而结束

#include<myhead.h>

void fun()
{
    int num = 520;      //定义一个普通的局部变量

    num ++;

    printf("num = %d\n", num);
}

void hun()
{
    static int num = 520;      //定义一个静态的局部变量,具有保值的功能
                            //不会随着所在函数结束,而释放空间

    num ++;

    printf("num = %d\n", num);
}



//主程序
int main(int argc, const char *argv[])
{

    for(int i=0; i<3; i++)
    {
        hun();
    }
    

    return 0;
}

作业 

完成学生管理系统

1> 使用菜单完成

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

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

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

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

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

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

#include<stdio.h>
#include<string.h>
int num=0;//学生人数
char stu_name[20][20]={""};//学生姓名
int stu_grade[20]={0};//学生成绩

//菜单
void print_menu(){
    printf("学生管理系统\n");
    printf("1:成绩录入\n");
    printf("2:学生成绩查询\n");
    printf("3:优秀学生\n");
    printf("4:成绩排名\n");
    printf("5:姓名排名\n");
    printf("0:退出\n");
}

//成绩录入
void stu_grade_input(){
    printf("请输入学生姓名\n");
    scanf("%s",stu_name[num]);
    printf("请输入学生成绩\n");
    scanf("%d",&stu_grade[num++]);
}

// //成绩查询
// int stu_grade_cheak(){
//     printf("请输入需要查询的学生姓名\n");
//     char arr[20][20];
//     scanf("%s",arr[0]);
//     for(int i=0;i<num;i++){
//         if(strcmp(arr[0],stu_name[i])==0){
//             printf("%s的成绩为%d\n",arr[0],stu_grade[i]);  
//             return 0;
//         }
//     }
//     printf("查询不到\n");
// }

//成绩查询
void stu_grade_cheak(){
    for(int i=0;i<num;i++){
        printf("%s的成绩为%d\n",stu_name[i],stu_grade[i]);
    }
}

//优秀学生查询
void stu_grade_Max(){
    int Max=stu_grade[0];
    int Maxi=0;
    for(int i=1;i<num;i++){
        if(Max<stu_grade[i]){
            Max=stu_grade[i];//取最大值
            Maxi=i;//取最大值坐标
        }
    }
    printf("成绩最好的为%s,成绩为%d\n",stu_name[Maxi],Max);
}

//成绩升序
void stu_grade_xu1(){
    for(int i=1;i<num;i++){
        for(int j=0;j<num-i;j++){
            if(stu_grade[j]>stu_grade[j+1]){
                //成绩交换
                int temp=stu_grade[j];
                stu_grade[j]=stu_grade[j+1];
                stu_grade[j+1]=temp;
                //姓名交换
                char tem[20]="";
                strcpy(tem,stu_name[j]);
                strcpy(stu_name[j],stu_name[j+1]);
                strcpy(stu_name[j+1],tem); 
            }
        }
    }
    for(int i=0;i<num;i++){
        printf("%s的成绩为%d\n",stu_name[i],stu_grade[i]);
    }
}

//成绩升序
void stu_grade_xu2(){
    for(int i=1;i<num;i++){
        for(int j=0;j<num-i;j++){
            if(strcmp(stu_name[j],stu_name[j+1])>0){
                //成绩交换
                int temp=stu_grade[j];
                stu_grade[j]=stu_grade[j+1];
                stu_grade[j+1]=temp;
                //姓名交换
                char tem[20]="";
                strcpy(tem,stu_name[j]);
                strcpy(stu_name[j],stu_name[j+1]);
                strcpy(stu_name[j+1],tem); 
            }
        }
    }
    for(int i=0;i<num;i++){
        printf("%s的成绩为%d\n",stu_name[i],stu_grade[i]);
    }
}

//主函数
int main(){
    while(1){
        print_menu();
        printf("请选择\n");
        int n=-1;
        scanf("%d",&n);
        switch(n){
            case 1:
                stu_grade_input();
                break;
            case 2:
                stu_grade_cheak();
                break;
            case 3:
                stu_grade_Max();
                break;
            case 4:
                stu_grade_xu1();
                break;
            case 5:
                stu_grade_xu2();
                break;
            case 0:
                return 0;
            default:
                printf("输入错误\n");
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值