⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2047.c

📁 北大POJ_ACM_2047素数检测.好不容易收集到的。
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "stdio.h"  
#include "stdlib.h"   /*Other Intro*/
#include "string.h"  
#include "conio.h"   /*Screen oprt*/
#include "mem.h"   /*Mem Oprt*/
#include "ctype.h"   /*Char Oprt*/
#include "alloc.h"   /*Dynamict Address Distribute*/
#define N 3

/*Define Data Structure*/
typedef struct node   
{
   char no[11];
   char name[15];
   int score[N];
   float sum;
   float average;
   int order;
   struct node *next;
 }STUDENT;

/*Function Prototype*/
STUDENT  *init();
STUDENT *create();
STUDENT *delete(STUDENT *h);
void print(STUDENT *h);
/*STUDENT *reverse(STUDENT *h);*/
void search(STUDENT *h);
void save(STUDENT *h);
STUDENT *load();
void computer(STUDENT *h);
STUDENT *insert(STUDENT *h);


STUDENT *sort(STUDENT *h);
STUDENT *index(STUDENT *h);
void total(STUDENT *h);
int menu_select();

void main()
{
   int i;
   STUDENT *head;     /*链表定义头指针*/
   head=init();
   clrscr();
   for(;;)             /*无限循环*/
   {
      switch(menu_select())     /*调用主菜单函数,返回值整数作开关语句的条件*/
      {                     /*值不同,执行的函数不同,break 不能省略*/
     case 0:head=init();break;   /*执行初始化*/
     case 1:head=create();break; /*创建链表*/
     case 2:head=delete(head);break; /*删除记录*/
     case 3:print(head);break;   /*显示全部记录*/
     case 4:search(head);break;  /*查找记录*/
     case 5:save(head);break;  /*保存文件*/
     case 6:head=load(); break;  /*读文件*/
     case 7:computer(head);break;  /*计算总分和均分*/
     case 8:head=insert(head);  break; /*插入记录*/
     case 9:head=sort(head);break;  /*排序*/
     case 10:head=index(head);break;  /*索引*/
     case 11:total(head);break;   /*分类合计*/
     case 12:exit(0);       /*如菜单返回值为12程序结束*/
      }
   }
}

/*菜单函数,返回值为整数*/
menu_select()
{
   char *menu[]={"***************MENU***************",  /*定义菜单字符串数组*/
   " 0. Init list",    /*初始化*/
   " 1. Enter a new list",   /*输入记录*/
   " 2. Delete a record from list",  /*从表中删除记录*/
   " 3. Print the list ",       /*显示单链表中所有记录*/
   " 4. Search record on number",   /*按照姓名查找记录*/
   " 5. Save the file",          /*将单链表中记录保存到文件中*/
   " 6. Load the file",        /*从文件中读入记录*/
   " 7. Calculate the score",    /*计算所有学生的总分和均分*/
   " 8. Insert a record to list ",   /*插入记录到表中*/
   " 9. Sort to make new file",   /*排序*/
   " 10. Index on number",       /*索引*/
   " 11. Total on number",      /*分类合计*/
   " 12. Quit"};              /*退出*/
   char s[3];       /*以字符形式保存选择号*/
   int c,i;
   gotoxy(1,25);        /*移动光标*/
   printf("press any key enter into menu......\n");   /*压任一键进入主菜单*/
   getch();                       /*输入任一键*/
   clrscr();                     /*清屏幕*/
   gotoxy(1,1);             /*移动光标*/
   textcolor(YELLOW);   /*设置文本显示颜色为黄色*/
   textbackground(BLUE);   /*设置背景颜色*/
   gotoxy(10,2);          /*移动光标*/
   putch(0xc9);        /*输出左上角边框┏*/
   for(i=1;i<44;i++)
      putch(0xcd);    /*输出上边框水平线*/
   putch(0xbb);            /*输出右上角边框  ┓*/
   for(i=3;i<20;i++)
   {
      gotoxy(10,i);putch(0xba);   /*输出左垂直线*/
      gotoxy(54,i);putch(0xba);
   }   /*输出右垂直线*/
   gotoxy(10,20);putch(0xc8);  /*输出左下角边框┗*/
   for(i=1;i<44;i++)
      putch(0xcd);      /*输出下边框水平线*/
   putch(0xbc);                 /*输出右下角边框┛*/
   window(11,3,53,19);       /* 制作显示菜单的窗口,大小根据菜单条数设计*/
   clrscr();              /*清屏*/
   for(i=0;i<14;i++)       /*输出主菜单数组*/
   {
      gotoxy(10,i+1);
      cprintf("%s",menu[i]);
   }
   textbackground(BLACK);   /*设置背景颜色为黑色*/
   window(1,1,80,25);       /*恢复原窗口大小*/
   gotoxy(10,21);       /*移动光标*/
   do{
      printf("\n     Please enter you choice(0~12):");    /*在菜单窗口外显示提示信息*/
      scanf("%s",s);           /*输入选择项*/
      c=atoi(s);            /*将输入的字符串转化为整形数*/
   }while(c<0||c>12);    /*选择项不在0~12之间重输*/
   return c;              /*返回选择项,主程序根据该数调用相应的函数*/
}

/*初始化该链表*/
STUDENT *init()
{
   return NULL;
}

/*创建链表,校验是亮点*/
STUDENT *create()
{
   int i; int s;
   STUDENT *h=NULL,*info;  /*STUDENT指向结构体的指针*/
   for(;;)
   {
      info=(STUDENT *)malloc(sizeof(STUDENT));
      if(!info)   /*如果指针info为空*/
      {
		 printf("\n out of memory");   /*输出内存溢出*/
		 return NULL;
      }
      inputs("enter no:",info->no,11);
      if(info->no[0]=='@') break;    /*如果学号首字符为@则结束输入*/
      inputs("enter name:",info->name,15);
      printf("please input %d score \n",N);
      s=0;         /*计算每个学生的总分,初值为0*/
      for(i=0;i<N;i++)
      {
     do{
        printf("score%d:",i+1);
        scanf("%d",&info->score[i]);
        if(info->score[i]>100||info->score[i]<0)
        printf("data error,repeat input\n");
     }while(info->score[i]>100||info->score[i]<0);
     s=s+info->score[i];
      }
      info->sum=s;
      info->average=(float)s/N;
      info->order=0;
      info->next=h;   /*将头结点做为新输入结点的后继结点*/
      h=info;    /*新输入结点为新的头结点*/
   }
   return(h);
}

/*输入字符串,并进行长度验证*/
inputs(char *prompt, char *s, int count)
{
   char p[255];
   do{
      printf(prompt);  /*显示提示信息*/
      scanf("%s",p);  /*输入字符串*/
      if(strlen(p)>count)printf("\n too long! \n"); /*进行长度校验,超过count值重输入*/
   }while(strlen(p)>count);
   strcpy(s,p); /*将输入的字符串拷贝到字符串s中*/
}

/*
STUDENT *reverse(STUDENT *h)
{
	STUDENT *t, *r, *y;
	if(h == NULL)
		return NULL;
	
	y = h;
	while(y != NULL)
	   {	   
		   t = y->next;
		   y->next = r;
		   r = y;
		   y = t;
	   }
	return r;
}
*/

/*输出链表中结点信息*/
void print(STUDENT *h)
{
   int i=0;     /* 统计记录条数*/
   STUDENT *p;
   clrscr();
  
   printf("\n\n\n******************************STUDENT***********************************\n");
   printf("|rec  |no        |      name     | sc1| sc2| sc3|   sum  |  ave  |order|\n");
   printf("|-----|----------|---------------|----|----|----|--------|-------|-----|\n");

/*   p = reverse(h);*/

   while(p!=NULL)
   {
       i++;
       printf("|%3d  |%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |\n", i, p->no,p->name,p->score[0],p->score[1],
p->score[2],p->sum,p->average,p->order);
       p=p->next;
   }


   printf("**********************************end***********************************\n");
}



/*删除记录*/
STUDENT *delete(STUDENT *h)
{
   STUDENT *p,*q;  /*p为查找到要删除的结点指针,q为其前驱指针*/
   char s[11];
   clrscr();
   printf("please input deleted number\n");
   scanf("%s",s);
   q=p=h;
   while(strcmp(p->no,s)&&p!=NULL)   /*当记录的学号不是要找的,或指针不为空时*/
   {
      q=p;       /*将p指针值赋给q作为p的前驱指针*/
      p=p->next;
   }
   if(p==NULL)
      printf("\nlist no %s student\n",s);
   else
   {
      printf("*****************************have found***************************\n");
      printf("|no        |      name     | sc1| sc2| sc3|   sum  |  ave  |order|\n");
      printf("|----------|---------------|----|----|----|--------|-------|-----|\n");
      printf("|%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |\n", p->no,
       p->name,p->score[0],p->score[1],p->score[2],p->sum,
       p->average,p->order);
      printf("********************************end*******************************\n");
      printf("do you want to delecte it?OK press Enter");
	  getch();
      if(p==h)
     h=p->next;     /*修改头指针指向下一条记录*/
      else
     q->next=p->next; /*不是头指针,将p的后继结点作为q的后继结点*/
      free(p);
      printf("\n have deleted No %s student\n",s);
      printf("Don't forget save\n");
   }
   return(h);
}

/*查找记录*/
void search(STUDENT *h)
{
   STUDENT *p;
   char s[15];
   clrscr();
   printf("please enter number for search\n");
   scanf("%s",s);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -