项目代码
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#define N 10000
typedef struct TASK{
char task[100];
int year;
int month;
int day;
char num[20];
}RW;
void display(void);//显示主菜单
void load(RW str[],int *nptr);//把任务加载到内存
void save(RW str[],int n);//将数据保存到磁盘
void InputRecord(RW str[],int i);
void add(RW str[],int *nptr);//添加信息
void edit(RW str[],int n);//修改信息
void output(RW str[],int n);//输出所有信息
void del(RW str[],int *nptr);//删除信息
int FindbyR(RW str[],int n,char *a); //通过序号查找,主要作用返回下标
void PrintRecord(RW *sptr);//输出指针sptr所指的内容
void sort(RW str[],int n);//通过月份排序,从而更加明白自己想要完成的内容,那个更加紧急
void find(RW str[],int n);//通过序号查找
int main(void)
{
printf("欢迎使用课程表与日程管理系统!\n");
printf("查询课程表请输入1\n");
printf("进行日程管理请输入2\n");
RW str[N];
int n;//存放学生个数
int s;//选择课程表还是日程安排
scanf("%d",&s);
int select;//存放用户要执行的文件
load(str,&n); //从文件中加载所有事件内容到数组str中
if(s==1)
{
FILE* p = fopen("E:\\class.txt", "r");
char one[50] = { 0 };
fread(one, sizeof(char), sizeof(one), p);
FILE* q = fopen("E:\\time.txt", "r");
char two[1000] = { 0 };
fread(two, sizeof(char), sizeof(two), q);
int n, m;
printf("请输入1-7代表今日为周几,1-6代表课程编号进行查询\n");
printf("查询结果为课程拼音首字母及上课地点\n");
scanf("%d%d", &n, &m);
printf("%c ", one[(n - 1) * 6 + m - 1]);
for (int i = 24 * n - 28 + 4 * m; i < 24 * n - 28 + 4 * m + 4; i++)
printf("%c", two[i]);
}
while(s==2) {
display();
scanf("%d",&select);
switch(select){
case 1:add(str,&n);break;//添加 序号 事件 日期
case 2:edit(str,n);break;//修改 序号 事件 日期
case 3:output(str,n); break;//查看 序号 事件 日期
case 4:del(str,&n); break;//删除(通过序号) 整个事件
case 5:find(str,n); break;//查找 (通过序号)
case 6:sort(str,n);break; //排序 (对日期进行排序)
case 7: return 0;
}
}
}
//显示主菜单
void display(void){
system("cls");//控制台清屏
printf("欢迎使用日程管理系统\n");
printf("说明:在本系统中欲执行某种功能请输入相应数字\n");
printf("1 添加需要完成的计划(序号 事件 日期 )\n");
printf("2 修改需要完成的计划(序号 事件 日期)\n");
printf("3 查看需要完成的计划(全部)\n");
printf("4 删除需要完成的计划(通过序号)\n");
printf("5 查找需要完成的计划(通过序号)\n");
printf("6 按照月份排序\n");
printf("7 退出\n");
}
//将文件加载到数组str的函数load
void load(RW str[],int *nptr){
FILE *fp;
int i;
if((fp=fopen("e:\\f2.txt","r"))==NULL){
*nptr=0;
return;
}
for(i=0;fread(&str[i],sizeof(RW),1,fp)!=0;i++);//把信息读入sch中
*nptr=i;//记录文件中的数量
fclose(fp);//关闭文件
}
//将数据保存在磁盘的函数save
//以读的方式打开文件,若打开失败则函数执行完毕
void save(RW str[],int n){
FILE *fp;
if((fp=fopen("e:\\f2.txt","w"))==NULL){
printf("打开文件失败\n");
exit(0);
}
fwrite(str,n*sizeof(RW),1,fp);//将数组str中的记录一次性全部放入文件
fclose(fp);//关闭文件
}
//输出所有信息
void output(RW str[],int n){
printf("%8s%20s%20s%8s%8s\n","序号","事件","年","月","日");//打印表头
//显示事件信息
int i;
for(i=0;i<n;i++){
PrintRecord(&str[i]);
//system("pause");
}
system("pause");
}
//输出指针sptr所指记录内容
void PrintRecord(RW *sptr)
{
int i;
printf("%8s%20s%20d%8d%8d\n",sptr->num,sptr->task,sptr->year,sptr->month,sptr->day);
printf("\n");
}
//添加记录的函数
void add(RW str[],int *nptr){
char sel;
while(1){
InputRecord(str,(*nptr)++);
printf("是否继续添加(yes--y,no--other)\n");
scanf(" %c",&sel);
if(sel!='y')break;
}
save(str,*nptr);
}
void InputRecord(RW str[],int i)//输入一条信息
{
printf("请输入第%d个任务的信息\n",i+1);
printf("请输入序号:");
scanf("%s",&str[i].num);
printf("请输入事件:");
scanf("%s",str[i].task);
printf("请输入年月日(格式为mmmm-mm-mm):");
scanf("%d-%d-%d",&str[i].year,&str[i].month,&str[i].day);
}
void edit(RW str[],int n){
int i,index;
char sel;
char a[20];
printf("请输入序号:\n");
scanf("%s",a);
index=FindbyR(str,n,a);
if(index<0){
printf("没有要做的事情\n");
system("pause");
return;
}
printf("修改前的原纪录如下:\n");
PrintRecord(&str[index]);
//修改事件
printf("是否修改事件?请输入y or n:\n");
scanf(" %c",&sel) ;
if(sel=='y'){
printf("请输入新事件:\n");
scanf("%s",&str[index].task);
}
//修改年
printf("是否修改年?请输入y or n:\n");
scanf(" %c",&sel) ;
if(sel=='y'){
printf("请输入新年:\n");
scanf("%d",&str[index].year);
}
//修改日
printf("是否修改月?请输入y or n:\n");
scanf(" %c",&sel) ;
if(sel=='y'){
printf("请输入新月:\n");
scanf("%d",&str[index].month);
}
//修改日
printf("是否修改日?请输入y or n:\n");
scanf(" %c",&sel) ;
if(sel=='y'){
printf("请输入新日:\n");
scanf("%d",&str[index].day);
}
save(str,n);
}
//删除指定记录
void del(RW str[],int *nptr){
int i,index;
char a[20];
printf("请输入序号:");
scanf("%s",a);
index=FindbyR(str,*nptr,a);
if(index<0){
printf("\n没有该时间要做的事情! \n");
system("pause");
return ;
}
for(i=index;i<*nptr-1;i++){
str[i]=str[i+1];
}
(*nptr)--;//任务个数减一
printf("\n 删除成功!\n");
save(str,*nptr);
}
//按照序号查找
int FindbyR(RW str[],int n,char *a){
int i;
for(i=0;i<n;i++)
if(strcmp(str[i].num,a)==0)
return i;
return -1;
}
//对月份进行排序,使看起来更便捷
void sort(RW str[],int n){
int select,i,j;
int (*cmp)(RW A,RW B);
int Up(RW A,RW B);
int Down(RW A,RW B);
printf("1 按照月份升序排\n");
printf("2 按照月份降序排\n");
scanf("%d",&select);
switch(select){
case 1:cmp=Up;break;
case 2:cmp=Down;break;
default: return;
}
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++)
if((*cmp)(str[i],str[j])>0){//若逆序则返回正数
RW temp;
temp=str[i];str[i]=str[j];str[j]=temp;
}
}
output(str,n);
}
int Up(RW A,RW B){
return A.month>B.month?1:-1;
}
int Down(RW A,RW B){
return A.month<B.month?1:-1;
}
//按照序号查找事件
void find(RW str[],int n){
int index;
char a[20];
printf("请输入序号:\n");
scanf("%s",a);
index=FindbyR(str,n,a);
if(index>=0)
PrintRecord(&str[index]);
else
printf("该事件不存在\n");
system("pause");
}
知识点总结
- 相关文件操作
fread()函数:
①用法:fread(数据区首地址,每次读取的字节数,读取次数,文件指针);
②意义:fread()函数从文件指针指向的文件中读取一批数据存放到数据区首地址开始的区域中。其实就是从文件中读取若干字节放到缓冲区中,实现查找功能。
详情可见此转载链接:http://t.csdn.cn/jpOfQ
fwrite()函数:
①用法:fwrite(数据区首地址,每次读取的字节数,读取次数,文件指针);
②意义:fwrite()将从数据存储区首地址开始的若干个数据写入文件指针指向的文件中。
详情可见此转载链接:http://t.csdn.cn/umTAB
fclose()函数:
①用法:int fclose( FILE *fp );
②意义:使用fclose()函数就可以把 缓冲区内最后剩余的数据输出到内核缓冲区,并释放 文件指针和有关的缓冲区。如果流成功关闭,fclose 返回 0,否则返回EOF(-1)。(如果流为NULL,而且程序可以继续执行,fclose设定error number给EINVAL,并返回EOF。)
注:数据存储区首地址可以是数组名、结构变量或指针。
其他文件操作函数可见此转载链接:http://t.csdn.cn/7WHKE
2.system(“cls”)/system(“pause”)
①system(“cls”):代码编译后在运行时清屏。
②system(“pause”):让操作系统暂停程序的执行,实现按任意键继续的功能。
![](https://img-blog.csdnimg.cn/img_convert/00a242df8c00b298a890649463ac5894.png)
3.typedef
作用:为系统固有的或用户自定义的数据类型定义一个别名
用法举例:
typedef struct pts{
int x;
int y;
int z;
}Point;
//指定名称Point是struct pts的同义字。声明该结构的一些变量时,可以用下列语句。
Point start_pt;
Point end_pt;
除此之外,也可以使用typedef为基本的数据类型重新定义名称,以反映变量的含义。
例如:
typedef double price;
//此时price=double
double apple;
price clothes;
4.null
作用:当一个指针变量没有被显性初始化时,将该指针变量的值赋为NULL。
5.return 1/return -1;
具体见转载链接:http://t.csdn.cn/AKwEv
6.FILE
用于定义文件指针
例:
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp;
fp=fopen("f1.txt","w");
fprintf(fp,"hello world");
fclose(fp);
return 0;
}