C
Completing tasks
Learn to update task status with CompleteTask.
The complete_task function
To mark a task as completed we write the complete_task function. It sets the done field of the task to 1.
void complete_task(struct Task tasks[], int id) {
tasks[id - 1].done = 1;
}
We use id - 1 because ids start at 1 but array indices start at 0. So we convert the 1-based id into a 0-based index.
1-based id, 0-based index
Task ids start at 1 (the first task has id 1). But C arrays start at 0. So we write tasks[id - 1] to convert the 1-based id into a 0-based index.
complete_task(tasks, 1); /* tasks[0].done = 1 */
complete_task(tasks, 2); /* tasks[1].done = 1 */
This split reconciles user-friendly ids with array access. The user types 1, the program uses 0-based.
Exercise Add the complete_task function
Add the void complete_task(struct Task tasks[], int id) function to the code below. Inside it write tasks[id - 1].done = 1;. In main add a complete_task(tasks, 1); call before the list_tasks call (to complete the first task). Output should be 1 Shopping 1 and 2 Sport 0.
Show example solution
#include <stdio.h>
#include <string.h>
struct Task {
int id;
char title[50];
int done;
};
int add_task(struct Task tasks[], int count, const char *title) {
tasks[count].id = count + 1;
strcpy(tasks[count].title, title);
tasks[count].done = 0;
return count + 1;
}
void list_tasks(struct Task tasks[], int count) {
for (int i = 0; i < count; i++) {
printf("%d %s %d\n", tasks[i].id, tasks[i].title, tasks[i].done);
}
}
void complete_task(struct Task tasks[], int id) {
tasks[id - 1].done = 1;
}
int main(void) {
struct Task tasks[10];
int count = 0;
count = add_task(tasks, count, "Shopping");
count = add_task(tasks, count, "Sport");
complete_task(tasks, 1);
list_tasks(tasks, count);
return 0;
}
Test yourself
-
Match completion concepts
- done = 1
- completed
- done = 0
- pending
- id - 1
- array index
- tasks[i]
- task array
-
How do you mark a task as completed?
- tasks[i].id = 1
- tasks[i].title = "done"
- tasks[i].done = 1
- tasks[i] = NULL
Show answer
tasks[i].done = 1 — Setting the done field to 1 marks the task as completed.
-
Mark as done
tasks[id].____; /* mark task as completed */
Show answer
tasks[id].done = 1; /* mark task as completed */
Next lesson: Putting it together