数据结构课设(工资管理系统)

数据结构课设(工资管理系统)

PS:C语言,链表

在代码文件同级目录下会生成stdent.txt文件,存放保存的信息

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

//定义一个学生信息存储结构体
typedef struct student
{
    char no[12];            //学号
    char name[40];          //姓名
    int Chinese;
    int math;
    int English;
    struct student* next;    
}STU;

STU* LIstInit(STU* L);
STU* ListCreate(STU* L, int n);
void ListInsert(STU* L);
void ListDelete(STU* L, char n[40]);
void LIstSearch(STU* L, char n[]);
void input(STU* p, int i);
void output(STU* L);
void menu();
//创建表头,初始化链表:
STU* LIstInit(STU* L)
{
    STU* head = NULL;
    head = (STU*)malloc(sizeof(STU));
    head->next = NULL;
    L = head;
    return L;
}
//创建一个链表并把节点插入到链表的表头:
STU* ListCreate(STU* L, int n)
{
    int i;
    for (i = 0; i < n; i++)
    {
        STU* p;
        //将新生成的节点插入到链表中
        p = NULL;
        p = (STU*)malloc(sizeof(STU));
        input(p, i);
        p->next = L->next;
        L->next = p;
    }
    return L;
}
//对学生信息的插入操作:
void ListInsert(STU* L)
{
    STU* s = NULL;
    //生成一个新节点s
    s = (STU*)malloc(sizeof(STU));
    printf("请输入您要插入的学生的学号:");
    scanf("%s", &s->no);
    printf("请输入您要插入的学生的姓名:");
    scanf("%s", &s->name);
    printf("请输入学生的各科成绩:");
    scanf("%d", &s->Chinese);
    scanf("%d", &s->math);
    scanf("%d", &s->English);
    s->next = L->next;
    L->next = s;
}
//对学生信息的删除操作:
void ListDelete(STU* L, char n[])
{
    STU* p = L->next, * pre = L;  
    if (p == NULL)
        printf("无该学生信息!");
    else
    {
        while (strcmp(p->name, n) != 0)
        {
            pre = p;
            p = pre->next;
            if (p == NULL)
            {
                printf("无该学生信息!\n");
                return;
            }
        }
        pre->next = p->next;
        free(p);
        printf("删除成功");
    }
}
//对学生信息的查找操作:
void LIstSearch(STU* L, char n[])
{
    STU* p = L->next;
    if (p == NULL)
        printf("数据为空,无法查找!");
    else
    {
        while (strcmp(p->name, n) != 0)
        {
            p = p->next;
            if (p == NULL)
            {
                printf("无该学生信息\n");
                return;
            }
        }
        printf("该学生的成绩为:\n");
        printf("\tChinese:%d math:%d English:%d\n", p->Chinese,p->math,p->English);
    }
}
//对学生信息的修改操作:
void ListModify(STU* L, char n[])
{
    int a,b,c;
    STU* p = L->next;
    while (p != NULL)
    {
        if (strcmp(p->name, n) == 0)
        {
            printf("请选择您修改后的学生成绩:\n");
            scanf("%d",&a);
            p->Chinese=a;
            scanf("%d",&b);
            p->math=b;
            scanf("%d",&c);
            p->English=c;
            break;
        }
        p = p->next;
    }
}
//学生信息输入:
void input(STU* p, int i)
{
    printf("请输入第%d名学生的学号:", i + 1);
    scanf("%s", &p->no);
    printf("请输入第%d名学生的姓名:", i + 1);
    scanf("%s", &p->name);
    printf("请输入第%d名学生的各科成绩(语文,数学,英语):", i + 1);
    scanf("%d", &p->Chinese);
    scanf("%d", &p->math);
    scanf("%d", &p->English);
}
//学生信息输出
void output(STU* L)
{
    STU* p = L->next;
    while (p != NULL)
    {
        printf("%s\t\t", p->no);
        printf("%s\t", p->name);
        printf("\t%d", p->Chinese);
        printf("\t\t%d", p->math);
        printf("\t\t%d", p->English);
        printf("\n");
        p = p->next;
    }
}
//打印 
void PrintFile(STU* L)
{ 
    STU* p = L->next;
    FILE* fp;
    fp = fopen("student.txt", "w");
    fprintf(fp, "学号\t\t姓名\t\t语文\t\t数学\t\t英语\t\t\n");
    while (p != NULL)
    {
        fprintf(fp, "%s\t", p->no);
        fprintf(fp, "\t%s\t", p->name);
        fprintf(fp, "\t%d", p->Chinese);
        fprintf(fp, "\t\t%d", p->math);
        fprintf(fp, "\t\t%d", p->English);
        fprintf(fp, "\n");
        p = p->next;
    }
    printf("保存成功,请到当前目录下的student.txt文件中查看");
    fclose(fp);
}
//菜单函数 
void menu()
{
    printf("\t\t\t              学生成绩管理系统                     \n");
    printf("\t\t\t          1. 录入学生的成绩信息                    \n");
    printf("\t\t\t          2. 全部学生的成绩信息                    \n");
    printf("\t\t\t          3. 查找某个就学生的成绩                  \n");
    printf("\t\t\t          4. 修改某个学生的成绩                    \n");
    printf("\t\t\t          5. 删除某个学生的成绩信息                \n");
    printf("\t\t\t          6. 插入某个学生的成绩信息                \n");
    printf("\t\t\t          7. 保存学生信息                          \n");
    printf("\t\t\t          0. 退出管理系统                          \n");
    printf("\t\t\t 输入选项,按回车进入选项:                          \n");
}
//主函数 
int main()
{
    int item, n;         
    char nam[30];
    STU* L = NULL;
    L = LIstInit(L);
    do
    {
        menu();
        printf("请输入相应的数字,进行相应的操作:\n");
        scanf("%d", &item);
        switch (item)
        {
        case 1:
            printf("请输入您要录入的学生人数:");
            scanf("%d", &n);
            L = ListCreate(L, n);
            break;
        case 2:
            printf("全部学生信息如下:\n");
            printf("学号\t\t姓名\t\t语文\t\t数学\t\t英语\t\t\n");
            output(L);
            break;
        case 3:
            printf("请输入您要查找的学生姓名:");
            scanf("%s", nam);
            LIstSearch(L, nam);
            break;
        case 4:
            printf("请输入您要修改的学生姓名:");
            scanf("%s", nam);
            ListModify(L, nam);
            break;
        case 5:
            printf("请输入您要删除的学生的姓名:");
            scanf("%s", nam);
            ListDelete(L, nam);
            break;
        case 6:
            ListInsert(L);
            break;
        case 7:
            PrintFile(L);
            break;
        case 0:
            printf("退出学生成绩管理系统.....");
            exit(0);
        default:
            break;
        }
        printf("\n\n\n\n");
    } while (item);
    return 0;
}
 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值