---
# System prepended metadata

title: 'Projekt: att göra-listan'
tags: [programmering 1]

---

# Projekt: att göra-listan
###### tags: `programmering 1`

Det här projektet går ut på att bygga ett program som fungerar som en attgöra-lista. Man ska kunna skriva in saker som behöver göras tillsammans med en deadline och sedan markera när de är klara. Målet är att öva på att bygga större program och att öva på att använda klasser och listor.

---

## Programstruktur
Programmet ska bestå av tre stycken klasser
* `TodoItem` som representerar en sak att göra
* `TodoList` som representerar listan av saker att göra
* `Program` som är den vanliga klassen som innehåller main-metoden. Här styrs användarens interaktion med programmet.

### Del 1 `TodoItem`
Klassen `TodoItem` ska innehålla två variabler:
* `description` av typen string
* `isComplete` av typen bool

och två metoder:
* `public void ToggleComplete()` som växlar mellan att saken är färdig eller ej
* `public void DisplayItem()` som skriver ut till consolen innehållet på ett formaterat sätt


### Del 2 `TodoList`
Klassen `TodoList` ska innehålla en variabel
* `allItems` som är en lista av `TodoItem`

och tre metoder:
* `public void CreateNewItem()` som ber användaren om information om en ny att-göra och sedan skapar den och lägger till den i listan. 
* `public void DisplayAllItems()` som skriver ut alla saker i att göra-listan till consolen
* `public void ToggleComplete()` som först skriver ut alla saker i listan, ber användaren skriva in ett index, växlar den sakens status (färdig/inte färdig), och sedan skriver ut listan igen.

### Del 3
Den sista klassen, `Program`, ansvarar för interaktionen mellan användaren och programmet. Main-metoden ska ha följande kod till en början:

```c#
static void Main(string[] args)
{
    TodoList todoList = new TodoList();

    int responseNum = 0;

    while(responseNum != 4)
    {
        Console.WriteLine("Välj ett alternativ");
        Console.WriteLine("1. Skapa ny att göra");
        Console.WriteLine("2. Visa att göra-listan");
        Console.WriteLine("3. Markera färdigt");
        Console.WriteLine("4. Avsluta");


        responseNum = int.Parse(Console.ReadLine());

        if(responseNum == 1)
        {
            todoList.CreateNewItem();
        }
        if (responseNum == 2)
        {
            todoList.DisplayList();
        }
        if (responseNum == 3)
        {
            todoList.ToggleCompleted();
        }



        Console.WriteLine();
        Console.WriteLine();
    }
}
```
## Tidsplan


| Vecka | Column 2 | 
| -------- | -------- |
| 6 | Uppstart och genomgång av projektet     |
| 7 | Eget arbete, feedback från tärningsprojektet |
| 8 | Eget arbete - rekomenderad deadline kod |
| 9 | Sportlov     |
| 10 | Reflektion och rapportskrivning. Slutgiltig deadline.    |

Lämna in koden på codepost.io och rapport på classroom.

## Bedömning
I bedömningen tittar jag på följande saker:
* *Funktionalitet*: hur väl programmet fungerar och gör det som är tänkt
* *Kodstil*: hur välstrukturerad koden är och hur väl den följer standarder för kodsstil
* *Interaktion med användaren*: Hur väl man hanterar input från användaren. Till exempel att det är tydligt vad som kan skrivas in, och att programmet hanterar när användaren skriver in fel.
* *Komplexitet:* om man har implementerat utmaningarna och hur väl man har gjort det. Se nedan. 


## Extra utmaningar
När programmet är färdigt kan man utveckla det på följande sätt. Utmaningarna är ordnade efter svårighetsgrad.


### Utmaning 1
Lägg till en metod `public void RemoveItem()` i `TodoList` som först skriver ut alla saker i listan, ber användaren skriva in ett index och sedan tar bort den saken ur listan. 

### Utmaning 2
Lägg till en metod `public void DisplayNonCompletedItems()` i `TodoList` som bara skriver ut de saker som inte är färdiga. Ändra i main-metoden så att användaren kan välja det här alternativet.

### Utmaning 3
Lägg till en variabel hos `TodoItem` som heter `category` av typen string. Den ska representerar kategorin på att göra-saken, till exempel "skola", "träning", "övrigt". Skapa en även en variabel hos `TodoList` som heter `allCategories` och är en lista av strings. 

Ändra programmet så att när en ny att göra-sak skapas får användaren skriva in en kategori. Kategorin ska då också läggas till i `allCategories`, men bara om det inte redan finns i listan. Använd till exempel `Contains`-metoden. 

Lägg nu till en metod `public void DisplayItemsInCategory()` i `TodoList` som ska be användaren om en kategori och bara skriva ut saker som tillhör den kategorin.

### Utmaning 4
Lägg till en variabel hos `TodoItem` som heter `priority` av typen int. Den ska representeta hur viktig varje att göra-sak är på en skala 1-5. Ändra programmet så att när en ny att göra-sak skapas får användaren skriva in en priority. Ändra även så att priority skrivs ut i metoden `DisplayItem`. 

Lägg nu till en metod `public void DisplaySortedItems()` i `TodoList` som skriver ut att göra-listan sorterad utifrån `priority`. För att kunna använda `Sort`-metoden behöver vi ändra i `TodoItem`:

1. Ändra raden `class TodoItem` till `class TodoItem : IComparable`
2. Lägg till följande metod:

```c#
public int CompareTo(object obj)
{
    if (obj == null) return 1;

    TodoItem otherTodo = obj as TodoItem;
    if (otherTodo != null)
        return -(this.priority.CompareTo(otherTodo.priority));
    else
        throw new ArgumentException("Object is not a Temperature");
}
```

Observera att `Sort` ändrar ordningen i listan. Om vi vill kunna visa den ursprungliga ordningen måste vi alltså först skapa en kopia av listan innan vi sorterar. 
