📜  用C语言编写的ToDo App

📅  最后修改于: 2021-05-25 23:45:15             🧑  作者: Mango

ToDo List App是一种应用程序,通常用于维护我们的日常任务或列出我们必须做的所有事情,其中最重要的任务在列表的顶部,最不重要的任务在底部的列表。这对计划我们的日常时间表很有帮助。我们可以随时添加更多任务,并删除已完成的任务。

特点

在此版本的ToDo列表中,用户将获得四个选项:

  • 在“待办事项列表”应用中创建(添加)新任务或添加新的待办事项。
  • 查看所有任务或查看添加到应用程序中的所有待办事项。
  • 从待办事项列表中删除任何待办事项。
  • 从应用程序退出。

方法

该程序涉及一些基本概念,例如变量,数据类型,结构,字符串,循环,在任意位置的链表中插入节点,在任意位置的链表中删除节点,遍历链表等。构造ToDo应用程序如下:

  • 初始屏幕将显示应用程序和开发人员的名称:使用printf()函数(用于打印(“字符,字符串,浮点数,整数,八进制和十六进制值”的预定义函数)内部的一些语句来完成此操作。和一些预定义的功能。
  • 第二个屏幕将向用户显示四个选项的列表,即“添加”,“删除”,“查看”和“退出”:这是使用Switch-cases实现的。
  • 根据用户选择,将显示相应的函数屏幕:创建每个任务的功能。由于C语言是基于函数或过程的语言,因此我们应该为特定作业创建函数。
  • 所有待办事项都将写入链接列表节点的数据部分内。链表应该全局声明,这样,如果函数执行结束,数据(我们的待办事项)将不会丢失。通过全局声明,所有函数都可以使用链表中的相同数据。

以下是上述程序的功能:

  • 启动画面由应用程序和开发人员的名称组成。该代码编写在名为interface()的函数内:
    • interface()函数包含一些printf语句和一个称为system()的预定义函数。
    • system()函数是C / C++标准库的一部分。它用于传递可以在命令处理器或操作系统终端中执行的命令,并在命令完成后最终返回该命令。
      • 系统(“颜色4F”)将更改控制台的颜色,即背景(4)和控制台上的文本,即前景(F)。
      • 系统(“ pause”)将暂停屏幕,因此用户将收到一条消息:按任意键继续。 。 。

开机画面

  • main()函数使用简单 在无限的while循环内切换大小写,以便用户每次都能做出选择,并在printf()函数的帮助下以及使用scanf()函数获取用户输入的情况下提供选择。根据输入,将执行特定情况并调用所需的函数。
  • 链表名为Todo的链表是使用C的结构概念制成的,并且使用typedef将其重命名为Todo。此链接列表包括三个部分–
    • 数据部分制成字符数组,即char buffer [101] 。 ToDos可能很大,因此将数组的大小声明为101。
    • 节点部分包含下一个节点的地址,即* next。
    • 一个整数类型的变量(整数),该变量将考虑节点的数量,并有助于在进一步定义的函数中对ToDos进行编号。
  • 就像在单链列表中一样,开始指针(在这种情况下为todo * start)用于获取第一个节点的地址,该指针被声明并在其中保留NULL(最初指向NULL)。
  • seetodo()函数此函数编码四个概念。这些如下:
    • 系统(“ cls”):清除屏幕或控制台。如果有人想查看用户以前完成的所有操作或输入,则可以避免这种情况。
    • 创建结构变量的对象,即* temp,以访问链表结构。此临时变量将指向初始启动。如果开始等于NULL,我们可以输出Empty ToDo。这意味着我们的列表为空。
    • 使用简单的链表遍历概念,即逐个节点打印数据部分,直到最后一个节点,我们可以打印所有ToDos 。 while循环将执行,直到最后一个节点,printf()的内部,将打印待办事项的编号,并提出()函数将打印这是在字符的字符串的形式的数据。 fflush()是预定义的函数,其目的是清除(或刷新)输出缓冲区并将缓冲的数据移至控制台。
    • 最后,使用系统(“暂停”)暂停屏幕,直到用户按下任意键。
  • createtodo()函数:它包含一个切换案例,询问用户是否要添加ToDo或不使用字符变量(字符c;)。使用printf()询问用户有关另一个输入的信息,并使用scanf()输入用户的选择。
    现在,使用在链表的末尾添加节点的概念来添加节点。在这里两种情况是可能的–
    • 如果不存在任何节点,则在这种情况下,起始点将指向NULL。
    • 如果存在某些节点,在这种情况下,起点将指向第一个节点,并使用指向节点的指针(* add)遍历直到最后一个节点(指针部分中包含NULL)。在这里,动态内存分配(使用calloc() ,这是用于动态分配内存的预定义函数)在运行时分配内存。

在插入过程中,创建了一个新节点,使用gets() (用于输入字符的预定义函数)从用户那里获取数据,在最后添加时,指针部分为NULL,而新创建的节点为通过使用上面解释的遍历概念,可以使链接列表中存在的前一个节点指向。

  • Adjustcount()函数:此函数将考虑链表中节点的编号。使用遍历概念和启动指针的帮助,它将在每次调用时更新每个节点的计数值。
  • deletetodo()函数:使用删除节点的概念,我们要删除ToDos。我们正在询问用户他/她想要删除的节点(通过询问节点的编号)。如果开始为NULL,那么我们将无法删除任何内容,因此可以打印:今天没有TODO。

下面是上述方法的程序:

C
// C program for the above approach
#include 
#include 
  
// Renaming structure to avoid the
// repetitive use of struct keyword
typedef struct ToDo todo;
  
// Declaration of structure
struct ToDo {
    // char array as data part
    char buffer[101];
  
    // Pointer part to access addresses
    todo* next;
  
    // Count variable for counting
    // the number of nodes
    int count;
};
  
// Declare start pointer as null in
// the begining
todo* start = NULL;
  
// Driver Code
int main()
{
    int choice;
    interface();
  
    while (1) {
  
        // Change console color and
        // text color
        system("Color 3F");
  
        // Clear the console
        system("cls");
  
        printf("1. To see your ToDo list\n");
        printf("2. To create new ToDo\n");
        printf("3. To delete your ToDo\n");
        printf("4. Exit");
        printf("\n\n\nEnter your choice\t:\t");
  
        // Choice from the user
        scanf("%d", &choice);
  
        switch (choice) {
  
        // Calling functions defined
        // below as per the user input
        case 1:
            seetodo();
            break;
        case 2:
            createtodo();
            break;
        case 3:
            deletetodo();
            break;
        case 4:
            exit(1);
            break;
        default:
            printf("\nInvalid Choice :-(\n");
            system("pause");
        }
    }
    return 0;
}
  
// Code for Splash screen
void interface()
{
    system("color 4F");
    printf("\n\n\n\n");
    printf("\t~~~~~~~~~~~~~~~~~~~~~"
           "~~~~~~~~~~~~~~~~~~~~~~~~"
           "~~~~~~~~~~~~~~~~~~~~~~~~"
           "~~~~~~~~~~~~~~~~~~~~~~~"
           "~~~~~~~~~~\n");
    printf("\t~~~~~~~~~~~~~~~~~~~~~~"
           "~~~~~~~~~~~~~~~~~~~~~~~"
           "~~~~~~~~~~~~~~~~~~~~~~~"
           "~~~~~~~~~~~~~~~~~~~~~~~~"
           "~~~~~~~~~~\n\n");
    printf("\t} : } : } : } : } : } "
           ": } : } : } :   "
           "WELCOME TO the TODO APP "
           "     : { : { : { : { : { "
           ": { : { : { : {\n\n");
    printf("\t~~~~~~~~~~~~~~~~~~~~~"
           "~~~~~~~~~~~~~~~~~~~~~~~~"
           "~~~~~~~~~~~~~~~~~~~~~~~~~"
           "~~~~~~~~~~~~~~~~~~~~~~"
           "~~~~~~~~~~\n");
    printf("\t~~~~~~~~~~~~~~~~~~~~~~"
           "~~~~~~~~~~~~~~~~~~~~~~~"
           "~~~~~~~~~~~~~~~~~~~~~~~"
           "~~~~~~~~~~~~~~~~~~~~~~~~"
           "~~~~~~~~~~\n");
    printf("\n\n\n\t\t\t\t\t\t\t\"
           "t\t\t\t       "
           "@Sushant_Gaurav\n\n\n\n"
           "\n\n\n\t");
  
    // Pausing screen until user
    // presses any key
    system("pause");
}
  
// To view all the todos
void seetodo()
{
    // Clearing the console
    system("cls");
  
    // Pointer to the node for traversal
    todo* temp;
  
    // temp is made to point the
    // start of linked list
    temp = start;
  
    // Condition for empty linked list
    if (start == NULL)
        printf("\n\nEmpty ToDo \n\n");
  
    // Traverse until last node
    while (temp != NULL) {
  
        // Print number of the node
        printf("%d.)", temp->count);
  
        // Print data of the node
        puts(temp->buffer);
  
        // Clear output console
        fflush(stdin);
  
        // Going to next node
        temp = temp->next;
    }
  
    printf("\n\n\n");
    system("pause");
}
  
// Function to insert a node todo
void createtodo()
{
    // Choose choice from user
    char c;
  
    // Pointers to node
    todo *add, *temp;
    system("cls");
  
    // Infinite loop which will
    // break if "n" is pressed
    while (1) {
  
        printf("\nWant to add new ToDo ??"
               + " Press 'y' for Yes and 'n' "
               + " for No  :-)\n\t\t");
        fflush(stdin);
  
        // Input from user
        scanf("%c", &c);
  
        if (c == 'n')
            break;
        else {
  
            // If start node is NULL
            if (start == NULL) {
  
                // Dynamically allocating
                // memory to the newly
                // created node
                add = (todo*)calloc(1, sizeof(todo));
  
                // Using add pointer to
                // create linked list
                start = add;
                printf("\nType it.....\n");
  
                // Input from user
                fflush(stdin);
                gets(add->buffer);
  
                // As first input so
                // count is 1
                add->count = 1;
  
                // As first node so
                // start's next is NULL
                start->next = NULL;
            }
            else {
                temp = (todo*)calloc(1, sizeof(todo));
                printf("\nType it.....\n");
                fflush(stdin);
                gets(temp->buffer);
  
                // Insertion is at last
                // so pointer part is NULL
                temp->next = NULL;
  
                // add is now pointing
                // newly created node
                add->next = temp;
                add = add->next;
            }
  
            // Using the concept of
            // insertion at the end,
            // adding a todo
  
            // Calling function to adjust
            // the count variable
            adjustcount();
        }
    }
}
  
// Function to delete the todo
void deletetodo()
{
    system("cls");
  
    // To get the numbering of the
    // todo to be deleted
    int x;
  
    todo *del, *temp;
    printf("\nEnter the ToDo's number"
           + " that you want to remove.\n\t\t");
  
    // Checking empty condition
    if (start == NULL)
        printf("\n\nThere is no ToDo"
               + " for today :-)\n\n\n");
    else {
        scanf("%d", &x);
  
        // del will point to start
        del = start;
  
        // temp will point to start's
        // next so that traversal and
        // deletion is achieved easily
        temp = start->next;
  
        // Running infinite loop so
        // that user can delete and
        // asked again for choice
        while (1) {
  
            // When the values matches,
            // delete the node
            if (del->count == x) {
  
                // When the node to be
                // deleted is first node
                start = start->next;
  
                // Deallocating the memory
                // of the deleted node
                free(del);
  
                // Adjusting the count when
                // node is deleted
                adjustcount();
                break;
            }
  
            if (temp->count == x) {
                del->next = temp->next;
                free(temp);
                adjustcount();
                break;
            }
            else {
                del = temp;
                temp = temp->next;
            }
        }
    }
    system("pause");
}
  
// Function to adjust the numbering
// of the nodes
void adjustcount()
{
    // For traversal, using
    // a node pointer
    todo* temp;
    int i = 1;
    temp = start;
  
    // Running loop until last node
    // and numbering it one by one
    while (temp != NULL) {
        temp->count = i;
        i++;
        temp = temp->next;
    }
}


输出:

  • 开机画面:

开机画面#1

  • 可用功能列表

可用功能

  • 用户按2

创建一个新的待办事项

  • 用户按1

见待办事项清单

  • 显示待办事项

显示待办事项

  • 删除待办事项

删除待办事项

  • 删除待办事项后显示待办事项

更改了待办事项清单

  • 用户按下4

退出画面

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”