刚学c语言,向高手求教如何达到程序要求(menu菜单问题)
要求实现一菜单, 当选择d,为输入地点名,输入时间,通过时间计算矿井深度,询问是否再次输入时间重新计算,返回计算的深度值,只有最后一次计算数据被存储(最多可以有100组输入数据可以存储在程序内存)
当选择s,提示输入要存储的文件名,若文件不存在,提示再次输入一次,输入后新建文件,若文件存在,则覆盖文件,存储的数组(parallel array)为地点名和计算的深度(地点名为string数组,深度为double数组)
当选择l,提示输入要读取的文件名,文件不存在,再次提示输入一次,若文件存在,则读取文件,并返回文件中pit的总数值
当选择p,则在屏幕显示当前缓存内的所有数据,并且按如下格式
Pit Location Pit Depth
ele 01 -3.78
ele 02 -6.78
只先显示15行数据,按下enter再显示余下数据,并显示pit的总数
只有当选择q的时候,才退出程序
且要求要有一module为逐行读取文件用fgets()函数,且移除the trailing '\n'(个人觉得应该包含在load里面)
下面是自己初步写的程序,不懂怎么改进了,希望各位大大帮忙指出错误以及如何完全实现要求,尤其是下划线部分
程序代码:
#include <stdio.h> #include <stdbool.h> #define SIZE 100 double Depth(double seconds2Bottom); bool yesNo(const char prompt[]); int getPitData(char location[SIZE], double depth[SIZE], double toBottom); void save(char location[SIZE], double depth[SIZE], int numdata); int load(char location[SIZE], double depth[SIZE], int numdata); bool readline(int maxLen); void print(char location[SIZE], double depth[SIZE], int numdata); int main(void) { /* Declare and initialize variables. */ char selection, location[SIZE],str; const char prompt; double toBottom, depth[SIZE]; int numdata, maxLen =100; while (selection != 'Q', 'q') { fflush(stdin); printf("\n\ (D)epth: Enter pit location. Compute depth\n\ (S)ave: Write pits date to file\n\ (L)oad: Read mine shaft information from file\n\ (P)rint: Display mine shafr information\n\ (Q)uit: Exit program\n"); printf("\nEnter Choice (D/S/L/P/Q):"); selection = getchar(); fflush(stdin); switch (selection) { case 'Q': case 'q': return 0; break; case 'D': case 'd': getPitData(location, depth ,toBottom); break; case 'S': case 's': save(location,depth,numdata); break; case 'L': case 'l': load(location,depth,numdata); break; case 'P': case 'p': print(location,depth,numdata); break; default: printf("Invalid selection. Please try again.\n"); } /*end of switch*/ } /*end of while*/ return 0; } double Depth(double seconds2Bottom) { /* Acceleration of gravity */ const double G = 9.81; return -0.5 * G * seconds2Bottom * seconds2Bottom; } /* Display a question and returns true if the answer is 'y' or 'Y' */ bool yesNo(const char prompt[]) { char answer; printf("\n%s (Y/N)? ", prompt); answer = getchar(); fflush(stdin); return (answer == 'y' || answer == 'Y'); } int getPitData(char location[SIZE], double depth[SIZE], double toBottom) { printf("\nEnter mine shaft location or name: "); scanf("%s", &location); do { printf("\nEnter time to bottom: "); scanf("%lf", &toBottom); fflush(stdin); printf("\nShaft depth is %.2f m\n", Depth(toBottom)); } while ( yesNo("Do you want to take another measure of the same shaft")); return Depth(toBottom); } void save(char location[SIZE], double depth[SIZE], int numdata) { FILE *fp; char filename[SIZE]; printf("Please enter the file name to save pitdata to: "); scanf("%s", &filename); fflush(stdin); fp = fopen(filename, "r"); if(fp == NULL) { printf("Error opening %s for writing \n", filename); printf("Please enter the file name to save pitdata to: "); scanf("%s", &filename); fflush(stdin); fp = fopen(filename, "w"); } else { for(numdata=0;numdata<SIZE;numdata++) { fwrite(stdin, sizeof(location),1,fp); } } fclose(fp); } bool readline(int maxLen) { char filename[SIZE],str[maxLen]; FILE *stream; stream = fopen(filename,"r+"); if(!stream) return(false); else { while(fgets(str,maxLen,stream)) printf("%s", str); } return(true); } int load(char location[SIZE], double depth[SIZE], int numdata) { FILE *fp; char filename[SIZE],str; printf("\nEnter name of file to load pit data from: "); scanf("%s", &filename); fp = fopen(filename, "r"); if(!fp) { printf("\nEnter name of file to load pit data from: "); scanf("%s", &filename); return; } else { if (readline(str)) printf("%s\n", str); printf("wo"); } fclose(fp); return numdata; } void print(char location[SIZE], double depth[SIZE], int numdata) { printf("\nPit Location Pit Depth\n"); printf("%c %6.2f\n", &location, &depth); fflush(stdin); }