day08

一 二维字符数组

1> 引入目的:

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

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

2> 定义格式:

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

常量1:表示的是定义的字符串的个数 参数2:表示的是每个字符串的最大长度+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"}; //没有初始化的字符串 默认为空串

4> 二维数组元素的使用

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

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

#include<stdio.h>
#include<string.h>
#define MAX 5               //定义字符串的个数

int main(int argc, const char *argv[])
{
    //定义一个二维字符数组
    char arr[MAX][20] = {""};      //定义了一个长度为MAX的字符串数组

    //完成对字符串的输入输出
    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] = "";       //用于存储最大字符串
    //max = arr[0];      //字符串不能直接使用等号进行赋值
    strcpy(max, arr[0]);     //将第一个字符串当做最值
    for(int i=0; i<MAX; i++)
    {
        //跟任意一个字符串进行比较
        if(strcmp(max,arr[i]) < 0)
        {
            //更新最值
            strcpy(max, arr[i]);
        }
    }

    printf("最大字符串为:%s\n", max);

    //将所有字符串进行排序
    char temp[20] = "";        //交换变量
    for(int i=1; i<MAX; i++)  //外层控制趟数
    {
        for(int j=0; j<MAX-i; j++)   //控制元素
        {
            if(strcmp(arr[j], arr[j+1]) > 0)
            {
                //交换三部曲
                strcpy(temp, arr[j]);
                strcpy(arr[j], arr[j+1]);
                strcpy(arr[j+1], temp);
            }
        }
    }

    //输出排序后的结果
    printf("目前的字符串分别是:");
    for(int i=0; i<MAX;i++)
    {
        printf("%s\t", arr[i]);
    }
    puts("");


    return 0;
}
 

二、函数概述


1.1    引入目的


1>    系统会提供一些库函数供大家使用,但是,提供的函数毕竟有限,如果想要使用特别定制的函数,需要自己封装
2>    对于一些重复调用的语句块而言,如果不加封装的话,会使得代码比较冗余
3>    为了提高编程效率,我们引入了函数,能够做到一处修改,处处修改
4>    目前接触的函数:printf、scanf、putchar、getchar、puts、gets、strlen、strcmp、strcat、strcpy

1.2    函数的定义


1>    函数:执行特定功能的一段代码块
2>    定义格式: 返回值类型  函数名(参数列表) {  函数体代码  }
1、返回值类型:函数执行后,向外界返回的一个结果值,可以有结果(非void),也可以没有结果(void)
            定义函数时:有返无返看主调,主调函数想要数据,就定义有返回值函数,主调函数要什么类型的结果,就定义什么数据类型
                        主调函数不要数据,就定义void类型
2、函数名:是一个标识符,要符合命名规则
3、():小括号是函数的标识,即使是没有参数的函数调用时也要将括号加上
4、参数列表:可以有,也可以没有,表示外界向该函数体提供的数据
            定义函数是:有参无参看主调,主调函数给数据,就定义有参函数,主调函数给几个数据,就定义几个参数接收,主调函数给什么类型的数据,就定义什么类型的参数接收
                        主调函数不给数据,就不定义参数
5、{}:要封装的函数体代码,要用花括号包裹起来
6、函数体代码:要被封装的内容


1.3    函数的分类


1>    对于函数定义格式而言,函数名和函数体代码是不可变的,但是,函数的返回值类型和函数的参数是可变的
2>    对于一个函数而言,返回值是可有可无的,参数也是可有可无的,根据此,函数分为四大类
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);


3>    关于函数的相关概念


主调函数:调用别的函数的函数叫做主调函数
被调函数:被别的函数调用的那个函数称为被调函数
形式参数:也称形参,定义函数时,括号里面的参数称为形参
实际参数:也称实参,函数调用时,括号里面的参数称为实参
4>    函数调用格式:变量名 =  函数名(实参列表);

#include<stdio.h>
#include<string.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>    局部变量:

定义在函数内部的变量称为局部变量
局部变量的表现形式:定义在函数体内的变量
         函数的形式参数
         定义在语句块内的变量
局部变量的作用域:从定义开始,到函数结束(语句块内的变量到语句结束)
注意:不同作用域下的局部变量可以同名


2>    全局变量:

也称全程变量和外部变量,就是定义在函数体外部的变量
作用域:从定义开始到整个程序结束为止,该变量定义后的任意一个函数都可以使用他
注意:局部变量可以跟全局变量同名,函数体内使用的默认是局部变量(就近访问原则,局部优先原则)
如果非要使用全局变量,也不是不可以,需要使用关键字 extern 来声明

#include<stdio.h>
#include<string.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;
}
3>    静态局部变量:

在函数体内定义一个功能上类似于全局变量的局部变量
定义格式:static 数据类型  变量名;
作用域:只能在函数体内被使用,但是,生命周期随着整个程序的结束而结束

#include<stdio.h>
#include<string.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>    定义形参接受数组时,接受数组名时,只需要定义一个变量标识数组即可

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

//定义输出函数
void print_arr(int brr[], int n)
{
    printf("数组元素分别是:");
    for(int i=0; i<n; i++)
    {
        printf("%d\t", brr[i]);
    }
    puts("");
}


//定义排序函数
void sort_arr(int brr[], int n, int flag)
{
    for(int i=1; i<n; i++)
    {
        for(int j=0; j<n-i; j++)
        {
            if(flag == 0)      //升序
            {
                if(brr[j]>brr[j+1])
                {
                    int temp = brr[j];
                    brr[j] = brr[j+1];
                    brr[j+1] = temp;
                }
            }else
            {
                if(brr[j]<brr[j+1])
                {
                    int temp = brr[j];
                    brr[j] = brr[j+1];
                    brr[j+1] = temp;
                }
            }

        }
    }
}


//定义输出brr的函数
void print_brr(char brr[][20], int n)
{
    printf("传入的字符串分别是:");
    for(int i=0; i<n; i++)
    {
        printf("%s\t", brr[i]);
    }
    puts("");
}

/******************主程序***************************/
int main(int argc, const char *argv[])
{
    int arr[8] = {1,3,2,6,7,9,5,10};        //定义一个数组并初始化

    //调用函数完成对该数组的输出
    print_arr(arr, 8);               //传递数组时,只需要传递数组名和数组容量
    
    //调用排序函数
    sort_arr(arr, 8, 0);    //升序排序

    //输出排序后的结果
    print_arr(arr, 8);

    //定义二维字符数组
    char brr[][20] = {"banana", "apple", "zhangsan"};
    //调用函数输出数组
    print_brr(brr, 3);

    return 0;
}
 


完成学生管理系统
1>    使用菜单完成
2>    有学生的信息录入功能:输入学生个数,并将学生的姓名、分数录入
3>    查看学生信息:输出所有学生姓名以及对应的分数
4>    求出学习最好的学生信息:求最大值
5>    按姓名将所有学生进行升序排序
6>    按成绩将学生学生进行升序排序

#include <stdio.h>
#include <string.h>
#define Max 10 //学生最多数量
int inputhumen(char a[][5], int b[], int D)
{
    int N;        //输入学生人数
    if (D == Max) //人数已满
    {
        printf("人数已满\n");
        return 0;
    }
    else
    {
        printf("请输入要录入的学生人数\n");
        scanf("%d", &N);
        for (int i = 1; i <= N; i++)
        {
            printf("请输入第%d位学生的姓名\n", i);
            scanf("%s", a[D]);
            printf("请输入学生成绩百分制\n");
            scanf("%d", &b[D]);
            D++; //人数加1
            if (D == Max)
            {
                printf("人数已满\n");
                break;
            }
        }
    }
    return N;
}
void seehuman(char a[][5], int b[], int D)
{
    for (int i = 0; i <= D - 1; i++) //遍历姓名与成绩数组
    {
        printf("姓名%s 分数%d\n", a[i], b[i]);
    }
}
void findgood(char a[][5], int b[], int D)
{
    int max = 0; //分数最大值
    int q = 0;   //最大值下标
    max = b[0];  //最大值先定为第一个元素
    q = 0;       //下标先定为0
    for (int i = 1; i <=D - 1; i++)
    {
        if (b[i] > max) //成绩比max更大
        {
            q = i; //下标赋值
        }
    }
    printf("最好的学生是%s,分数是%d\n", a[q], b[q]);
}
void uphumen(char a[][5], int b[], int D)
{

    for (int i = 1; i < D; i++) //趟数
    {
        for (int j = 0; j < D - 1; j++) //遍历数组
        {
            if (strcmp(a[j + 1], a[j]) < 0) //字符串比较前一个姓名比后一个姓名大
            {
                char z[200] = ""; //姓名交换
                strcpy(z, a[j]);
                strcpy(a[j], a[j + 1]);
                strcpy(a[j + 1], z);
                int temp = b[j]; //分数交换
                b[j] = b[j + 1];
                b[j + 1] = temp;
            }
        }
    }
    printf("按姓名排序已完成\n");
}

void upsorce(char a[][5], int b[], int D)
{

    for (int i = 1; i < D; i++)
    {
        for (int j = 0; j < D - 1; j++) //比较前一个分数比后一个分数大
        {
            if (b[j] > b[j + 1])
            {
                char c[200] = "";
                strcpy(c, a[j]);
                strcpy(a[j], a[j + 1]);
                strcpy(a[j + 1], c);
                int temp = b[j];
                b[j] = b[j + 1];
                b[j + 1] = temp;
            }
        }
    }
    printf("按分数排序已完成\n");
}
int main()
{
    int k = 0;
    char a[200][5] = {" "}; //用来存储学生姓名
    int b[200] = {0};       //用来存储学生分数
    int D = 0;              //学生数量标识符
    while (1)
    {
        printf("1> 录入学生信息\n2> 查看学生信息\n3> 找出学习最好的学生\n4> 按姓名升序排序\n5> 按成绩升序排序\n6> 退出系统\n");
        scanf("%d", &k);
        getchar();
        switch (k)
        {
        case 1:
            D += inputhumen(a, b, D);//人数加N
            break;
        case 2:
            seehuman(a, b, D);
            break;
        case 3:
            findgood(a, b, D);
            break;
        case 4:
            uphumen(a, b, D);
            break;
        case 5:
            upsorce(a, b, D);
            break;
        case 6:
            return 0;
        default:
            printf("输入错误\n");
            break;
        }
    }
    return 0;
}

《淘淘商城-day08.docx》是一份关于淘淘商城第八天工作的文档。在这一天,淘淘商城的团队采取了一系列措施来进一步提升用户体验和销售业绩。 首先,团队进行了网站内容的优化。他们对商品详情页进行了修复和更新,确保信息的准确性和完整性。同时,他们也对页面的布局进行了调整,使得用户更容易浏览和购买商品。这些改进措施能够提升用户的满意度和购买转化率。 其次,团队还加强了与供应商的合作关系。他们与一些热门品牌建立起了合作伙伴关系,以获得独家销售权或更优惠的价格。这不仅能够吸引更多的用户,还能提高淘淘商城的竞争力。 另外,团队还对物流配送进行了优化。他们与一家可靠的物流公司合作,以确保商品能够及时、安全地送达给用户。他们还推出了更快速、更便捷的配送选项,如次日达和晚间配送,以满足用户的各种需求。 为了增加用户的复购率,团队还积极进行了促销活动。他们推出了限时限量的特价商品,以及购买一定金额就能获得赠品或折扣的优惠活动。这些促销措施能够吸引用户重复购买,并提升销售额。 总之,《淘淘商城-day08.docx》记录了淘淘商城团队在第八天所做的一系列工作。通过网站内容优化、供应商合作、物流配送优化和促销活动,团队致力于提升用户体验和销售业绩,从而使淘淘商城更加竞争和成功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值