课程设计-简易学生信息管理系统

/***********************************
*版权所有(C)2014,sunyukun。
*
*文件名称:SuffixTest.c
*文件标识:无
*内容摘要:该代码用于获取满足后缀要求的第一个文件
*其他说明:无
*当前版本:V1.0
*作者:孙钰坤
*完成日期:20141225
***********************************/
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
struct tdent
{ 
  int id;  // 学号
  char name[30]; // 姓名
  char sex[4];  // 性别 
  float gread; // 成绩
};
typedef struct tdent DataType; 
//  指定struct tdent为DataType
struct SeqList
{
 int MAX;     
 // 顺序表中最大元素的个数
 int count;         
 // 存放线性表中元素的个数count <= MAXLENGTH
 DataType* element;  
 // element[0], element[1], ..., element[n - 1]存放线性表中的元素
};
typedef struct SeqList *MySeqList; 
// 初始化并创建空顺序表
MySeqList initSeqList(int m);
// 判断线性表是否为空
int isEmptySeqList(MySeqList mySeqList);
// 在顺序表中求某元素的下标
int locateSeqList(MySeqList mySeqList, int id);
// 在顺序表中修改值
int updateSeqList(MySeqList mySeqList, int id);
// 顺序表的插入(元素p之前插入)
int insertPreSeqList(MySeqList mySeqList, int p, DataType x);
// 顺序表的插入(元素p之后插入)
int insertNextSeqList(MySeqList mySeqList, int p, DataType x);
// 顺序表的删除(根据下标删除)
int deleteSeqList(MySeqList mySeqList, int p);
// 顺序表的删除(根据元素值删除)
int deleteSeqListByValue(MySeqList mySeqList, int id);
// 将顺序表表示的线性表逆置
int reverseSeqList(MySeqList mySeqList);

int deleteAllVSeqList(MySeqList mySeqList, DataType x);
// 求出下标为i的元素的前驱和后继
int findPrePostSeqList(MySeqList mySeqList, int i, DataType &m, DataType &n);
// 顺序表实现部分:找出值为x的元素的前驱和后继的存储位置(即下标)
int locatePrePostSeqList(MySeqList mySeqList, DataType x, int &i, int &j);
// 输出线性表的元素值
void printSeqList(MySeqList &mySeqList);
// 根据学生id,输出线性表的元素值
void printSeqListById(MySeqList &mySeqList,int id);
// 在顺序表中修改值

int updateSeqList(MySeqList mySeqList, int id)  
 //学生信息登入
{
 int i = locateSeqList(mySeqList, id);
 if (i == -1)
 {
  printf("不存在指定下标!\n");
  return (0);
 }
 
 cout<<"学号   姓名   性别    成绩 "<<endl;
 cin>>mySeqList->element[i].id>>mySeqList->element[i].name>>mySeqList->element[i].sex>>mySeqList->element[i].gread;
  return 1;
}
 
// 功能: 创建空顺序表
MySeqList initSeqList(int m)
{
 MySeqList mySeqList = (MySeqList)malloc(sizeof(struct SeqList)); 
 // 分配内存空间
 if (mySeqList != NULL)
 {
  mySeqList->element = (DataType*)malloc(sizeof(DataType) * m);   
  // 为里面的元素分配m个DataType大小的内存空间,相当于初始化了一个长度为m的数组
  if (mySeqList->element)
  {
   mySeqList->MAX = m;  
   // 如果创建了元素,MAXLENGTH为最大元素的个数
   mySeqList->count = 0;  
   // 空表长度为0
   return (mySeqList);
  }
  else
   free(mySeqList);        
 // 记得要手动释放空间,否则很容易产生内存泄漏
 }
 printf("内存空间不足,请关闭一些程序,然后再试!\n");
 // 存储分配失败,提示空间不足
 return NULL;
}
// 功能: 判断线性表是否为空
int isEmptySeqList(MySeqList mySeqList)
{
 return (mySeqList->count ==0);
}
// 功能:在顺序表中求某元素的下标,没有查找到,则返回-1
int locateSeqList(MySeqList mySeqList, int id)
{
 for (int i = 0; i < mySeqList->count; ++i)
  if (mySeqList->element[i].id == id)             
// 传入一个元素x,查找到后返回下标i
   return (i);
 return (-1);
}
// 功能:顺序表的pos下标前面插入,插入成功返回1,失败返回0
int insertPreSeqList(MySeqList mySeqList, int pos, DataType x)
{
 ++mySeqList->count;
 if (mySeqList->count > mySeqList->MAX)      // 溢出
 {
  --mySeqList->count;    
  printf("表产生了溢出!\n");
  return (0);
 }
 if (pos < 0 || pos >= mySeqList->count)         
// 不存在下标为pos的元素
 {
  --mySeqList->count;
  printf("不存在指定下标!\n");
  return (0);
 }
 for (int i = mySeqList->count - 1; i != pos; --i)
  {mySeqList->element[i] = mySeqList->element[i - 1];
 // 插入位置及之后的元素均后移一个位置
 mySeqList->element[i] = x;                         
 // 插入元素x
 return (1);
 }
}
// 功能:顺序表的pos下标后面插入,插入成功返回1,失败返回0
int insertNextSeqList(MySeqList mySeqList, int pos, DataType x)
{
 if (pos < 0 || pos >= mySeqList->count)
 {
  printf("不存在指定下标!\n");
  return (0);
 }
 ++mySeqList->count;
 if (mySeqList->count >= mySeqList->MAX)
 {
  --mySeqList->count;
  printf("表产生了溢出!\n");
  return (0);
 }
 
 for (int i = mySeqList->count - 1; i != pos + 1; --i)
  {mySeqList->element[i] = mySeqList->element[i - 1]; 
 // 同样地,把pos+1插入位置及之后的元素均后移一个位置
 mySeqList->element[i] = x;                       
 // 插入元素x
 return (1);
 }
}
// 功能:顺序表的删除(根据下标删除)
int deleteSeqList(MySeqList  mySeqList, int pos)
{
 if (pos < 0 || pos >= mySeqList->count)      // 不存在下标为pos的元素,注意下标范围是从0到count-1
 {
  printf("不存在指定下标!\n");
  return (0);
 }
 
 for (int i = pos; i < mySeqList->count - 1; ++i)
  mySeqList->element[i] = mySeqList->element[i + 1];   // 被删除元素之后的元素均前移一个位置
 --mySeqList->count;                                  // 元素个数减1
 return (1);
}
// 功能:根据元素值删除,实现顺序表的删除
int deleteSeqListByValue(MySeqList mySeqList, int id)
{
 int pos = locateSeqList(mySeqList, id);
 if (pos == -1)
 {
  printf("不存在指定下标!\n");
  return (0);
 }
 deleteSeqList(mySeqList, pos);
 return (1);
}
 

int deleteAllSeqListByValue(MySeqList mySeqList, int x)
{
 if (mySeqList->count == 0)
 {
  printf("该表为空!\n");
  return (0);
 }
 for (int i = 0; i != mySeqList->count; ++i)
 {
 
  if (mySeqList->element[i].id == x )
  {  
      deleteSeqListByValue(mySeqList,x);             // 删除x,删除后要将下标减少1
      i--;
  }
 }
 return (1);
}


int deleteAllVSeqList(MySeqList mySeqList, int x)
{
 if (mySeqList->count == 0)
 {
  printf("该表为空!\n");
  return (0);
 }
 int p = 0, q = 0;
 while (mySeqList->element[p].id != x && p != mySeqList->count - 1)  // 跳过开始不是x的元素
 {
  ++p;
  ++q;
 }
 for (; p != mySeqList->count - 1; ++p)                            
// 遍历元素,不遍历最后一个元素(为了防止越界)
 {
  while (mySeqList->element[p].id == x && p != mySeqList->count - 1) 
// 如果元素是x,则游标p后移(用while处理多个x连续的情况)
  {
   ++p;
  }
  if (p != mySeqList->count - 1)
  {
   mySeqList->element[q] = mySeqList->element[p];
   ++q;
  }
 }
 if (mySeqList->element[mySeqList->count - 1].id != x)
 {
  mySeqList->element[q] = mySeqList->element[mySeqList->count - 1];
  ++q;
 }
 mySeqList->count = q;
 return (1);
}
 
// 功能:找出值为x的元素的前驱和后继的存储位置(即下标)
int locatePrePostSeqList(MySeqList mySeqList, int x, int &i, int &j)
{
 int k = locateSeqList(mySeqList, x);
 if (k == -1)
  return (0);
 if (k == 0)
  i = -1;
 else
  i = k - 1;
 if (k == mySeqList->count - 1)
  j = -1;
 else
  j = k + 1;
 return (1);
}
// 输出线性表的元素值
void printSeqList(MySeqList &mySeqList)
{
 
 for (int i = 0; i < mySeqList->count; ++i)  
// 输出线性表的元素值
 {
   cout<< "学号:" << mySeqList->element[i].id << ",姓名:" << mySeqList->element[i].name << ",性别:" << mySeqList->element[i].sex ;
   cout<< "成绩:" << mySeqList->element[i].gread;
   cout<<endl;
 }
 cout << endl;
}
// 根据学生id,输出线性表的元素值
void printSeqListById(MySeqList &mySeqList,int id)
{
 
 for (int i = 0; i < mySeqList->count; ++i)  // 输出线性表的元素值
 {
   if (id == mySeqList->element[i].id)
   {
     cout<< "学号:" << mySeqList->element[i].id << ",姓名:" << mySeqList->element[i].name << ",性别:" << mySeqList->element[i].sex ;
     cout<< "成绩:" << mySeqList->element[i].gread;
     cout<<endl;
     break;
   }
 }
 
}
int main(int argc, char* argv[])
{

MySeqList mySeqList = initSeqList(20); // 初始化一个长20的表
L:
   system("cls");
   cout<< "                 ""学生成绩管理系统""                "<<endl;
   cout<<endl;
   cout<<"**********************"<<endl;
   cout<<"***1.添加学生的信息***"<<endl;
   cout<<"***2.查找学生的信息***"<<endl;
   cout<<"***3.删除学生的信息***"<<endl;
   cout<<"***4.修改学生的信息***"<<endl;
   cout<<"***5.退出本学生系统***"<<endl;
   cout<<"**********************"<<endl;
   int i; 
   cout<<"                    "<<endl;
   cout<<"请选择一个操作(1-5):";
   cin>>i;
   if (i == 1)
   {   
     mySeqList->count = 1;
  int i = 0;
  while(true&&mySeqList->count<20)
  {   
       cout<<endl<<"请添加学生信息(输入*退出添加):"<<endl; 
    cout<<"姓名:";   
   
    cin>>mySeqList->element[i].name;
          if (strcmp(mySeqList->element[i].name,"*") == 0)
    { 
     mySeqList->count--;  
     goto L;
    }
    cout<<"学号: ";
    cin>>mySeqList->element[i].id;
    cout<<"性别: ";
    cin>>mySeqList->element[i].sex;
       cout<<"成绩: ";
    cin>>mySeqList->element[i].gread;  
         
    cout << "成功添加学生成绩信息。"<<endl;
          printSeqList(mySeqList);
          mySeqList->count++;
          i++;
  }
        
   }
   else if (i == 2)
   {
L4:
       cout<<"请输入要查找的学生学号:"<<endl;
    int  s;
    cin>>s;
    if (locateSeqList(mySeqList,s) != -1)
    {
     cout<<"成功查询学号为"<<s<<"的学生成绩。"<<endl;
           printSeqListById(mySeqList,s);
    }
    else
    {
     cout<<"查询学生成绩错误,可能不存在学号为"<<s<<"的学生."<<endl;
    }
    int p;
    cout<<endl<<"还要继续查询吗?(按0返回主菜单,否则继续此操作。)"<<endl;
    cin>>p;
    if (p == 0)
     goto L ;
    else
        goto L4;
  
   }
   else if (i == 3)
   {
L1:
       cout<<"请输入要删除的学生学号:"<<endl;
    int t_id;
    cin>>t_id;
   
       if (deleteSeqListByValue(mySeqList,t_id) == 1)
         cout<<"成功删除学生成绩。"<<endl;
    else
   cout<<"删除学生成绩出错。"<<endl;
    printSeqList(mySeqList);
    int iop;
    cout<<endl<<"是否继续删除?(按0返回主菜单,否则继续此操作。)"<<endl;
    cin>>iop;
    if (iop == 0)
     goto L ;
    else
        goto L1;
   }
   else if (i == 4)
   {
L3:
    cout<<"请输入要修改的学生学号:"<<endl;
       int id;
    cin>>id;
    if(updateSeqList(mySeqList,id) ==1)
         cout << "成功修改学生成绩信息。"<<endl;
    else
         cout << "修改学生成绩信息出错。"<<endl;
       printSeqList(mySeqList);
    int l;
    cout<<endl<<"是否需要继续修改?(按0返回主菜单,否则继续此操作。)"<<endl;
    cin>>l;
    if (l == 0)
     goto L ;
    else
        goto L3;
   }
   else if (i == 5)
   {  
    system("cls");
    cout<<"您已登出本系统,欢迎下次使用."<<endl;
   }
   
 return 0;
}

运行结果:

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值