Tehetséggondozás az informatikában

Tesztverseny (inf_e_20170515_m_04)

A feladat egy megoldása C# nyelven:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace tesztverseny
{
    class Program
    {
        struct versenyzo
        {
            public string kod;
            public string megoldas;
            public int pont;
        }
        static void Main(string[] args)
        {
            versenyzo[] v = new versenyzo[500];

            Console.WriteLine("1. feladat: Az adatok beolvasása");

            FileStream be = new FileStream("valaszok.txt", FileMode.Open);
            StreamReader olvaso = new StreamReader(be);

            string helyes = olvaso.ReadLine();

            int n = 0;

            while (!olvaso.EndOfStream)
            {
                string[] sor = olvaso.ReadLine().Split(' ');
                n++;
                v[n].kod = sor[0];
                v[n].megoldas = sor[1];
            }
            olvaso.Close();
            be.Close();

            Console.WriteLine("2. feladat: A vetélkedőn {0} versenyző indult", n);

            Console.Write("3. feladat: A versenyző azonosítója = ");
            string az = Console.ReadLine();

            string valasz = "";
            for (int i = 1; i <= n; i++)
                if (v[i].kod == az)
                {
                    Console.WriteLine("{0} (a versenyző válasza)", v[i].megoldas);
                    valasz = v[i].megoldas;
                }

            Console.WriteLine("4. feladat");
            Console.WriteLine("{0} (a helyes megoldás)", helyes);

            string ert = "";
            for (int j = 0; j <= 13; j++)
                if (valasz[j] == helyes[j])
                    ert = ert + '+';
                else ert = ert + ' ';
            Console.WriteLine("{0} (a versenyző helyes válaszai)", ert);

            Console.Write("5. feladat: A feladat sorszáma = ");
            int fel = int.Parse(Console.ReadLine());

            double db = 0;
            for (int i = 1; i <= n; i++)
                if (v[i].megoldas[fel - 1] == helyes[fel - 1]) db++;

            double szazalek = db / n * 100;
            Console.WriteLine("A feladatra {0} fő, a versenyzők {1:00.00}%-a adott helyes választ.",
                db, szazalek);

            Console.WriteLine("6. feladat: A versenyzők pontszámának meghatározása");

            FileStream ki = new FileStream("pontok.txt", FileMode.Create);
            StreamWriter iro = new StreamWriter(ki);

            int[] pontok = new int[14] {3,3,3,3,3,4,4,4,4,4,5,5,5,6};

            for (int i = 1; i <= n; i++)
            {
                for (int j = 0; j <= 13; j++)
                    if (v[i].megoldas[j] == helyes[j])
                        v[i].pont = v[i].pont + pontok[j];
                iro.WriteLine("{0} {1}", v[i].kod, v[i].pont);
            }

            iro.Close();
            ki.Close();

            Console.WriteLine("7. feladat: A verseny legjobbjai:");

            for (int i = 1; i <= n - 1; i++)
                for (int j= i + 1; j <= n; j++)
                    if (v[i].pont < v[j].pont)
                    {
                        versenyzo x;
                        x = v[i];
                        v[i] = v[j];
                        v[j] = x;
                    }
            int max = v[1].pont;
            int k = 1;
            while (v[k].pont == max)
            {
                Console.WriteLine("1. díj ({0} pont): {1}", max, v[k].kod);
                k++;
            }
            int max2 = v[k].pont;
            while (v[k].pont == max2)
            {
                Console.WriteLine("2. díj ({0} pont): {1}", max2, v[k].kod);
                k++;
            }
            int max3 = v[k].pont;
            while (v[k].pont == max3)
            {
                Console.WriteLine("3. díj ({0} pont): {1}", max3, v[k].kod);
                k++;
            }            
            Console.ReadKey();
        }
    }
}
A feladat megoldása Excel-ben: tesztverseny.xlsx.

A beolvasott szövegfájl tartalma az A és B oszlopban a 2. sortól kezdve található.
A feladatok megoldását megadó függvények a következők:

2. feladat: A versenyzők száma
E3 cellában: =DARAB2(A:A)-1

3. feladat:
A versenyző azonosítója
E6 cellába: a versenyző kódjának beírása
A versenyző válasza
E7 cellában: =INDEX(B3:B305;HOL.VAN(E6;A3:A305;0))

4. feladat:
A helyes megoldás:
E10 cellában: =A2
A versenyző helyes válaszai:
G10:T10 feltöltése 1..14-ig
G11:T11-ig a cellában + helyes megoldás esetén, különben üres, G11 cellában: =HA(KÖZÉP($E7;G10;1)=KÖZÉP($E10;G10;1);"+";" ")
A versenyző helyes válaszai:
E11 cellában: =ÖSSZEFŰZ(G11;H11;I11;J11;K11;L11;M11;N11;O11;P11;Q11;R11;S11;T11)

5. feladat:
A feladat sorszáma:
E14 cellába: a feladat sorszámának beírása
V segédoszlopban 1, ha a versenyző helyes megoldást adott a feladatra, különben 0, V3 cellában: =HA(KÖZÉP(B3;E$14;1)=KÖZÉP(E$10;E$14;1);1;0)
A helyes válaszok száma:
E15 cellában: =SZUM(V3:V305)
százaléka:
E16 cellában: =E15/E3

6. feladat: A versenyzők pontszáma
X1:AK305 segédoszlopokban:
az 1. sorban a feladatok sorszáma, a 2. sorban a feladatok pontszáma, a 3. sortól soronként az adott versenyző adott feladatokban elért pontszámai, X3-ban: =HA(KÖZÉP($B3;X$1;1)=KÖZÉP($E$10;X$1;1);X$2;0)
AL, AM oszlop adja a pontok.txt fájlba írandó adatokat,
AL3 cellában: =A3
AM3 cellában: =SZUM(X3:AK3)

7. feladat: A verseny legjobbjai
1. díj:
E24 cellában: =MAX(AM3:AM305)
az 1. helyezést elérő(k) kiválasztása irányított szűrővel, listatartomány: $X$2:$AM$305, szűrőtartomány: $E$23:$E$24, hova másolja: $F$23
2. díj:
E26 cellában: =NAGY(AM3:AM305;2)
a 2. helyezést elérő(k) kiválasztása irányított szűrővel, listatartomány: $X$2:$AM$305, szűrőtartomány: $E$25:$E$26, hova másolja: $F$25
3. díj:
E29 cellában: =NAGY(AM3:AM305;4) (mivel 2 második helyezettet adott az irányított szűrő)
a 3. helyezést elérő(k) kiválasztása irányított szűrővel, listatartomány: $X$2:$AM$305, szűrőtartomány: $E$28:$E$29, hova másolja: $F$28

A megoldás képernyőképe: