Projektorji

Projektorji

Avtor: Matic Pogladič

Prva prosojnica

Besedilo naloge: Projektorji Peter organizira veliko konferenco, na kateri bodo predavanja potakala v 7 dvoranah hkrati, v vsaki dvorani pa se bo zvrstilo po 12 predavanj. Časi predavanj so v vseh dvoranah enaki. Vsak izmed predavateljev je povedal, v kateri dvorani in ob katerih urah potrebuje projektor. Tajnica Mici je podatke zbrala in jih zapisala v tekstovno datoteko. V vsaki vrstici je zapis oblike m:n, ki pomeni, da je v dvorani m ob n -ti uri potreben projektor . Napiši program, ki bo te podatke prebral in izpisal navodila Petru, koliko projektorjev potrebuje in kako naj jih razporedi.

Vnesi ime datoteke: podatki.txt

Potrebujemo 5 projektorjev.

1. Projektor:

Dvorana 1: 3-4, 6

Dvorana 4: 2, 5-9, 10

2. Projektor:

Dvorana 2: 1, 3-5

Dvorana 3: 2, 4, 6-11

Ideja rešitve

Problem bom rešil tako, da bom na začetku preštel koliko projektorjev se sploh potrebuje. To bom storil tako, da bom preveril največkratno ponovitev ure. Nato bom ustvaril seznam seznamov. Vsak projektor bo torej imel seznam dolžine 12, kjer so indeksi ure, kadar potrebujemo projektor. Ta seznam bom inicializiral z nevtralnimi nizi. Potem bom napolnil te sezname s ustreznimi elementi, kjer bodo prvi indeksi predstavljali zaporedni projektor in drugi indeksi ure. Na koncu bom to še ustrezno izpisal.

Koda v C#

Koda v razredu Funkcije:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace funkcije
{
    public class FunkcijeProjektorji
    {

        /// <summary>
        /// Funkcija generira naključne podatke in jih shrani v datoteko
        /// </summary>
        /// <param name="imeDatoteke"></param>
        static public void nakljucnaDatoteka(string imeDatoteke)
        {
            //pot datoteke
            imeDatoteke = Environment.CurrentDirectory + "\\" + imeDatoteke;

            Random gen = new Random();

            //pisanje na datoteko
            using (StreamWriter sw = new StreamWriter(imeDatoteke))
            {
                for (int i = 1; i < 8; i++)
                {

                    for (int j = 1; j < 13; j++)
                    {

                        int projektor = gen.Next(gen.Next(10));

                        if (projektor == 1)
                        {
                            sw.WriteLine("" + i + ":" + j);
                        }
                    }

                }
            }

        }

        /// <summary>
        /// Metoda izpiše v konzolo koliko projektorjev je potrebnih, kje jih potrebujejo in kdaj jih potrebujejo
        /// </summary>
        /// <param name="imeDatoteke"></param>
        static public void izpisProjektorjev(string imeDatoteke)
        {
            imeDatoteke = Environment.CurrentDirectory + "\\" + imeDatoteke;

            //seznam, ki bo vseboval vsako vrstico kot en element, ki bo seznam dolžine 2
            List<string[]> vrstice = new List<string[]>();

            //List<string> projektorji = new List<string>();


            //branje iz datoteke
            using (StreamReader r = new StreamReader(imeDatoteke))
            {
                int StProjektorjev = 0;
                int pomozni = 0;

                string line;

                //list "vrstice" napolni z vrsticami
                while ((line = r.ReadLine()) != null)
                {
                    vrstice.Add(line.Split(':'));
                }

                //število projektorjev
                for (int i = 1; i < 13; i++)
                {
                    pomozni = 0;

                    foreach (var item in vrstice)
                    {
                        if (int.Parse(item[1]) == i)
                        {
                            pomozni++;
                        }

                    }

                    if (pomozni > StProjektorjev)
                    {
                        StProjektorjev = pomozni;

                    }
                }

                //seznam seznamov projektorjev

                string[][] seznamProjektorjev = new string[StProjektorjev][];

                for (int i = 0; i < seznamProjektorjev.Length; i++)
                {
                    //vsak podseznam ima dolžino 12, kar predstavlja ure, ko se rabi projektor
                    seznamProjektorjev[i] = new string[12];

                    //seznam se napolni s stringi "0:0"
                    for (int j = 0; j < 12; j++)
                    {
                        seznamProjektorjev[i][j] = "0:0";
                    }

                }

                //za vsako vrstico, gre čez seznam vseh seznamov v "seznamProjektorjev"
                foreach (var item in vrstice)
                {

                    foreach (var j in seznamProjektorjev)
                    {
                        //position
                        bool znotraj = false;

                        //gre čez vse ure
                        for (int i = 0; i < 12; i++)
                        {
                            //vstavi v seznamprojektorjev stringe oblike n:m
                            if (j[int.Parse(item[1]) - 1] == "0:0")
                            {
                                j[int.Parse(item[1]) - 1] = "" + item[0] + ":" +item[1];
                                znotraj = true;
                                break;

                            }


                        }

                        if (znotraj == true)
                        {
                            znotraj = false;
                            break;

                        }


                    }
                }

                //izpis za število projektorjev
                switch (StProjektorjev)
                {
                    case 1:
                        Console.WriteLine("Potrebujemo " + StProjektorjev + " projektor.");
                        break;
                    case 2:
                        Console.WriteLine("Potrebujemo " + StProjektorjev + " projektorja.");
                        break;
                    case 3:
                        Console.WriteLine("Potrebujemo " + StProjektorjev + " projektorje.");
                        break;
                    case 4:
                        Console.WriteLine("Potrebujemo " + StProjektorjev + " projektorje.");
                        break;

                    default:
                        Console.WriteLine("Potrebujemo " + StProjektorjev + " projektorjev.");
                        break;
                }


                for (int i = 0; i < seznamProjektorjev.Length; i++)
                {

                    //v tabeli je vrednost elementa predavalnica in indeks je ura
                    int[] tab = new int[12];

                    //izpis tekočega projektorja
                    Console.WriteLine("" + (i+1) + ". projektor:");

                    //tabela tab se polni z ustreznimi številkami, ki pomenijo predavalnice
                    for (int j = 0; j < seznamProjektorjev[i].Length; j++)
                    {
                        if (seznamProjektorjev[i][j] == "0:0")
                        {

                            tab[j] = 0;

                        }
                        else
                        {
                            tab[j] = int.Parse(seznamProjektorjev[i][j].Split(':')[0]);
                        }
                    }

                    //za vsako dvorano
                    for (int l = 1; l < 7; l++)
                    {

                        //v seznamu so indeksi ure in vrednosti so dvorane
                        int[] seznam = new int[12];


                        for (int m = 0; m < tab.Length; m++)
                        {
                            if (l == tab[m])
                            {
                                seznam[m] = l;
                            }
                        }



                        //lista "test" se napolni z indeksi, ki pomenijo ure
                        List<int> test = new List<int>();



                        //samo izpis
                        for (int z = 0; z < seznam.Length; z++)
                        {
                            if (seznam[z] != 0)
                            {
                                test.Add(z+1);
                            }
                        }

                        if (test.Count > 0)
                        {
                            //izpis zaporedne dvorane, če ima kakšno uro, kadar rabi projetor
                            Console.WriteLine("Dvorana " + l + ": ");

                            //ustrezen izpis
                            string izpis = "";

                            for (int j = 0; j < test.Count; j++)
                            {

                                //če je prvi element, ga doda k izpisu
                                if (j == 0)
                                {
                                    izpis += test[j];

                                    //če je dolžina 1, se zanka konča takoj
                                    if (test.Count == 1)
                                    {
                                        break;
                                    }

                                    //če je drugi element za eno večji od prvega, se k izpisu doda "-"
                                    if (test[0] + 1 == test[1])
                                    {
                                        izpis += "-";
                                    }

                                    //drugače se doda vejica
                                    else
                                    {
                                        izpis += ",";
                                    }
                                }


                                //če element ni prvi in zadnji
                                if (j > 0 && j < test.Count -1)
                                {
                                    //če je zadnji znak v izpisu vejica, se število pripiše in glede na naslednji element se doda "," ali "-"
                                    if (izpis[izpis.Length - 1] == ',')
                                    {
                                        izpis += test[j];

                                        if (test[j + 1] == test[j] + 1)
                                        {
                                            izpis += "-";
                                        }
                                        else
                                        {
                                            izpis += ",";
                                        }
                                    }

                                    //če je zadnji znak "-" in naslednji ni za eno večji, se dopiše in doda vejica
                                    else if (izpis[izpis.Length - 1] == '-' && test[j] + 1 != test[j + 1])
                                    {
                                        izpis += test[j] + ",";
                                    }
                                }

                                //če je zadnji element se ga doda
                                if (j == test.Count -1 && test.Count > 1)
                                {
                                    izpis += test[j];
                                    break;
                                }

                            }

                            //izpis za tekočo dvorano
                            Console.WriteLine(izpis);
                        }
                    }

                }

            }



        }


    }
}

Koda v glavnem programu:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using funkcije;

namespace projektorji
{
    class Program
    {
        static void Main(string[] args)
        {
            FunkcijeProjektorji.nakljucnaDatoteka("podatki.txt");

            FunkcijeProjektorji.izpisProjektorjev("podatki.txt");

            Console.ReadKey();
        }
    }
}

Testni primeri

0%
0%