c语言综合练习一

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
#include <iostream>  // cin 及 cout
#include <string.h>    // strcpy(): 字符串复制
#include <stdlib.h>    // system("cls")
#include <stdio.h>    // 文件操作(写文件)
//#include "Data.h"      // 我们要创建类 List 的对象和节点指针,所以要把类的头文件包含进来

//#include <iostream>     // cin 及 cout
#include <malloc.h>       // 用到申请内存函数 malloc() 和释放内存函数 free()
//#include <string.h>    // 字符串处理
//#include <stdio.h>    // 文件操作(读文件)
//#include <stdlib.h>    // system("cls")
using namespace std;
struct address       /*家庭地址*/
{
  char city[10];     /*城市*/
  char town[10];        /*县城*/
  char village[10];    /*乡镇*/
};

struct telephone       /*联系方式*/
{
  char SJ[50];      /*手机*/
  char JD[30];      /*家庭电话*/
  char XD[30];      /*学校电话*/
};

struct person     /*个人信息*/

  char name[20];          /*名字*/
  char sex[10] ;          /*性别*/
  char MZ[16];   /*民族*/
  char GJ[17];   /*国籍*/ 
  char XL[19];   /*学历*/
}; 

struct score      //成绩
{
  char num[20];    //学号
  char english[20];
  char chinese[20];
  char math[20];
  char physics[20];
};

typedef struct linknode   //定义节点的类型
{
  char address[100];  //地址
  char birthday[100];  //出生日期
  struct score sc;  //成绩
  struct person pe;  //个人信息
  struct telephone te; //联系方式
  bool flag;
  struct linknode* next;
}nodetype;

class Data
{
 nodetype* head;

public:
 Data();
 Data::~Data();

 linknode* creatlist(int);    //创建链表
 int listlen();       //返回链表长度
 nodetype* findnode(int);    //通过查找序号返回节点的指针
 nodetype* find(char c[]);    //通过查找姓名返回节点的指针
 int find2(char c[]);     //通过查找姓名返回节点的序号
 nodetype* insnode(int);     //插入节点
 void delnode(int);      //删除节点

 nodetype* load();      //初始化:从外部读入数据

 void readstr(FILE *f,char *string);  //读行函数
 bool check(char *a, char *b);   //对比两个字符串是否相等
 void help();       //显示帮助菜单

 void editperson(nodetype*);    //编辑个人说明
 void editscore(nodetype*);    //编辑学科成绩
 void edittelephone(nodetype*);   //编辑联系方式

 void dispname();      //显示所有学生姓名
 void dispnode(nodetype* p);    //显示一个学生的所有信息
 void dispperson(nodetype*);    //显示一个学生的个人说明
 void dispscore(nodetype*);    //显示一个学生的学科成绩
 void disptelephone(nodetype*);   //显示一个学生的联系方式

};
Data::Data()
{
 head = NULL;
}

bool Data::check(char *a, char *b)  //对比两个字符串是否相等
{
 int i;
 int j=strlen(b);
 for(i=0; i<j; i++)
 {
  if(*a==*b)
  {
   a++;
   b++;
  }
  else
   return 0;
 }
 return 1;
}


nodetype* Data::creatlist (int n)       //创建链表
{
 nodetype *h=NULL, *s, *t;
 int i=1;

 for(int j=0; j<n; j++)
 {
  if(i==1)            //创建第一个节点
  {
   h=(nodetype*)malloc(sizeof(nodetype));
   h->next=NULL;
   t=h;
  }
  else                 //创建其余节点
  {
   s=(nodetype*)malloc(sizeof(nodetype));
   s->next=NULL;
   t->next=s;
   t=s;            //t 始终指向生成的单链表的最后一个节点
  }

  i++;
 }

 head=h;
 return h;
}

/*
nodetype* List::creatlist (int n)       //创建链表
{
 nodetype *h=NULL;
 int i=1;

 for(int j=0; j<n; j++)
 {
  h=insnode(0);
 }
 head=h;
 return h;
}
*/

void Data::readstr(FILE *f,char *string)

 do
 {
         //①: 先读入一行文本
  fgets(string, 255, f);  //fgets(): 从文件 f 读入长度为 255-1 的字符串
         //    并存入到 string 中
 } while ((string[0] == '/') || (string[0] == '\n'));

 return;
}

nodetype* Data::load()
{
 FILE *fp;
 nodetype *p;
 char c[255];
 int num;
 if((fp=fopen("student.txt", "r"))==NULL)
 {
  cout<<"打开文件失败"<<endl;
  return 0;
 }
 readstr(fp, c);
 sscanf(c, "The Length Of Link: %d", &num);  //获取链表长度

 p=creatlist(num);        //创建链表

 for(int i=0; i<num; i++)
 {
  readstr(fp, c);
  strcpy(p->address, c);
  readstr(fp, c);
  strcpy(p->birthday, c);

  readstr(fp, c);
  strcpy(p->sc.num, c);
  readstr(fp, c);
  strcpy(p->sc.chinese, c);
  readstr(fp, c);
  strcpy(p->sc.english, c);
  readstr(fp, c);
  strcpy(p->sc.math, c);
  readstr(fp, c);
  strcpy(p->sc.physics, c);

  readstr(fp, c);
  strcpy(p->pe.name, c);
  readstr(fp, c);
  strcpy(p->pe.sex, c);
  readstr(fp, c);
  strcpy(p->pe.GJ, c);
  readstr(fp, c);
  strcpy(p->pe.MZ, c);
  readstr(fp, c);
  strcpy(p->pe.XL, c);

  readstr(fp, c);
  strcpy(p->te.SJ, c);
  readstr(fp, c);
  strcpy(p->te.JD, c);
  readstr(fp, c);
  strcpy(p->te.XD, c);

  p=p->next;
 }

 fclose(fp);

 return p;
}

void Data::dispnode(nodetype* p)  //显示一个学生的所有信息
{
 if(p!=NULL)
 {
  dispperson(p);
  dispscore(p);
  disptelephone(p);
 }
}

void Data::dispname()  //显示所有学生姓名
{
 nodetype* p=head;
 cout<<"现有的学生:  "<<endl;
 if(p==NULL)
  cout<<"没有任何学生数据"<<endl;
 while(p!=NULL)
 {
  cout<<"姓名: "<<p->pe.name;

  p=p->next;
 }
}

int Data::listlen()       //返回链表长度
{
 int i=0;
 nodetype* p=head;
 while(p!=NULL)
 {
  p=p->next;
  i++;
 }
 return i;
}

nodetype* Data::findnode (int i)      //通过查找序号返回节点的指针
{
 nodetype* p=head;
 int j=1;
 if( i>listlen()||i<=0 )          // i 上溢或下溢
  return NULL;
 else
 {
  while( p!=NULL &&  j<i )    //查找第 i 个节点并由 p 指向该节点
  {
   j++;
   p=p->next;
  }
  return p;
 }
}

nodetype* Data::find(char c[])      //通过查找姓名返回节点的指针
{
 nodetype* p=head;
 int j=1;
 strcat(c, "\n");    //从外部读入的字符串末尾都带了一个换行符
 while( p!=NULL &&  !(check(c, p->pe.name)))    //查找第 i 个节点并由 p 指向该节点 
 { 
  j++; 
  p=p->next;
 }
 return p;
}

int Data::find2(char c[])      //通过查找姓名返回节点的序号
{
 nodetype* p=head;
 int j=1;
 strcat(c, "\n");    //从外部读入的字符串末尾都带了一个换行符
 while( p!=NULL &&  !(check(c, p->pe.name)))    //查找第 i 个节点并由 p 指向该节点 
 { 
  j++;
  p=p->next;
 }
 return j;
}

nodetype* Data::insnode(int i)
{
 nodetype *h=head, *p, *s;
 s=(nodetype*)malloc(sizeof(nodetype));    //创建节点 s
 s->next=NULL;
 if(i==0)           //i=0 时 s 作为该单链表的第一个节点
 {
  s->next = h;
  h=s;           //重新定义头节点
 }
 else
 {
  p=findnode(i);       //查找第 i 个节点,并由 p 指向该节点
  if(p!=NULL)
  {
   s->next=p->next;
   p->next=s;
  }
  else cout<<"输入的 i 值不正确"<<endl;
 }
 head=h;

 return s;
}

void Data::delnode(int i)   //删除第 i 个节点
{
 nodetype *h=head, *p=head, *s;
 int j=1;
 if(i==1)       //删除第一个节点
 {
  h=h->next;
  free(p);
 }
 else
 {
  p=findnode(i-1);     //查找第 i-1 个节点,并由 p 指向这个节点
  if(p!=NULL && p->next!=NULL)
  {
   s=p->next;      // s 指向要删除的节点
   p->next=s->next;
   free(s);
  }
  else
   cout<<"输入的 i 值不正确"<<endl;
 }
 head=h;
}

void Data::editperson(nodetype* p)
{
 char c[100];
 cout<<"请输入姓名: "<<endl;
 cin>>c;
 strcat(c, "\n");
 strcpy(p->pe.name, c);

 cout<<"请输入性别:"<<endl;
 cin>>c;
 strcat(c, "\n");
 strcpy(p->pe.sex, c);

 cout<<"请输入生日(格式举例:1982-1-1): "<<endl;
 cin>>c;
 strcat(c, "\n");
 strcpy(p->birthday, c);

 cout<<"请输入民族:"<<endl;
 cin>>c;
 strcat(c, "\n");
 strcpy(p->pe.MZ, c);

 cout<<"请输入国籍:"<<endl;
 cin>>c;
 strcat(c, "\n");
 strcpy(p->pe.GJ, c);

 cout<<"请输入学历:"<<endl;
 cin>>c;
 strcat(c, "\n");
 strcpy(p->pe.XL, c);

 cout<<"请输入家庭住址(例如:广西玉林市解放路11号"<<endl;
 cin>>c;
 strcat(c, "\n");
 strcpy(p->address, c);

 cout<<"编辑个人信息完成!"<<endl;

 dispperson(p);
}

void Data::editscore(nodetype* p)
{
 char a[50];
 cout<<"请输入学号: "<<endl;
 cin>>a;
 strcat(a, "\n");
 strcpy(p->sc.num, a);

 cout<<"请输入大学语文成绩: "<<endl;
 cin>>a;
 strcat(a, "\n");
 strcpy(p->sc.chinese, a);

 cout<<"请输入英语成绩: "<<endl;
 cin>>a;
 strcat(a, "\n");
 strcpy(p->sc.english, a);

 cout<<"请输入数学成绩: "<<endl;
 cin>>a;
 strcat(a, "\n");
 strcpy(p->sc.math, a);

 cout<<"请输入物理成绩: "<<endl;
 cin>>a;
 strcat(a, "\n");
 strcpy(p->sc.physics, a);

 cout<<"编辑学科成绩完成!"<<endl;

 dispscore(p);
}

void Data::edittelephone(nodetype* p)
{
 char c[50];
 cout<<"请输入手机号码: "<<endl;
 cin>>c;
 strcat(c, "\n");
 strcpy(p->te.SJ, c);

 cout<<"请输入家庭电话号码: "<<endl;
 cin>>c;
 strcat(c, "\n");
 strcpy(p->te.JD, c);

 cout<<"请输入学校电话号码: "<<endl;
 cin>>c;
 strcat(c, "\n");
 strcpy(p->te.XD, c);

 cout<<"编辑联系方式完成!"<<endl;

 disptelephone(p);
}

void Data::dispperson(nodetype* p)
{
 cout<<"姓名:  "<<p->pe.name;
 cout<<"性别:  "<<p->pe.sex;
 cout<<"民族:  "<<p->pe.MZ;
 cout<<"国籍:  "<<p->pe.GJ;
 cout<<"学历:  "<<p->pe.XL;
 cout<<"出生日期: "<<p->birthday;
 cout<<"家庭住址: "<<p->address;
}

void Data::dispscore(nodetype* p)
{
 cout<<"学号:  "<<p->sc.num;
 cout<<"大学语文成绩: "<<p->sc.chinese;
 cout<<"英语成绩: "<<p->sc.english;
 cout<<"数学成绩: "<<p->sc.math;
 cout<<"物理成绩: "<<p->sc.physics;
}

void Data::disptelephone(nodetype* p)
{
 cout<<"手机号码是: "<<p->te.SJ;
 cout<<"家庭电话是: "<<p->te.JD;
 cout<<"学校电话是: "<<p->te.XD;
}

void Data::help()
{
 cout<<endl<<endl;
 cout<<"*********************************************************"<<endl;
 cout<<"1:   编辑个人信息"<<endl;
 cout<<"2:   编辑学科成绩"<<endl;
 cout<<"3:   编辑联系方式"<<endl;
 cout<<"4:   显示个人信息"<<endl;
 cout<<"5:   显示学科成绩"<<endl;
 cout<<"6:   显示联系方式"<<endl;
 cout<<"7:   显示该学生所有信息"<<endl;
 cout<<"8:   帮助菜单"<<endl;
 cout<<"9:   返回上一级菜单"<<endl;
 cout<<"*********************************************************"<<endl;
}

Data::~Data()
{
 nodetype *pa=head, *pb;
 if(pa!=NULL)
 {
  pb=pa->next;
  if(pb==NULL)
   free(pa);
  else
  {
   while(pb!=NULL)
   {
    free(pa);
    pa=pb;
    pb=pb->next;
   }
   free(pa);
  }
 }
}
class Operater
{
 Data L1;
public:    
 void Loop();       //主循环   
 void display();       //显示菜单 
};

void Operater::display()
{
 cout<<endl<<endl;
 cout<<"**************************** 学生管理系统 **************************"<<endl;
 cout<<"1:   添加一个学生信息"<<endl;
 cout<<"2:   删除一个学生信息"<<endl;
 cout<<"3:   显示所有学生的姓名"<<endl;
 cout<<"4:   根据姓名显示单个学生所有信息"<<endl;
 cout<<"5:   根据姓名对单个学生进行编辑"<<endl;
 cout<<"6:   帮助菜单"<<endl;
 cout<<"7:   保存数据"<<endl;
 cout<<"0:   退出系统"<<endl;
 cout<<"********************************************************************"<<endl;
}

void Operater::Loop()
{
 Data L1;        //List 对象
 char ch[20];
 nodetype *p, *head;  
 int i;      //存放节点序号

 p=L1.load(); //初始化:从外部读入数据创建链表

 head=p;
 display();

 while(1)
 {
  cout<<endl<<endl;
  cout<<"请输入选择(帮助选项--> 6 ): "<<endl;
  cin>>ch;

  system("cls");
  if(L1.check(ch, "1"))
  {
   p=L1.insnode(0);
   head=p;

   system("cls");
   cout<<endl;
   cout<<"************** 添加一个学生信息 ******************"<<endl;
   cout<<"下面输入个人信息: "<<endl;
   L1.editperson(p);
   cout<<"下面输入学科成绩: "<<endl;
   L1.editscore(p);
   cout<<"下面输入联系方式: "<<endl;
   L1.edittelephone(p);
  }

  if(L1.check(ch, "2"))
  {
   system("cls");
   cout<<endl;
   cout<<"************** 删除一个学生信息 ******************"<<endl;
   L1.dispname();
   cout<<"请输入学生姓名: "<<endl;
   cin>>ch;
   i=L1.find2(ch);
   L1.delnode(i);
  }

  if(L1.check(ch, "3"))
  {
   system("cls");
   cout<<endl;
   cout<<"************** 显示所有学生姓名 ******************"<<endl;
   L1.dispname();
  }

  if(L1.check(ch, "4"))
  {
   system("cls");
   cout<<endl;
   cout<<"************** 根据姓名显示单个学生所有信息 ******************"<<endl;
   L1.dispname();
   cout<<"请输入学生姓名: "<<endl;
   cin>>ch;
   p=L1.find(ch);
   L1.dispnode(p);
  }

  if(L1.check(ch, "6"))
  {
   display();
  }

  if(L1.check(ch, "7"))  //保存数据
  {
   FILE *fp;
   if((fp=fopen("student.txt", "w"))==NULL)
   {
    cout<<"打开文件失败"<<endl;
    return;
   }

   int i;
   char t[255];

   //将 L1.listlen() 赋予字符串中的数字
   sprintf(t, "The Length Of Link: %d\n", L1.listlen()); 

   fputs(t, fp);
   strcpy(t, "\n");
   fputs(t, fp);

   p=L1.findnode(1);    //将链表头指针赋予 p

   for(i=0; i<L1.listlen(); i++)
   {
    fputs(p->address, fp);  //输出地址
    fputs(p->birthday, fp);  //输出生日

    fputs(p->sc.num, fp);  //输出学号
    fputs(p->sc.chinese, fp); //输出语文成绩
    fputs(p->sc.english, fp); //输出英语成绩
    fputs(p->sc.math, fp);  //输出数学成绩
    fputs(p->sc.physics, fp); //输出物理成绩

    fputs(p->pe.name, fp);  //输出姓名
    fputs(p->pe.sex, fp);  //输出性别
    fputs(p->pe.GJ, fp);  //输出国籍
    fputs(p->pe.MZ, fp);  //输出民族
    fputs(p->pe.XL, fp);  //输出学历

    fputs(p->te.SJ, fp);  //输出手机
    fputs(p->te.JD, fp);  //输出家庭电话
    fputs(p->te.XD, fp);  //输出学校电话
    fputs(t, fp);

    p=p->next;
   }
   p=head;
   fclose(fp);
  }

  if(L1.check(ch, "5"))
  {
   char c[20];
   system("cls");
   cout<<endl;
   cout<<"************** 根据姓名对单个学生进行编辑 ******************"<<endl;
   L1.dispname();
   cout<<"请输入学生姓名: "<<endl;
   cin>>c;
   p=L1.find(c);

   system("cls");
   cout<<endl<<endl;
   cout<<"*********************************************************"<<endl;
   cout<<"1:   编辑个人信息"<<endl;
   cout<<"2:   编辑学科成绩"<<endl;
   cout<<"3:   编辑联系方式"<<endl;
   cout<<"4:   显示个人信息"<<endl;
   cout<<"5:   显示学科成绩"<<endl;
   cout<<"6:   显示联系方式"<<endl;
   cout<<"7:   显示该学生所有信息"<<endl;
   cout<<"8:   帮助菜单"<<endl;
   cout<<"9:   返回上一级菜单"<<endl;
   cout<<"*********************************************************"<<endl;

   while(1)
   {
    cout<<endl<<endl;
    cout<<"请输入选择(帮助选项--> 8 ): "<<endl;
    cin>>c;
    system("cls");

    if(L1.check(c, "1"))
    {
     system("cls");
     cout<<endl;
     cout<<"************** 编辑个人信息 ******************"<<endl;
     L1.editperson(p);
    }

    else if(L1.check(c, "2"))
    {
     system("cls");
     cout<<endl;
     cout<<"************** 编辑学科成绩 ******************"<<endl;
     L1.editscore(p);
    }

    else if(L1.check(c, "3"))
    {
     system("cls");
     cout<<endl;
     cout<<"************** 编辑联系方式 ******************"<<endl;
     L1.edittelephone(p);
    }

    else if(L1.check(c, "4"))
    {
     system("cls");
     cout<<endl;
     cout<<"************** 显示个人信息 ******************"<<endl;
     L1.dispperson(p);
    }

    else if(L1.check(c, "5"))
    {
     system("cls");
     cout<<endl;
     cout<<"************** 显示学科成绩 ******************"<<endl;
     L1.dispscore(p);
    }

    else if(L1.check(c, "6"))
    {
     system("cls");
     cout<<endl;
     cout<<"************** 显示联系方式 ******************"<<endl;
     L1.disptelephone(p);
    }

    else if(L1.check(c, "7"))
    {
     system("cls");
     L1.dispnode(p);
    }

    else if(L1.check(c, "8"))
    {
     system("cls");
     L1.help();
    }

    else if(L1.check(c, "9"))
    {
     display();
     break; //用 break 跳出本循环,不要用 return ,return 是退出程序
    }
   }
  }

  else if(L1.check(ch, "0"))
   return;
 }
 return;
}
int main(int argc, char* argv[])
{
   Operater O1;
 O1.Loop();
        return 0;
}
//---------------------------------------------------------------------------
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值