【C】ファイルとチェーンテーブルによる学生情報管理

31889 ワード

主な考え方は、main関数が始まるとファイルからデータを読み出し、データをチェーンテーブルにしてメモリに格納することです.そして、メニューオプションで所望の操作(情報を増やし、情報を修正し、情報を削除・・・)を開始します.最後にプログラムを出すときにデータを格納したファイルを削除し、1つのファイルを作成して操作後のデータを順番にファイルに書き込みます.(プログラムを練習して、技術的な含有量はありません!)
  1 #include
  2 #include
  3 
  4 struct stu
  5 {
  6     int num;
  7     char name[20];
  8 };
  9 typedef struct stul
 10 {
 11     struct stu stuinfo;
 12     struct stul *next;
 13 }stul;
 14 
 15 int menu();        //  
 16 stul *create();        //    
 17 void openfile(stul *h);     //           
 18 void append(stul *h);        //      
 19 void out(stul *h);        //      
 20 void savetofile(stul *h);        //            
 21 void search(stul *h);        //        
 22 void modify(stul *h);        //      
 23 void delete(stul *h);        //      
 24 
 25 int main(void)
 26 {
 27     stul *h;
 28     h=create();
 29     openfile(h);
 30     while(1)
 31     {
 32         switch(menu())
 33         {
 34             case 1:append(h); break;
 35             case 2:search(h); break;
 36             case 3:modify(h); break;
 37             case 4:delete(h); break;
 38             case 5:out(h); break;
 39             case 6:savetofile(h); exit(0); break;
 40         }
 41     }
 42 }
 43 
 44 void delete(stul *h)        //      
 45 {
 46     stul *p,*l;
 47     int num;
 48     char ch;
 49     p=h;
 50     l=p->next;
 51     printf("");
 52     while(scanf("%d",&num)!=1)
 53     {
 54         while(ch=getchar()!='
'); 55 printf(" (001 002 003):"); 56 } 57 while(l!=NULL) 58 { 59 if(l->stuinfo.num==num) 60 { 61 p->next=p->next->next; 62 free(l); 63 break; 64 } 65 l=l->next; 66 p=p->next; 67 } 68 } 69 70 void modify(stul *h) // 71 { 72 stul *p; 73 int num; 74 char ch; 75 p=h->next; 76 while(p!=NULL) 77 { 78 printf(""); 79 while(scanf("%d",&num)!=1) 80 { 81 while(ch=getchar()!='
'); 82 printf(" (001 002 003):"); 83 } 84 if(p->stuinfo.num==num) 85 { 86 printf(""); 87 scanf("%s",&p->stuinfo.name); 88 break; 89 } 90 else 91 p=p->next; 92 } 93 } 94 95 96 void search(stul *h) // 97 { 98 stul *p; 99 int num; 100 char ch; 101 p=h->next; 102 printf(""); 103 while(scanf("%d",&num)!=1) 104 { 105 while(ch=getchar()!='
'); 106 fprintf(stdout," (001 002 003)"); 107 } 108 while(p!=NULL) 109 { 110 if(p->stuinfo.num==num) 111 { 112 printf(" :%d; :%s
",p->stuinfo.num,p->stuinfo.name); 113 break; 114 } 115 else 116 p=p->next; 117 } 118 } 119 120 void savetofile(stul *h) // 121 { 122 FILE *fp; 123 stul *p; 124 struct stu stuinfo; 125 remove("stuinfo.txt"); 126 fp=fopen("stuinfo.txt","wb"); 127 p=h->next; 128 while(p!=NULL) 129 { 130 fwrite(&p->stuinfo,sizeof(stuinfo),1,fp); 131 p=p->next; 132 } 133 } 134 135 void out(stul *h) // 136 { 137 stul *p; 138 p=h; 139 p=p->next; 140 while(p!=NULL) 141 { 142 printf(" :%d; :%s;
",p->stuinfo.num,p->stuinfo.name); 143 p=p->next; 144 } 145 } 146 147 stul *create() // 148 { 149 stul *p; 150 p=(stul *)malloc(sizeof(stul)); 151 p->next=NULL; 152 return p; 153 } 154 155 void openfile(stul *h) // 156 { 157 FILE *fp; 158 struct stu stuinfo; 159 stul *p,*l; 160 p=h; 161 if((fp=fopen("stuinfo.txt","rb"))==NULL) 162 fprintf(stdout,"sorry cound not open stuinfo.txt file"); 163 else 164 { 165 while(fread(&stuinfo,sizeof(stuinfo),1,fp)==1) 166 { 167 l=create(); 168 l->stuinfo=stuinfo; 169 p->next=l; 170 p=l; 171 } 172 } 173 } 174 175 void append(stul *h) // 176 { 177 stul *p,*l; 178 struct stu stuinfo; 179 int num; 180 char name[20]; 181 char ch,y; 182 p=h; 183 while(p->next!=NULL) 184 p=p->next; 185 do 186 { 187 puts(" (001 002 003):"); 188 while(scanf("%d",&num)!=1) 189 { 190 while(ch=getchar()!='
'); 191 fprintf(stdout," (001 002 003):"); 192 } 193 printf("
"); 194 scanf("%s",stuinfo.name); 195 l=create(); 196 stuinfo.num=num; 197 //stuinfo.name=name; 198 l->stuinfo=stuinfo; 199 p->next=l; 200 p=l; 201 getchar(); 202 fprintf(stdout," ?(y/n)"); 203 y=getchar(); 204 } 205 while(y=='y'||y=='Y'); 206 } 207 208 int menu() // 209 { 210 int num; 211 char ch; 212 puts("please choose the following chooses!"); 213 puts("\t1.append student`s info."); 214 puts("\t2.search student's info from name."); 215 puts("\t3.modify student's info."); 216 puts("\t4.delete student's info."); 217 puts("\t5.out student's info."); 218 puts("\t6.exit."); 219 while(scanf("%d",&num) != 1 || num>6 || num<1) // 220 { 221 while(ch=getchar()!='
'); 222 printf("please input your choose as 1 2 ...5 6
"); 223 224 } 225 return num; 226 }

比較的有用な検出入力アルゴリズム:
1 while(scanf("%d",&num)!=1)
2 {
3     while(ch=getchar()!='
'); 4 fprintf(stdout," (001 002 003)"); 5 }

入力されたint型の変数を受信するには2つのループがあります.第1のサイクルは、受信したデータが整数であるか否かを判断し、受信を継続しない場合である.2つ目のループは誤ったデータを受信し、次の改行が受信を停止することを知っています!