【C】ファイルとチェーンテーブルによる学生情報管理
31889 ワード
主な考え方は、main関数が始まるとファイルからデータを読み出し、データをチェーンテーブルにしてメモリに格納することです.そして、メニューオプションで所望の操作(情報を増やし、情報を修正し、情報を削除・・・)を開始します.最後にプログラムを出すときにデータを格納したファイルを削除し、1つのファイルを作成して操作後のデータを順番にファイルに書き込みます.(プログラムを練習して、技術的な含有量はありません!)
比較的有用な検出入力アルゴリズム:
入力されたint型の変数を受信するには2つのループがあります.第1のサイクルは、受信したデータが整数であるか否かを判断し、受信を継続しない場合である.2つ目のループは誤ったデータを受信し、次の改行が受信を停止することを知っています!
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つ目のループは誤ったデータを受信し、次の改行が受信を停止することを知っています!