在此基础上添加排序系统和统计人数系统


#include<stdio.h>
#include<stdlib.h>
#include<string.h>//需要用到strcmp函数 

#define LEN 15//姓名和学号的最大字符数 
#define N 50//最大学生人数

int n = 0, t = 1;//n代表当前学生人数,t用来控制整个程序的执行,以及程序的退出; 

//函数声明
void menu();//主菜单函数 
void insert();//增加学生信息  
void search();//查找学生信息
void del();//删除学生信息 
void present();//显示当前信息
void tuichu();//退出函数 

struct student
{
    char StuID[LEN];//学生学号 
    char Stuname[LEN];
    int Stuage;
    char Stusex;
    float score[3]; //各科成绩 
}stu[N];

int main()
{
    int num;//num是菜单选项 
    while (t)//t是全局变量,用tuichu函数来控制循环是否继续 
    {
        menu();//输出主菜单界面 
        printf("您好,请输入菜单编号:");
        scanf("%d", &num);
        switch (num)
        {
        case 1: insert(); break;
        case 2: search(); break;
        case 3: del(); break;
        case 4: present(); break;
        case 5: tuichu(); break;
        default:printf("输入有误,请重新输入!");
        }


    }

    system("pause");
    return 0;
}
void menu()
{
    printf("\n\n");
    printf("*****************************************************\n");
    printf("*----------------------duoduo------------------------\n");
    printf("*                 学生信息管理系统                  *\n");
    printf("*****************************************************\n");
    printf("********************系统功能菜单*********************\n");
    printf("----------------------     --------------------------\n");
    printf("*****************************************************\n");
    printf("**    1、插入学生信息   *     2、查找学生信息      **\n");
    printf("*****************************************************\n");
    printf("**    3、删除学生信息   *     4、输出学生信息      **\n");
    printf("*****************************************************\n");
    printf("**    5、退出系统       *                          **\n");
    printf("*****************************************************\n");
    printf("*****************************************************\n");
    printf("----------------------     --------------------------\n");

}

void insert()
{
    int i = n, j, flag, m = 0;//i代表增加学生信息过程中任意时刻的学生人数 
    printf("\n请输入待增加的学生人数:\n");
    scanf("%d", &m);
    if (m > 0) {
        do {
            flag = 1;
            while (flag)
            {
                flag = 0;
                printf("请输入第%d位学生的学号:\n", i + 1);//第几位学生从1开始计数,而stu[]从零开始,需要加1 
                scanf("%s", stu[i].StuID);
                //判断学号是否重复
                for (j = 0; j < i; j++) {
                    if (strcmp(stu[i].StuID, stu[j].StuID) == 0) {
                        printf("该学号已经存在,请重新输入!\n");
                        flag = 1;
                        break;
                    }
                }
            }
            printf("请输入第%d位学生姓名:\n", i + 1);
            scanf("%s", stu[i].Stuname);
            printf("请输入第%d位学生年龄:\n", i + 1);
            scanf("%d", &stu[i].Stuage);
            getchar();//处理上面输入的换行符,不然系统会把换行符当做一个字符赋值给性别 
            printf("请输入第%d位学生性别:\n", i + 1);
            scanf("%c", &stu[i].Stusex);
            printf("请输入第%d位学生的C语言成绩:\n", i + 1);
            scanf("%f", &stu[i].score[0]);
            printf("请输入第%d位学生的高数成绩:\n", i + 1);
            scanf("%f", &stu[i].score[1]);
            printf("请输入第%d位学生的大学英语成绩:\n", i + 1);
            scanf("%f", &stu[i].score[2]);
            i++;
        } while (i < n + m);//只要当前学生人数还没到达添加后的总人数,就得继续添加        
    }
    n += m;// 添加完成,系统人数n的值也要增加 
    printf("添加完成!!!\n");
    system("pause");
}
void search()
{
    int i, num, flag;
    char s1[LEN + 1];
    printf("*****************************\n");
    printf("**-------1.按学号查询------**\n");
    printf("**-------2.按姓名查询------**\n");
    printf("**-------3.退出本菜单------**\n");
    printf("*****************************\n");
    while (1)
    {
        flag = 0;
        printf("请输入子菜单:");
        scanf("%d", &num);
        switch (num)
        {
        case 1:
            printf("请输入需要查找学生的学号:\n");
            scanf("%s", s1);
            for (i = 0; i < n; i++)
            {
                if (strcmp(stu[i].StuID, s1) == 0)
                {
                    flag = 1;
                    printf("学号\t\t姓名\t\t性别\t\t年龄\t\tC语言\t\t高数\t\t英语\n");
                    printf("%s\t\t%s\t\t%c\t\t%d\t\t%.2f\t\t%.2f\t\t%.2f\n", stu[i].StuID, stu[i].Stuname, stu[i].Stusex, stu[i].Stuage, stu[i].score[0], stu[i].score[1], stu[i].score[2]);
                }
            }break;
        case 2:
            printf("请输入需要查找学生的姓名:\n");
            scanf("%s", s1);
            for (i = 0; i < n; i++)
            {
                if (strcmp(stu[i].Stuname, s1) == 0)
                {
                    flag = 1;
                    printf("学号\t\t姓名\t\t性别\t\t年龄\t\tC语言\t\t高数\t\t英语\n");
                    printf("%s\t\t%s\t\t%c\t\t%d\t\t%.2f\t\t%.2f\t\t%.2f\n", stu[i].StuID, stu[i].Stuname, stu[i].Stusex, stu[i].Stuage, stu[i].score[0], stu[i].score[1], stu[i].score[2]);
                }
            }break;
        case 3: return;
        default: printf("请在1--3之间输入\n");
        }
        if (flag == 0)
            printf("找不到该学生!\n请重新输入!");
    }
}
void del()
{
    int i, j, flag;
    char s1[LEN];
    printf("请输入需要删除的学生学号:\n");
    scanf("%s", s1);
    flag = 0;
    for (i = 0; i < n; i++)
    {
        if (strcmp(s1, stu[i].StuID) == 0)
        {
            flag = 1;
            for (j = i; j < n - 1; j++)
            {
                stu[j] = stu[j + 1];//直接把后面的学生都往前移动一位 
            }
        }
        if (flag == 1) break;//说明已经找到了需要删除的学生,结束循环 
    }
    if (0 == flag)
    {
        printf("该学号不存在!!!\n");
    }

    if (1 == flag)
    {
        printf("删除成功\n");
        n--;
    }
    system("pause");
}

void present()
{
    int i;

    if (n == 0)
    {
        printf("您好,现在没有学生信息,请先增加学生信息或者刷新再来试试!\n");
    }
    else
    {
        printf("现在共有%d名学生:\n", n);
        printf("学号\t\t姓名\t\t性别\t\t年龄\t\tC语言\t\t高数\t\t英语\n");
        for (i = 0; i < n; i++)
        {
            printf("%s\t\t%s\t\t%c\t\t%d\t\t%.2f\t\t%.2f\t\t%.2f\n", stu[i].StuID, stu[i].Stuname, stu[i].Stusex, stu[i].Stuage, stu[i].score[0], stu[i].score[1], stu[i].score[2]);
        }
    }

    system("pause");
}
void tuichu()
{
    int h;//控制是否确认退出 
    printf("即将退出,确认请按1,取消请按0\n");
    scanf("%d", &h);
    if (h == 1)
    {
        t = 0;//t是main函数中while函数是否继续执行的控制条件,是一个全局变量,程序开头已经定义并且赋值位 1
        printf("成功退出,感谢使用!\n");
    }
    if (h == 0)
    {
        printf("退出已取消!\n");
        system("pause");
    }

}    




    

供参考:

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

#define LEN 15//姓名和学号的最大字符数 
#define N 50 //最大学生人数

int n = 0, t = 1;//n代表当前学生人数,t用来控制整个程序的执行,以及程序的退出; 

struct student
{
    char StuID[LEN];//学生学号 
    char Stuname[LEN];
    int Stuage;
    char Stusex;
    float score[3]; //各科成绩 
}stu[N];

void sort()  //排序函数
{
    int   i, j;
    struct student tmp;
    for (i = n - 1; i > 0; i--)
    {
        for (j = 0; j < i; j++)
        {
            if (stu[j].score[0] > stu[j + 1].score[0]) // 以其中一门的课程成绩排序
            {
                tmp = stu[j]; stu[j] = stu[j + 1]; stu[j + 1] = tmp;
            }
        }
    }
}

int count() //统计人数函数
{
    return n;  // n 是学生人数的总和,还需要专门的统计?
}

不知道你这个问题是否已经解决, 如果还没有解决的话:

        发射机和接收机在出厂时已对码成功,如果不成功或者使用其他的发射机、接收机,需要对码。

  1. 打开发射机电源,点击,再点击屏幕右上角[SYS],选择[RX bind]。
  2. 将对码线连接在接收机的BIND/VCC接口。
  3. 将电源线连接到接收机上任意其他接口,接收机的指示灯开始快速闪烁,表示发射机进入对码状态。
  4. 将对码线和电源从接收机上断开,然后重新将电源线接到BIND/VCC接口。
  5. 检查发射机、接收机是否正常工作,如有异常,重复上述步骤重新对码。
  • 主界面显示模型相关信息,包括计时器、飞行模式和TX/RX状态。

  •  主界面向右滑动,可查看各通道状态(上下滑动翻页查看,长按屏幕可进行舵机检测)。

         注意:测试前,应确保油门引擎未启动,否则可能造成飞机损坏或者人员受伤。

  •  主界面向左滑动进入传感器显示界面

        点击图标进入主菜单,向上或向下滑动屏幕浏览设置菜单。如果要进入功能设置菜单,点击功能名称就可以了。点击图标可以回到上级菜单。

  • 飞行模式

         飞行模式功能可设置最多9种飞行模式,并通过组合开关切换。此功能由五个部分组成:

        A:设置一个通道用于模式控制,点击通道右边的图标,选择需要使用的通道。点击屏幕左侧的上下箭头,或者在屏幕右侧向上下滑动选择通道。选择√确认数值,或选择×退出修改菜单。

        B:选择一个开关用于切换模式。

        C:选择第二个开关用于切换模式。

        D:数字代表当前飞行模式的编号,模型名称可以重命名。点击模型名称的图标,使用屏幕下方的键盘重命名,选择图标保存并返回上级菜单。

        E:修改每个飞行模式对应的输出值。点击图标选择需要修改的数据位数,点击屏幕左侧的上下箭头或者在屏幕右侧向上下滑动选择输出值,选择√确认数值或选择×退出修改菜单。

        飞行模式的数量可通过不同的开关组合决定,使用1个两档开关控制,可切换模式1和模式2,使用2个两档开关组合控制,可以切换4种飞行模式,使用2个三档开关组合控制,可以切换9种飞行模式,组合功能如下图:

  •  计时器

        在主界面点击计时器图标进入,系统提供两个计时器和三种不同模式的计时功能,并能够使用开关控制。设置的方法为:选择计时模式,Up为从零开始计时,Down是从设定的时间开始倒数计时,D/U(Down then Up)为从设定时间开始倒数计时到零,然后从零开始计时。如果选择[Down]或[D/U]计时模式,应点击[Setup]图标,然后点击需要修改的参数位数,点击屏幕左侧的上下箭头,或者在屏幕右侧向上下滑动改变时间。

  • 正逆转

         正逆转功能用于矫正舵机或电机的控制方向。例如,如果由于飞机的结构原因,方向舵机必须反向安装,那么转动方向手轮,飞机会转向相反的方向。此时,将方向通道设置为反向,即可解决该问题。设置方向为:从列表中选择需要设置的通道,点击图标切换正向或者反向,[Nor]为正向,[Rev]为反向。

  • 最大舵量

         最大舵量功能用于设置各通道舵机的高低行程程度限制,根据模型结构来调节舵机的最大行程。左边蓝色图标对应低端方向的舵量,右边红色图标对应高端方向的舵量。设置方法为:从列表中选择需要设置的通道,点击低端或者高端图标。点击需要修改的参数位数,然后点击屏幕左侧的上下箭头或者在屏幕右侧上下滑动改变数值。之后选择√确认数值或者选择×退出修改菜单。

  • 辅助通道

         这个功能可以设置默认通道外的其他通道,用于控制模型的其他部分。设置方法为:点击图标两侧的箭头选择需要设置的通道,左边的图标表示当前通道控制器的类型,点击图标可选择由旋钮、遥感、按键和开关控制或者选择[NUL],然后点击右边图标选择当前通道控制器(如果通道被飞行模式占用,系统会提示此通道已不能再次被分配)。

  • 记忆微调

 

 

        记忆微调功能用来调整各通道舵机的中位。设置方法为:从列表中选择需要设置的通道,点击需要修改的参数位数,用箭头或者滑动修改数值。选择√确认或者×退出修改菜单。

        混控

        混控功能可用于设置通道之间的混控关系(当前状态为混控功能已开启,)。设置主控通道,设置从控通道,为从通道添加偏移值,负值可使从通道向低端偏移,设置主控通道高端对从控通道的影响范围,若高端混控设置到50%,当主控通道移动到100%时,从控通道同时移动到50%。设置主控通道低端对从控通道的影响范围,若低端混控设置到50%,当主控通道移动到-100%时,从控通道同时移动到-50%。

        设置方法为:点击[ON]图标开启混控功能,点击[master]右边的图标,并从通道列表中选择一项作为主控通道,点击[slave]右边的图标,并从通道列表中选择一项作为从控通道。根据需求为从控通道添加偏移,点击[Offset]右边的图标,选择需要修改的参数位数,然后点击箭头或者上下滑动屏幕改变偏移值,选择√确认或者×退出修改菜单。点击[Pos]右边的图标,选择需要修改的参数位数,然后点击箭头或者上下滑动屏幕改变偏移值,选择√确认或者×退出修改菜单。

  • 失控保护

        该功能用于在接收机丢失信号或失控后保护飞机和操作人员的安全。失控保护菜单下显示十个通道的列表,如果在通道后显示[关闭],表示飞机在丢失信号后,该通道的舵机会继续保持失控前的位置继续行驶。如果显示一个百分比,则表示模型在丢失信号后,该通道的舵机会移动到百分比对应的位置,并保持在该位置继续行驶。

        设置方法为:选择需要设置的通道,选择[On]开启功能,通过发射机上的控制装置将舵机调整至目标位置,界面底部坐标可显示当前通道输出值。选择[Setup]设置百分比数值。选择[Set all]可以一次性设置所有通道的失控保护位置,使用发射机上的控制装置将各通道舵机调整到目标位置,选择[Set all],然后在弹出的确认框中选择[Y](选择[Reset all]可以复位所有通道的失控保护位置)。

  • 背光和声音

         此功能可以设置屏幕的对比度和系统音量。拖动背光或者声音进度条中的黑色滑块,可修改屏幕对比度和系统音量。

  • 输出模式

         此功能可选择接收机的两种输出模式,PWM和PPM模式。根据需求选择输出模式,黑点图标表示当前选定的模式。

  • 摇杆模式

         此系统支持四种摇杆模式,根据需求在屏幕右侧点击[M1]、[M2]、[M3]或[M4],黑色图标表示当前选定的模式。

  • 恢复出厂设置

        将系统恢复至默认的出厂设置,点击[Factory Reset]图标,在提示框中选择[Y]确认。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^