学生信息管理系统代码全篇

2023-10-26

/*学生信息管理系统*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#include<winbase.h>
#include<time.h>
#include<conio.h>
#define Maxword 20
/**/ 
typedef struct node
{
    char name[20];//名字
    char address[40];//家庭地址 
    char phone[15];//电话号码 
    long zip;//邮编
    struct node *next;// 指向结构体的指针 
  }add_list;
struct person//备用结构体 
{
    char name[20];
    char address[40];
    char phone[15];
    long zip;
 };
 FILE *fp;//指向文件地址的指针 
 add_list *tail,*head;//定义链表的尾结点指针与头指针;
 /*从文件中读出数据生成通讯录链表,如果文件不存在,则生成空链表*/
 add_list *load(char filename[])
 {    
     add_list *new1,*head;//结构体指针 
     struct person t;//结构体变量 
    head=(add_list*)malloc(sizeof(add_list));//给头节点创建存储空间 
    tail=head=NULL;//初始化头节点尾节点 
    if((fp=fopen(filename,"rb"))==NULL) 
    //如果读取到的链表数据为空则返回头节点,此时头节点自身也为空; 
    {
        return head;
     }
     else
     {
         if(!feof(fp))//文件结束标识符
         {
             if(fread(&t,sizeof(struct person),1,fp)==1)//
             {
                 new1=(add_list*)malloc(sizeof(add_list));//创建链表第一个节点
                strcpy(new1->name,t.name);//strcpy(a,c);将c中的数据复制到strcpy中; 
                strcpy(new1->address,t.address);//将t中的地址赋值给new1 
                strcpy(new1->phone,t.phone);
                new1->zip=t.zip;
                head=tail=new1;
                new1->next=NULL;
                while(!feof(fp))//连入链表其他节点 
                {
                    //fread(void *buffer,int size,int count,FILE *fp);
                    /*fread()──从fp所指向文件的当前位置开始,
                一次读入size个字节,重
                复count次,并将读入的数据存放到从buffer开始的内存中;
                 buffer是存放读入数据的起始地址(即存放何处)
                */
                    if(fread(&t,sizeof(struct person),1,fp)==1)
                    {
                        new1=(add_list*)malloc(sizeof(add_list));
                        strcpy(new1->name,t.name);
                        strcpy(new1->address,t.address);
                        strcpy(new1->phone,t.phone);
                        new1->zip=t.zip;
                        
                        tail->next=new1;
                        new1->next=NULL;
                        tail=new1;
                     } 
                }
             }
         }
      }
      fclose(fp);//关闭文件指针 结束文件
      return head; 
  } 
 //从文件中读出数据生成通讯录链表,若不存在则空链表;
/*进度条打印*/ 
void jindutiao()
{
    int i;
    for(i=0;i<90;i++)
    {
        putchar('.');//一直打印该界面 
    }
    printf("\r\a");//响铃操作 
    for(i=0;i<90;i++)
    {
        if(i==0)
        {
            putchar('|');
        }
        Sleep(100);
        printf("\b|>");
    }
//    return;
}
/*插入一条通讯录记录*/
 void insert(add_list **head)
 {
     add_list *new1;
     new1=(add_list*)malloc(sizeof(add_list));
     system("cls");
     printf("请输入姓名:");
    getchar();
    gets(new1->name);
     /*gets函数用法: 
      从标准输入设备读字符串函数,
      可以无限读取,不会判断上限,以回车结束读取。
     所以如果输入的字符串超过100个,
     它也不会做检测,此时就会发生溢出。*/
     //scanf("%s")
    printf("\n 请输入地址:");scanf("%s",new1->address);
    printf("\n 请输入电话:");scanf("%s",new1->phone);
    printf("\n 请输入邮编:");scanf("%d",&new1->zip);
    if(*head==NULL)//如果此时表头为空 
    {
        *head=new1;//此时数据类型一致,将new1的地址赋值给head 
        new1->next=NULL;//new1->next指向;
        tail=new1;
    }/*使用的是尾插法*/
    else//插入到表尾 
    { 
    tail->next=new1;//将尾节点->next赋值给即将插入的节点new1;
    new1->next=NULL;
    tail=new1;
 }
     printf("输入完成,按回车键返回......");
    getchar();
    getchar(); 
 //    return;
 }
 /*将通讯录表中的内容保存到指定文件*/
void save(add_list *head,char filename[])
{
    add_list *p;//结构体指针 
    struct person t;//创建结构体变量
    if((fp=fopen(filename,"wb"))==NULL)//如果写入的数据为空
    {
        printf("错误,不能打开文件%s\n",filename);
        printf("已退出\n");
        exit(1); 
        }
    else
    {
        p=head;//将地址传给p;p就指向头节点;
        while(p!=NULL)
        {
            strcpy(t.name,p->name);//复制p给t函数 
            strcpy(t.address,p->address);
            strcpy(t.phone,p->phone);
            t.zip=p->zip;
            fwrite(&t,sizeof(struct person),1,fp);
            p=p->next;
         } 
     }
     fclose(fp);
     printf("保存成功,按返回键返回......");
     getchar();getchar();//? 
     //return;
}
/*显示通讯录内容*/
void display(add_list *head)
{
    add_list *p;
    p=head;
    if(p!=NULL)
    {
        printf("姓名:\t\t住址:\t\t邮编:\t\t电话:\n");
        //printf("对不起")
     }
     while(p!=NULL)
     {
         printf("%s\t\t%s\t\t%d\t\t\%s\n",p->name,p->address,p->zip,p->phone);
         p=p->next;
     }
     printf("请输入回车键返回......");
     getchar();
     getchar();
}
/*按姓名查询通讯录记录*/ 
int search(add_list *head)
{
    add_list *p; 
    char name[20];
    int flag=0;
    printf("请输入你要查询的同学姓名:\n");
    getchar();
    gets(name);//无限制接收数据
    p=head;
    while(p!=NULL)
    {
        if(strcmp(name,p->name)==0)
        {
            printf("姓名:\t\t住址:\t\t邮编\t\t电话\n");
            printf("%s\t\t%s\t\t%d\t\t%s\n",p->name,p->address,p->zip,p->phone);
            flag=1;
        }
        p=p->next;//不能else也并不是else 
     }
//     if(p==NULL)
//     {
//         printf("\n对不起,系统查无此人02\n");
//      } 
     return flag;
}
/*按姓名删除一条通讯录信息*/
int delete1(add_list **head)
{
    add_list *p,*q,*t;
    char name[20],c;
    int flag=0;
    printf("请输入要删除人的姓名:");
    scanf("%s",name);
    q=p=*head;
    while(p!=NULL)
    {
        if(strcmp(name,p->name)==0)
        {
            printf("姓名:\t\t住址:\t\t邮编:\t\t电话:\n");
            printf("%s\t\t%s\t\t%1d\t\t%s\n",p->name,p->address,p->zip,p->phone);
            printf("真的要删除吗?(Y:是;N:否)\n");
            getchar();
            c=getchar();
            if(c=='Y'||c=='y')
            {
                if(p==*head)
                {
                    printf("已经成功删除%s信息02\n",p->name);
                    system("pause");
                    *head=p->next;//
                }
                else
                {
                    printf("已经成功删除%s信息01\n",p->name);
                    system("pause");
                    q->next=p->next;
                }
                t=q;
                p=p->next;
                free(t);
                flag=1;
            }
            else
            {
                q=p;
                p=p->next;
                flag=1;
            }
        }
        else
        {
            q=p;
            p=p->next;
        }
    }
    return flag;
    printf("按回车键返回......");
    getchar();
}
void password()
{
    char pass_word[Maxword]="abc123456";//密码本
    char pass_input[20];
    int i;
    int j;
    char c;//输入密码变量 
    for(i=3;i>=1;i--)
    {
        j=0;
        printf("请输入你的登录密码,你还有%d次机会\n",i);
        while((c=getch())!='\r')//回车键结束运行
        {/*isprint判断输入的c是否是一个不可打印的字符*/
            if(j<Maxword&&isprint(c))
            {
                pass_input[j++]=c;
                //把在getch存入的密码存入pass_input数组当中;
                //存一个,打印一个,直到敲下回车键结束;
                putchar('*');
            }
            else if(j>0&&c=='\b')
            {
                //这里是指如果你乱的输密码
                //比如退格键它也会识别为密码的输入;
                j--;//如果输入的是退格键,则不存入数组;
                putchar('\b');//此时打印无;
                putchar(' ');
                putchar('\b');
                     }    
         }
         putchar('\n');//打印\n
         pass_input[j]='\0';//添加字符结束符;
         /*字符串比较函数相等就是0*/
         int spot;
         if(strcmp(pass_input,pass_word)==0)
         {
             system("cls");
             printf("\t\t欢迎使用学生信息管理系统");
             putchar('\a');
             //打印点点; 
             for(spot=0;spot<3;spot++);
             {
                 putchar('.');
                 Sleep(500);
             }
             for(spot=0;spot<3;spot++);
             {
                 putchar('.');
                 Sleep(500);
             }
             break;
             
          }
          else if(i>1)
          {
              printf("输入密码有误!请重新输入!\n");
              continue;
           }
           
         
    }
    if(i==0)
     {
        printf("您输入的次数已用完,已经退出\n");
        exit(0);
        }
    return;
}
/*显示菜单并选择菜单项*/
int menu_select()
{
    char c;
    system("cls");
    printf("\t\t\t******通讯录******\n");
    printf("\t\t\t1:输入新的通讯记录\n");
    printf("\t\t\t2:删除记录\n");
    printf("\t\t\t3:查找\n");
    printf("\t\t\t4:保存文件\n");
    printf("\t\t\t5:浏览所有通讯录记录\n");
    printf("\t\t\t6:退出\n");
    do{
        printf("请输入你的选择(1-6):");
        c=getchar();
    }while(c<'1'||c>'6');//如果满足条件则跳出循环; 
    return c;
}
int main(void)
{
    char filename[50];
    char c;
    int t;
    password();
    printf("通讯录启动中------\n");
    //jindutiao(); //缓冲界面
    system("cls");
    printf("请输入通讯录文件名称:\n");
    scanf("%s",filename);//输入文件名字;
    getchar();//将enter吸收掉 
    head=load(filename);//接收通讯录的文件名; 
    while(1)//表示大于0的时候; 
    {
        c=menu_select();//通过main函数输入菜单选项以及文件地址
        //scanf("%d",&c);
        //menu_select(filename,a);
        //c=menu_select();
        //menu_select(head);
        
    switch(c)
    {
        case '1':insert(&head);break;//输入信息 
        case '2':t=delete1(&head);//删除信息 
        if(!t)//如何与t挂钩的 
        {
            printf("对不起!系统没有此人信息\n按回车键返回!...");
            system("pause"); 
        }
        getchar();
        break;
        case '3':t=search(head);//查询信息 
        if(!t){
            printf("天啊!居然没有找到此人信息02\n按回车键返回......");
        }
        getchar();
        break;
        case '4':save(head,filename);break;//保存信息 
        case '5':display(head);break;//输出信息 
        case '6':printf("已安全退出");exit(0);//退出 
         }     
     } 
//    return 0;
 }

/*不用感谢我,叫我雷锋即可!*/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学生信息管理系统代码全篇 的相关文章

  • linux解压rar包的命令

    压缩文件 rar a r test rar file 解压文件 unrar x test rar
  • QT信号槽connect的第五个参数

    用过QT的小伙伴都知道连接信号槽的connect方法 但是这个方法有第五个参数 一般都是用的默认的 1 connect th SIGNAL started tmpmyobject SLOT showID 今天给大家讲讲第五个参数的用法 一

随机推荐

  • Python 爬虫运行时如何忽略错误,并继续运行

    我在第一次写Python爬虫的时候 没过多久Python就会报错 然后停止采集 总是没办法从头到尾把数据采集下来 每一下次报错我都要去找原因 随着一次又一次的报错问题越来越少 比如我要采集的标签里面没有URL URL为空就会报错 或者页面没
  • 03虚幻4【UE4】蓝图通信

    UE蓝图通信 目录 UE蓝图通信 情景一 方法一 直接拾取 简单粗暴 局限性一对一 方法二 获取类的actor 调用 自定义函数 变量 1 获取类的actor 调用 自定义函数 2 获取类的actor 调用 变量 方法三 蓝图接口 情景二
  • 预训练语言模型

    模型参数不再是随机初始化的 而是通过一些任务进行预先训练 得到一套模型参数 然后用这套参数对模型进行初始化 再进行训练 从模型的角度 模型参数不再是随机初始化 而是通过一些任务 如语言模型 进行预训练 从数据的角度 将训练任务拆解成共性学习
  • Go_Goroutine和channel的使用、定时器、runtime、select、条件变量

    程序 程序是指编译好的二进制文件 存放在磁盘上不占用系统资源 cpu 内存 当程序在计算机上运行时 它就变成了一个进程 包括程序 数据和状态信息 程序是静态的 而进程是动态的 进程 进程是程序的实例 是资源分配的最小单位 当一个程序开始运行
  • 【QT】 QT 自己定义全局变量,编译时报错:undefined reference to

    编译时的报错截图 但是变量在头文件内定义过 原因 静态变量需要在cpp文件中先进行赋值 解决方式 在cpp文件中给定义的全局变量赋予一个初始值
  • 计算机系统文件格式,iso是什么文件格式,怎么使用呢?

    经常安装系统的朋友应该很清楚iso是什么文件格式 iso是一种光盘的镜像文件 无法直接使用 需要利用工具才能解压使用 那么下面小编给您详细介绍下iso镜像文件以及使用用途 有需要的朋友可以看下 使用过光盘安装系统的朋友应该知道ISO文件是如
  • linux操作系统管理-主机重启不能能启动分析(nfs)

    问题概述 2个节点rac集群 节点1 采用nfs方式共享 backup 目录 节点2进行mount 2个节点分别重启 发现节点1能够起来 节点2不能启动 通过分析发现 节点1 nfs服务未启动 导致节点2不能启动 将节点1 的nfs服务启动
  • 华为OD机试 - 高效的任务规划(Java)

    题目描述 你有 n 台机器 编号为 1 n 每台都需要完成一项工作 机器经过配置后都能独立完成一项工作 假设第 i 台机器你需要花 Bi 分钟进行设置 然后开始运行 Ji 分钟后完成任务 现在 你需要选择布置工作的顺序 使得用最短的时间完成
  • table表头固定,内容滚动

    最近接到一个需求 要thead表头固定 tbody内容实现滚动 简单 给tbody加高度就行了 什么 竟然不行失败了 既然无法限制tbody本身的高度 那就给它套一个div 限制div的高度 让tbody在div里面滚就好了 但是 tabl
  • linux中wget命令失败解决方法

    问题描述 执行下面的代码 wget https shapenet cs stanford edu media indoor3d sem seg hdf5 data zip 出现下面的错误提示 正在解析主机 shapenet cs stanf
  • 正版rust进去闪退_Tomcat运行startup.bat时,闪退,或者说直接退出——之解决方法...

    最近刚开始学Java EE 在部署Web应用的时候 需要Tomcat服务器 我们知道Tomca是一个容器 用来部署应用的 在使用的时候 需要在安装目录 bin里找到startup bat文件和shutdown bat文件 用于启动和关闭To
  • C语言二分查找法

    二分查找法 从一个有序数组中找到一个数 不管是升序还是降序 思路 先从中间找 之后依次截半查找 比如从1 2 3 4 5中找到4 先找中间数3 发现4小那么取3与5最中间的数4 找到了 如果是1 2 3 4找3 先找下标为 0 3 2 就是
  • AD20/Altium designer——如何对线宽进行设置、布线过程中快速改线宽的方法

    1 设计 规则 2 线宽设置 首选宽度即 布线时的 默认线宽 3 布线过程中改线宽 连线过程中按 Tab键 打开布线属性 直接 输入线宽 后 回车键 即可
  • 计算机学习路线及java图书参考

    学习路线图LIVE地址 1 科普 浪潮之巅 2 编程语言 C结构化的编程语言 java面向对象的语言 JavaScript Python动态编程语言 Headfirst Python 3 数学 高等数学 离散数学 线性代数 线性代数及其应用
  • GMAC & PHY介绍

    1 1PHY接口发展 1 MII支持10M 100Mbps 一个接口由14根线组成 它的支持还是比较灵活的 但是有一个缺点是因为它一个端口用的信号线太多 参考芯片 DP83848 DM900A 该芯片内部集成了MAC和PHY接口 DP838
  • 软件测试基础----缺陷

    软件测试基础 缺陷 缺陷的定义 产生缺陷的原因 缺陷的类型 缺陷的严重程度 缺陷的修复优先级 缺陷的状态 缺陷的来源 缺陷的根源 缺陷的识别 缺陷的报告 缺陷编写准则 缺陷描述规则 缺陷的严重程度和优先级与什么关系 缺陷的定义 软件未实现产
  • 解决WIN10无法安装“无法验证此驱动发布者”的USB驱动的办法

    安装小米助手和MiPhone刷机工具时 使用Windows 10的朋友可能遇到小米驱动安装不上或者遇到驱动程序签名问题 下载官方的驱动包有可能无法解决 我之前遇到过 今天又遇到了 现在写下这个问题 供以后遇到的朋友查看 下面 我们开始 1
  • ASCLL编码详解,ASCLL编码对照表

    作者主页 士别三日wyx 作者简介 CSDN top100 阿里云博客专家 华为云享专家 网络安全领域优质创作者 ASCLL编码是一套基于拉丁字母的字符编码 共收录了128个字符 0 31及127 共33个 是控制字符 不在文本中显示 比如
  • 使用Sunny-Ngrok进行内网穿透

    文章目录 1 进入 Ngrok官网 http www ngrok cc 先注册账号并登录 2 下载 Sunny Ngrok 客户端 有不同的系统版本 3 编写SpringBoot项目进行测试 4 外网访问本地服务 为什么使用Sunny Ng
  • 学生信息管理系统代码全篇

    学生信息管理系统 include