请编写出符合下列要求的程序(C语言)?

请编写出符合下列要求的程序(C语言)?

问题描述:

1.设计登录界面,输入用户名,密码,如果用户密码正确,进入菜单,如果错误,要求重新输入用户名,密码。超过三次不正确,提示,退出程序。
2.记事本里面的每条信息包括日期、时间、内容、重要程度三项信息,重要程度要求用枚举变量实现,里面包括高、中、低三项供选择。
3.记事本里面的每条信息日期、时间要求取系统时间自动生成;
4.录入功能能增加信息,主要增加内容和选择重要程度;
5.输出所有记事信息;
6.能够删除指定日期指定时间信息。

先贴运行结果:
(1)登录

img

(2)登录后的界面

img

(3)新增记录

img

(4)显示所有记录

img

(5)删除及删除以后的数据

img

img

代码


#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;
}