7.16C语言

笔记

杂项

一.结构体

1.1引入目的

        1)系统中提供的数据类型不够使用,自己定义数据类型以供程序使用

        2)结构体本质上时数据类型,属于构造数据类型

        3)定义:由相同数据类型或不同数据类型构成的数据的集合,叫做结构体

1.2定义以及初始化

定义格式:

                struct 结构体名称

        {

                成员类型1        成员变量1

               成员类型2        成员变量2

                ........

                成员类型n        成员变量n

        };

注意事项:

        1)struct是定义结构体类型的关键字,不能省略

        2)结构体名称:标识符,符合命名规则,一般建议首字母大写

        3)成员属性使用一对花括号包裹起来

        4)成员类型可以是基本数据类型,也可以是构造数据类型、指针类型

        5)定义结束后,必须加上分号结尾

1.3使用结构体类型定义变量

定义格式:        struct        结构体名称        名称名;

注意事项:定义变量时,struct也不能省略;

                也可以在进程类型定义时,顺便定义一个结构体变量;

                

struct Stu
{
    char name[20];
    int age;
    double score;
}s1;
//此时s1就是一个结构体变量
1.4初始化结构体变量

       1)定义类型时,顺便定义一个变量

       2)在主函数中使用定义的结构体类型定义变量

       3)只给部分成员初始化

1.5结构体访问成员

        1)普通结构体变量访问成员时,使用成员运算符‘ .'来进行,读作“的”

        2)结构体指针变量访问成员,使用成员运算符‘->’来进行,读作“的”

        3)在进行成员访问时,访问的最终类型,就是最后一个成员所表示的结果类型

        4)当一个结构体类型中的某一个成员变量也是一个结构体变量时,如果要进行最深一级的访问,需要使用成员运算符一级一级进行访问

1.6结构体变量的输入输出

通过成员运算符,找到结构体变量的普通成员后,本质上就是一个普通变量的输入输出

1.7结构体数组

        1)结构体数组本质上也是一个数组,只是每个元素是结构体变量

        2)定义格式:struct 结构体名        数组名[常量]

1.8结构体大小

        1)结构体变量所占内存空间的大小,是各个成员所占内存空间之和

        2)要遵循字节对齐原则,有两个

                1.结构体中的每个成员,在分配内存时,要以数据类型对齐一次

                2.所有成员分配内存结束后,整体需要对其一次

                                32位系统以min(最大字节的成员,4)对齐

                                64位系统以min(最大字节的成员,8)对齐

        3)在C语言中一个空的结构体类型,占0字节

作业

#include<stdio.h>
#include<string.h>
#include"student_system.h"
int main(int argc, char const *argv[])
{
    int sum=0;//记录录入学生总个数
    int flag_cz=4;//用于记录操作界面的选项
    int flag_tc=0;//用于判断是否退出
    int flag_sort=0;//记录排序时要进行的选项
    while(1)
    {
        printf_interface();//操作界面显示函数
        scanf("%d",&flag_cz);
        switch(flag_cz)
        {
            case 1:
            sum=stu_input(stu,sum);//录入函数,最后返回已录入的学生人数
            break;
            case 2:
            stu_printf(stu,sum);//打印函数,将学生信息打印出来
            break;
            case 3:
            stu_score_MaxAndMin(stu,sum);
            break;
            case 4:
            stu_score_SumAndAve(stu,sum);
            break;
            case 5:
            printf_sort_interface();//排序操作界面显示函数
            scanf("%d",&flag_sort);//选择排序方式
            getchar();
            stu_sort(stu,sum,flag_sort);//排序函数有四种排序方式
            break;
            case 6:
            stu_name_find(stu,sum);
            break;
            case 7:
            return 0;
			default:
			printf("错误操作!\n");
			break;
        }
    }
    return 0;
}
#include<stdio.h>
#include<string.h>
#include"student_system.h"
void printf_interface()//操作界面打印函数
{
    putchar(10);//用于分割两个操作之间的显示
    putchar(10);//使用时个人感觉看着舒服
    printf("**********学生管理系统*********\n");//打印界面
    printf("************1.录入************\n");
    printf("************2.查看************\n");
    printf("**********3.成绩最高与最低者**\n");
    printf("**********4.总成绩和平均成绩**\n");
    printf("************5.排序************\n");
    printf("************6.查找************\n");
    printf("************7.退出************\n");
    printf("******************************\n");
    putchar(10);
    putchar(10);
    printf("请选择操作:\n");
}
int stu_input(struct Student stu[],int sum)//学生信息录入函数
{
    int num=0;
    printf("请输入你要录入的学生位数:\n");
    scanf("%d",&num);
    getchar();
    if(num>0)//判断要录入的学生人数是否大于0,大于0则正常输入,小于零则输入失败
    {
        for (int i = 0; i < num; i++)
        {
            printf("请输入第%d位入学生学号:\n",i+1);
            scanf("%ld",&stu[i].num);
            getchar();
            printf("请输入第%d位学生姓名:\n",i+1);
            scanf("%s",stu[i].name);
            getchar();
            printf("请输入第%d位入学生姓别:\n",i+1);
            scanf("%s",stu[i].sex);
            getchar();
            printf("请输入第%d位学生成绩:\n",i+1);
            scanf("%lf",&stu[i].score);
            getchar();
        }
        sum+=num;//将录入的人数加到总人数中
	    printf("输入成功!\n");
    }
    else
    printf("输入失败!");
    putchar(10);    
    putchar(10);
    return sum;
}
void stu_printf(struct Student stu[],int sum)
{
    putchar(10);
    putchar(10);
    if(sum==0)//判断学生数组是否为空
    printf("数据为空!\n");//如果没有录入过信息则打印
    else
    {
        printf("<----------------------------------------------->\n");
	    printf("学号\t\t姓名\t\t性别\t\t成绩\n");
        for (int i = 0; i < sum; i++)
        {
            printf("%ld\t\t%s\t\t%s\t\t%.2f\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].score);
        }
        printf("<----------------------------------------------->\n");
    }
    putchar(10);
    putchar(10);
}
void printf_sort_interface()//排序操作界面函数
{
    putchar(10);
    putchar(10);
    printf("************************************\n");
    printf("************1.按序号排列************\n");
    printf("************2.按名字排列************\n");
    printf("************3.按成绩排列************\n");
    printf("************4.退出******************\n");
    printf("************************************\n");
    putchar(10);
    putchar(10);
	printf("请选择你需要的操作\n");
}
void stu_sort(struct Student stu[],int sum,int flag_1)//排序函数
{
  
    int flag_2=0;
    putchar(10);
    putchar(10);
    if(sum>0)
    {

        switch(flag_1)//定义四种排序方式
        {
            case 1:
            printf("<----------------->\n");
            printf("\t1升序\n");
            printf("\t2降序\n");
            printf("\t3退出\n");
            printf("<----------------->\n");
            scanf("%d",&flag_2);
            getchar();
            switch(flag_2)
            {
                case 1:
                for (int i = 1; i < sum; i++)
                {
                    for (int j= 0; j < sum-i; j++)
                    {
    
                        if(stu[j].num>stu[j+1].num)
                        {
                            struct Student temp=stu[j];
                            stu[j]=stu[j+1];
                            stu[j+1]=temp;
                        }
                    }
                }
                printf("排序成功!\n");
                break;
                case 2:
                for (int i = 1; i < sum; i++)
                {
                    for (int j= 0; j < sum-i; j++)
                    {
    
                        if(stu[j].num<stu[j+1].num)
                        {
                            struct Student temp=stu[j];
                            stu[j]=stu[j+1];
                            stu[j+1]=temp;
                        }
                    }
                }
                printf("排序成功!\n");
                break;
                case 3:
                break;
                default:
                printf("输入错误\n");
                break;
            }
            printf("排序结果为:\n");
            printf("<----------------------------------------------->\n");
	        printf("学号\t\t姓名\t\t性别\t\t成绩\n");
            for (int i = 0; i < sum; i++)
            {
                printf("%ld\t\t%s\t\t%s\t\t%.2f\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].score);
            }
            printf("<----------------------------------------------->\n");
            break;
            case 2:
            printf("<----------------->\n");
            printf("\t1升序\n");
            printf("\t2降序\n");
            printf("\t3退出\n");
            printf("<----------------->\n");
            scanf("%d",&flag_2);
            getchar();
            switch(flag_2)
            {
                case 1:
                for (int i = 1; i < sum; i++)
                {
                    for (int j= 0; j < sum-i; j++)
                    {
    
                        if(strcmp(stu[j].name,stu[j+1].name)>0)
                        {
                            struct Student temp=stu[j];
                            stu[j]=stu[j+1];
                            stu[j+1]=temp;
                        }
                    }
                }
                printf("排序成功!\n");
                break;
                 case 2:
                for (int i = 1; i < sum; i++)
                {
                    for (int j= 0; j < sum-i; j++)
                    {
    
                        if(strcmp(stu[j].name,stu[j+1].name)<0)
                        {
                            struct Student temp=stu[j];
                            stu[j]=stu[j+1];
                            stu[j+1]=temp;
                        }
                    }
                }
                printf("排序成功!\n");
                break;
                case 3:
                break;
                default:
                printf("输入错误\n");
                break;
            }
            printf("排序结果为:\n");
            printf("<----------------------------------------------->\n");
	        printf("学号\t\t姓名\t\t性别\t\t成绩\n");
            for (int i = 0; i < sum; i++)
            {
                printf("%ld\t\t%s\t\t%s\t\t%.2f\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].score);
            }
            printf("<----------------------------------------------->\n");
            break;
            case 3:
            printf("<----------------->\n");
            printf("\t1升序\n");
            printf("\t2降序\n");
            printf("\t3退出\n");
            printf("<----------------->\n");
            scanf("%d",&flag_2);
            getchar();
            switch(flag_2)
            {
                case 1:
                for (int i = 1; i < sum; i++)
                {
                    for (int j= 0; j < sum-i; j++)
                    {
    
                        if(stu[j].score>stu[j+1].score)
                        {
                            struct Student temp=stu[j];
                            stu[j]=stu[j+1];
                            stu[j+1]=temp;
                        }
                    }
                }
                printf("排序成功!\n");
                break;
                case 2:
                for (int i = 1; i < sum; i++)
                {
                    for (int j= 0; j < sum-i; j++)
                    {
    
                        if(stu[j].score<stu[j+1].score)
                        {
                            struct Student temp=stu[j];
                            stu[j]=stu[j+1];
                            stu[j+1]=temp;
                        }
                    }
                }
                printf("排序成功!\n");
                break;
                case 3:
                break;
                default:
                printf("输入错误\n");
                break;
            }
            printf("排序结果为:\n");
            printf("<----------------------------------------------->\n");
	        printf("学号\t\t姓名\t\t性别\t\t成绩\n");
            for (int i = 0; i < sum; i++)
            {
                printf("%ld\t\t%s\t\t%s\t\t%.2f\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].score);
            }
            break;printf("学号\t\t姓名\t\t性别\t\t成绩\n");
            case 4://退出操作
            break;
            default:
            printf("输入错误\n");//未输入指定字符打印
            break;
        }
      }
    else
    {
        printf("数据为空!");
    }
    
    putchar(10);
    putchar(10);   

}
void stu_score_MaxAndMin(struct Student stu[],int sum)
{
    int max=stu[0].score;
    int min=stu[0].score;
    int MAX=0;
    int MIN=0;
    for(int i=0;i<sum;i++)
    {
        if(stu[i].score>max)
        {
            max=stu[i].score;
            MAX=i;
        }
        if(stu[i].score<min)
        {
            min=stu[i].score;
            MIN=i;
        }
    }
    printf("成绩最高者为:\n");
    printf("学号\t\t姓名\t\t性别\t\t成绩\n");
    printf("%ld\t\t%s\t\t%s\t\t%.2f\n",stu[MAX].num,stu[MAX].name,stu[MAX].sex,stu[MAX].score);
    putchar(10);
    printf("成绩最低者为:\n");
    printf("学号\t\t姓名\t\t性别\t\t成绩\n");
    printf("%ld\t\t%s\t\t%s\t\t%.2f\n",stu[MIN].num,stu[MIN].name,stu[MIN].sex,stu[MIN].score);
    putchar(10);
}
void stu_score_SumAndAve(struct Student stu[],int sum)
{
    int Sum=0;
    double Avg=0;
    for(int i=0;i<sum;i++)
    {
        Sum+=stu[i].score;
    }
    Avg=Sum/(double)sum;
    printf("班级总分为%d,平均分为%lf\n",Sum,Avg);
}
void stu_name_find(struct Student stu[],int sum)
{
    char name[30]="";
    printf("请输入你要查找的学生姓名:\n");
    scanf("%s",name);
    int flag=0;
    for (int i = 0; i < sum; i++)
    {
        if(strcmp(stu[i].name,name)==0)
        {
            printf("学号\t\t姓名\t\t性别\t\t成绩\n");
            printf("%ld\t\t%s\t\t%s\t\t%.2f\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].score);
            flag=1;
        }
    }
    if(flag=0)
    printf("未找到!\n");
    
}    
#ifndef _STUDENT_SYSTEM_H_
#define _STUDENT_SYSTEM_H_
#define M 100
struct Student
{
    long int num;
    char name[30];
    char sex[4];
    double score;
}stu[M];//定义一个数组存储学生成绩
void printf_interface();
int stu_input(struct Student stu[],int sum);
void stu_printf(struct Student stu[],int sum);
void stu_sort(struct Student stu[],int sum,int flag_1);
void printf_sort_interface();
void stu_score_SumAndAve(struct Student stu[],int sum);
void stu_score_MaxAndMin(struct Student stu[],int sum);
void stu_name_find(struct Student stu[],int sum);
#endif // !_STUDENT_SYSTEM_H_

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值