课表,结构体数组的基本操作,运行结果:
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXNMB 100
typedef struct _kc
{
char name[10]; //课程名
int wk; //时间,用1-7表示周一到周日
int js[4]; //节,比如3、4节课,同一门课程一天最多上4节,如果需要更多,可增大这个数字,
char rome[10]; //教室
}CourseInfo;
/** 录入课表
* c 保存所有课程
* n 课程数量
*/
void input(CourseInfo c[], int* n)
{
int flag = 1;
char ch;
int i = 0;
while (flag)
{
printf("请输入课程名:");
scanf("%s", c[*n].name);
printf("请输入课程时间(1-7):");
scanf("%d", &c[*n].wk);
printf("请输入课程所在的节号(如3 4,表示该课程在当天的第3、4节上,以回车结束):");
for (i = 0; i < 4; i++)
c[*n].js[i] = 0; //初始化为0
i = 0;
while (1)
{
if (i >= 4) break; //防止越界
scanf("%d", &c[*n].js[i]);
ch = getchar();
i++;
if (ch == '\n')
break;
}
printf("请输入教室:");
scanf("%s", c[*n].rome);
*n = (*n) + 1; //数量+1
printf("是否继续录入(1.是 0.否):");
scanf("%d", &flag);
}
printf("录入完成!\n");
}
/** 写入文件
* c 保存所有课程
* n 课程数量
*/
void write2file(CourseInfo c[], int n)
{
int i;
FILE* fp = fopen("course.txt", "wb");
for (i = 0; i < n; i++)
{
fwrite(&c[i], sizeof(CourseInfo), 1, fp);
}
fclose(fp);
}
/** 按照上课日期排序
* c 保存所有课程
* n 课程数量
*/
void sortkc(CourseInfo c[], int n)
{
int i, j;
CourseInfo t;
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - 1 - i; j++)
{
if (c[j].wk > c[j + 1].wk)
{
t = c[j];
c[j] = c[j + 1];
c[j + 1] = t;
}
}
}
}
int Mod(CourseInfo c[], int n)
{
int i;
char name[10]={0};
int flag = 0;
char ch;
printf("请输入要修改的课程名称:");
for (i = 0; i < n; i++)
{
if (strcmp(name, c[i].name) == 0)
{
flag = 1;
printf("请输入课程时间(1-7):");
scanf("%d", &c[i].wk);
printf("请输入课程所在的节号(如3 4,表示该课程在当天的第3、4节上,以回车结束):");
for (i = 0; i < 4; i++)
c[i].js[i] = 0; //初始化为0
i = 0;
while (1)
{
if (i >= 4) break; //防止越界
scanf("%d", &c[i].js[i]);
ch = getchar();
i++;
if (ch == '\n')
break;
}
printf("请输入教室:");
scanf("%s", c[i].rome);
printf("修改成功!\n");
break;
}
}
if (flag == 0)
printf("未找到该课程\n");
return flag;
}
void ReadFile(CourseInfo c[], int* n)
{
int i = 0;
FILE* fp = fopen("course.txt", "rb");
if (fp == 0)
return;
while (!feof(fp))
{
if (fread(&c[i], sizeof(CourseInfo), 1, fp) == 1)
i++;
}
fclose(fp);
*n = i;
}
/** 表格化显示课表
* c 保存所有课程
* n 课程数量
*/
void showCourse(CourseInfo c[], int n)
{
int i, j, k;
int flag = 0;
char tmp[15] = { 0 };
sortkc(c, n); //按照上课时间排序,方便显示
printf("---------------------------------------------------------------------------------------------------------------\n");
printf(" %-15s %-15s %-15s %-15s %-15s %-15s %-15s\n", "周一", "周二", "周三", "周四", "周五", "周六", "周日");
printf("---------------------------------------------------------------------------------------------------------------\n");
for (i = 0; i < 8; i++) //一天做多8节课程
{
printf("%d ", i+1); //输出节号
for (j = 0; j < n; j++)
{
flag = 0;
for (k = 0; k < 4; k++)
{
if (c[j].js[k] == (i + 1))
{
flag = 1;
strcpy(tmp, c[j].name);
strcat(tmp, "/");
strcat(tmp, c[j].rome);
break;
//printf("%-8s ", c[j].name);
}
}
if (flag == 0)
printf("%-15s ", " ");
else
printf("%-15s ", tmp);
}
printf("\n");
printf("---------------------------------------------------------------------------------------------------------------\n");
}
}
int main()
{
CourseInfo c[MAXNMB];
int n = 0;
int op;
ReadFile(c, &n);
while (1)
{
system("cls");//清屏
printf("---------课表管理系统--------\n");
printf("1.录入数据\n");
printf("2.显示课表\n");
printf("3.修改课表\n");
printf("0.退出\n");
printf("请选择:");
scanf("%d", &op);
switch (op)
{
case 0: return 0;
case 1:
input(c, &n);
write2file(c, n);
break;
case 2:
showCourse(c, n);
break;
case 3:
if(Mod(c, n))
write2file(c, n);
break;
}
system("pause");//
}
}
写下给你
代码如下
#include <stdio.h>
#include <string.h>
struct table {
char name[64]; //课程名
char time[16]; //时间
char room[16]; //教室
};
//从本地文件读课表信息
int read(struct table t[])
{
int n = 0;
FILE *fp = fopen("D:\\table.txt", "r");
if(fp == NULL) {
printf("无课表信息\n");
return 0;
}
while(!feof(fp)) {
fscanf(fp, "%s %s %s\n", t[n].name, t[n].time, t[n].room);
n++;
}
fclose(fp);
printf("课表信息读取成功,总信息数为%d\n", n);
return n;
}
//显示课表信息
void display(struct table t[], int n)
{
printf("课程名\t时间\t教室\n");
if(n <= 0) {
printf("无课表信息\n");
return;
}
for(int i=0; i<n; i++) {
printf("%s\t%s\t%s\n", t[i].name, t[i].time, t[i].room);
}
}
//录入课表信息
int input(struct table t[], int n)
{
char ch;
FILE *fp = fopen("D:\\table.txt", "a");
if(fp == NULL) {
return -1;
}
while(1) {
printf("请输入课表信息(课程名 时间 教室):\n");
scanf("%s %s %s", t[n].name, t[n].time, t[n].room);
fprintf(fp, "%s\t%s\t%s\n", t[n].name, t[n].time, t[n].room);
n++;
printf("录入成功");
printf("是否继续录入?(y/n)");
while(1) {
ch = getchar();
if(ch == 'y' || ch == 'n') {
break;
}
}
if(ch == 'n') {
break;
}
}
fclose(fp);
printf("课表信息录入完成\n");
return n;
}
//修改课表信息
void modify(struct table t[], int n)
{
if(n <= 0) {
printf("无课表信息\n");
return;
}
char ch;
char name[64];
while(1) {
printf("请输入需要修改的课程名:");
scanf("%s", name);
for(int i=0; i<n; i++) {
if(strcmp(t[i].name, name) == 0) {
printf("请输入新的课表信息(课程名 时间 教室):\n");
scanf("%s %s %s", t[i].name, t[i].time, t[i].room);
printf("修改成功\n");
break;
}
if(i == n - 1) {
printf("无该课程的课表信息\n");
}
}
printf("是否继续修改?(y/n)");
while(1) {
ch = getchar();
if(ch == 'y' || ch == 'n') {
break;
}
}
if(ch == 'n') {
break;
}
}
FILE *fp = fopen("D:\\table.txt", "w");
if(fp == NULL) {
return;
}
for(int i=0; i<n; i++) {
fprintf(fp, "%s\t%s\t%s\n", t[i].name, t[i].time, t[i].room);
}
fclose(fp);
printf("课表信息修改完成\n");
}
int main()
{
struct table t[100];
int quit = 1, select, ret, n = 0;
n = read(t);
while(quit) {
printf("\n/*********** 课表管理系统 **********/\n");
printf("/********** 1.查看课表 **********/\n");
printf("/********** 2.录入课表 **********/\n");
printf("/********** 3.修改课表 **********/\n");
printf("/********** 4.退出课表 **********/\n");
printf("请选择:");
scanf("%d", &select);
switch (select) {
case 1:
display(t, n);
break;
case 2:
ret = input(t, n);
if(ret != -1) {
n = ret;
}
break;
case 3:
modify(t, n);
break;
case 4:
quit = 0;
break;
default:
printf("无效选择\n");
break;
}
}
return 0;
}