请编写出符合下列要求的程序(C语言)?
问题描述:
1.设计登录界面,输入用户名,密码,如果用户密码正确,进入菜单,如果错误,要求重新输入用户名,密码。超过三次不正确,提示,退出程序。
2.记事本里面的每条信息包括日期、时间、内容、重要程度三项信息,重要程度要求用枚举变量实现,里面包括高、中、低三项供选择。
3.记事本里面的每条信息日期、时间要求取系统时间自动生成;
4.录入功能能增加信息,主要增加内容和选择重要程度;
5.输出所有记事信息;
6.能够删除指定日期指定时间信息。
答
先贴运行结果:
(1)登录
(2)登录后的界面
(3)新增记录
(4)显示所有记录
(5)删除及删除以后的数据
代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
//重要程度
enum ELevel
{
e_level_high,
e_level_mid,
e_level_low
};
//定义日志信息
struct DataInfo
{
char tt[20];
char data[100];
enum ELevel level;
};
struct DataInfo g_all[200]; //定义全局变量存储信息
int g_nmb=0; //日志的实际数量
int login()
{
char user[]="zhangsan";
char password[]="123";
char un[30],pwd[30];
int tms=0;
printf("请输入用户名:");
while(tms <3)
{
scanf("%s",un);
if(strcmp(un,user)==0)
break;
else
{
tms++;
if(tms==3)
{
printf("输入错误超过3次,退出程序");
system("pause");
return 0;
}
else
printf("用户名输入错误,请重新输入:");
}
}
tms = 0;
printf("请输入密码:");
while(tms <3)
{
scanf("%s",pwd);
if(strcmp(pwd,password)==0)
break;
else
{
tms++;
if(tms==3)
{
printf("输入错误超过3次,退出程序");
system("pause");
return 0;
}
else
printf("用户名输入错误,请重新输入:");
}
}
printf("欢迎使用本系统!\n");
system("pause");
return 1;
}
//菜单
int menu()
{
int opt;
system("cls"); //清屏
printf("1.新增记录\n");
printf("2.输出所有信息\n");
printf("3.删除指定信息\n");
printf("4.退出系统\n");
printf("请输入您的选择:");
scanf("%d",&opt);
return opt;
}
void gettmstr(char now_date[])
{
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
sprintf(now_date,"%04d-%02d-%02d %02d:%02d:%02d",(1900+timeinfo->tm_year),(1+timeinfo->tm_mon),
timeinfo->tm_mday,timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec);
now_date[19] = 0;
}
//清空输入缓存
void safe_flush(FILE *fp)
{
int ch;
while( (ch = fgetc(fp)) != EOF && ch != '\n' );
}
//插入数据
void insertData()
{
struct DataInfo dt;
int level;
system("cls");
gettmstr(dt.tt);
printf("请输入需要插入的内容:");
safe_flush(stdin); //清空输入缓存
gets(dt.data);
printf("请选择日志等级:(2:高 1:中 0:低)");
while(1)
{
scanf("%d",&level);
if(level>=0 && level<=2)
break;
else
printf("请输入0-2之间的数:");
}
if(level == 2)
dt.level = e_level_high;
else if(level == 1)
dt.level = e_level_mid;
else
dt.level = e_level_low;
g_all[g_nmb++] = dt;
printf("插入成功\n");
system("pause");
}
//显示全部数据
void showAll()
{
int i=0;
system("cls");
printf("日期 等级 内容\n");
for (i=0;i<g_nmb;i++)
{
printf("%s ",g_all[i].tt);
if(g_all[i].level == e_level_high)
printf("高 ");
else if (g_all[i].level == e_level_mid)
printf("中 ");
else
printf("低 ");
printf("%s\n",g_all[i].data);
}
system("pause");
}
//是否包含字符串
int findstr(char*big ,char* smal)
{
int i,j,lenb,lens;
int nmb = 0;
lenb = strlen(big);
lens = strlen(smal);
nmb = 0;
if(lens > lenb)
return 0;
i = 0;
while(i < lenb-lens+1)
{
for (j = 0; j < lens;j++)
{
if(big[i+j] != smal[j])
break;
}
if (j == lens) //说明找到
{
nmb++;
return 1;
i += lens;
}else
i++;
}
return 0;
}
//删除指定数据
void del()
{
char buf[100]={0};
char tt[20]={0};
int i,j,k,nmb=0,op=0;
system("cls");
printf("请输入需要删除的日志日期(如:2021-02-03 20:00、2021-02-03 20、2021-02-03):");
gets(tt);
safe_flush(stdin);
printf("满足条件的记录有:\n");
//输出所有符合要求的数据
for (i=0;i<g_nmb;i++)
{
if(findstr(g_all[i].tt,tt))
{
nmb++;
printf("(%d) ",nmb);
printf("%s ",g_all[i].tt);
if(g_all[i].level == e_level_high)
printf("高 ");
else if (g_all[i].level == e_level_mid)
printf("中 ");
else
printf("低 ");
printf("%s\n",g_all[i].data);
}
}
if(nmb == 0)
{
printf("未找到改日期的日志");
system("pause");
return ;
}
printf("请输入需要删除的日志序号:");
while(1)
{
scanf("%d",&op);
if(op >=1 && op <= nmb)
break;
else
printf("未找到该序号的日志,请重新输入:");
}
//删除
k=0;
for (i=0;i<g_nmb;i++)
{
if(findstr(g_all[i].tt,tt))
{
k++;
if(k == op)
{
for(j=i;j<g_nmb-1;j++)
g_all[j] = g_all[j+1];
g_nmb -=1;
printf("删除成功!\n");
break;
}
}
}
system("pause");
}
//处理登录后的事物
void deal()
{
int opt;
while(1)
{
opt = menu();
switch(opt)
{
case 1:
insertData();
break;
case 2:
showAll();
break;
case 3:
del();
break;
case 4:
printf("谢谢使用,再见!\n");
system("pause");
return ;
}
}
}
int main()
{
int opt;
printf("--------------------------------\n");
printf(" 欢迎使用记事本系统 \n");
printf(" 1.登录 \n");
printf(" 2.退出 \n");
printf("--------------------------------\n");
printf("请输入您的选择:");
scanf("%d",&opt);
switch(opt)
{
case 1:
if(login())
deal();
break;
case 2:
printf("谢谢使用,再见!\n");
system("pause");
return 0;
}
return 0;
}
答
#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#define MAX_USERNAME_SIZE 32
#define MAX_PASSWORD_SIZE 32
#define MAX_CONTENT_SIZE 1024
#define MAX_NOTES 1024
enum Importance
{
Low,
Medium,
High
};
const char *get_importance_string(enum Importance importance)
{
switch (importance)
{
case 0:
return "Low";
case 1:
return "Medium";
case 2:
return "High";
default:
return NULL;
}
}
struct User
{
char userName[MAX_USERNAME_SIZE];
char password[MAX_PASSWORD_SIZE];
};
struct Note
{
time_t time;
char content[MAX_CONTENT_SIZE];
enum Importance importance;
struct Note *next;
};
struct User defaultUser = {"user", "123456"};
struct Note *head = NULL;
void login()
{
int attempt = 0;
do
{
struct User user;
printf("User Name: ");
scanf("%s", user.userName);
printf("Password: ");
scanf("%s", user.password);
if (strcmp(user.userName, defaultUser.userName) == 0 && strcmp(user.password, defaultUser.password) == 0)
break;
attempt++;
printf("Incorrect user name or password. Input again.\n");
} while (attempt < 3);
if (attempt == 3)
{
printf("You have tried three times.\n");
exit(-1);
}
}
void print_menu()
{
printf("Menu:\n");
printf("[1]. Add a note\n");
printf("[2]. Delete a note\n");
printf("[3]. Print all notes\n");
printf("[4]. Exit\n");
}
void add_note()
{
struct Note *note = (struct Note *)malloc(sizeof(struct Note));
printf("New Note Content: ");
getchar(); // remove '\n'
fgets(note->content, MAX_CONTENT_SIZE, stdin);
note->content[strlen(note->content) - 1] = '\0'; // remove '\n'
while (1)
{
printf("New Note Importance (0 - Low, 1 - Medium, 2 - High): ");
int importance;
scanf("%d", &importance);
if (importance < 0 || importance > 2)
{
printf("invalid importance\n");
}
else
{
note->importance = importance;
break;
}
}
note->time = time(NULL);
note->next = NULL;
if (!head)
{
head = note;
}
else
{
struct Note *p = head;
while (p->next)
p = p->next;
p->next = note;
}
}
void delete_note()
{
if (!head)
{
printf("no notes available\n");
return;
}
int year, month, day;
int hour, minute, second;
printf("Input the date of the note (YYYY-MM-DD): ");
scanf("%d-%d-%d", &year, &month, &day);
printf("Input the time of the note Time (HH:MM::SS): ");
scanf("%d:%d:%d", &hour, &minute, &second);
struct tm t = {
.tm_year = year - 1900,
.tm_mon = month - 1,
.tm_mday = day,
.tm_hour = hour,
.tm_min = minute,
.tm_sec = second};
time_t time = mktime(&t);
struct Note *p = head;
struct Note *prev = NULL;
while (p)
{
if (p->time == time)
break;
prev = p;
p = p->next;
}
if (!p)
{
printf("The note with the given time is not found.\n");
return;
}
if (prev)
prev->next = p->next;
else
head = p->next;
free(p);
}
void remove_notes()
{
struct Note *p = head;
struct Note *q;
while (p)
{
q = p;
p = p->next;
free(q);
}
}
void print_notes()
{
if (!head)
{
printf("no notes available\n");
return;
}
struct Note *p = head;
int i = 1;
while (p)
{
char date[32];
char time[32];
struct tm *t = localtime(&p->time);
strftime(date, sizeof(date), "%Y-%m-%d", t);
strftime(time, sizeof(time), "%H:%M:%S", t);
printf("Note #%d\n", i);
printf("Date: %s\n", date);
printf("Time: %s\n", time);
printf("Content: %s\n", p->content);
printf("Importance: %s\n", get_importance_string(p->importance));
p = p->next;
i++;
}
}
int main()
{
login();
while (1)
{
print_menu();
printf("Input (1, 2, 3, 4): ");
int ch;
do
{
ch = getchar();
} while (ch == ' ' || ch == '\n');
switch (ch)
{
case '1':
add_note();
break;
case '2':
delete_note();
break;
case '3':
print_notes();
break;
case '4':
exit(0);
break;
default:
break;
}
};
remove_notes();
return 0;
}