Diskuze: textový soubor

C# .NET .NET (C# a Visual Basic) textový soubor American English version English version

Avatar
mudonja
Člen
Avatar
mudonja:

Zdravím potřeboval bych poradit potřebuji načíst z externího souboru nějaké data
Student;ČJ;AJ;MAT;­IT
Jan N;1,1,1,2,3,1­;3,2,1,3,4;2,2,2,3,1,2;1­,2,2,1,1,1
Karel V;3,2,1,3,4;1­,1,1,2,3,1;1,2,2,1,1,1;2­,2,2,3,1,2
a chtěl bych spočítat jejich průměr na tři desetíná místa a data zapsat do nového externího souboru. Můj kod vypadá asi nějak takto
using (StreamReader sr = new StreamReader(@"Znam­ky.txt"))
{
string s;
while ((s = sr.ReadLine()) != null)
{
Console.Write­Line(s);
}
tak tady si vlastně načtu všechny hodnoty ze souboru
using (StreamWriter sw = new StreamWriter(@"Znam­ky.txt"))
{
}
}
a tady nějak potřebuju udělat ten průměr a zapsat do nového souboru a to nevím jak.

 
Odpovědět 25.4.2013 18:47
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na mudonja
Petr Nymsa:

Prosím využij tlačítka kód. Jsem hodný a luštím to po tobě. Pokud umíš načítat / ukládat soubory, měl by jsi umět vypočítat průměr. Předpokládám že tento kód jsi jenom hloupě zkopíroval. Takže si přečti několik článků zde ;). Pokud ti křivdím, tak poradím asi takto. Udělej si třídu Student, kde budeš mít List známek. Každý student bude mít metodu VratPrumer(). Průměr by jsi měl vědět jak se počítá ;) Suma(x) / počet X kde X jsou známky. Textový soubor je uložen v CSV což je paráda. Tj načteš řádek, rozplituješ a víš že první index je jméno, zbylé indexy známky. Zkus si nyní pročíst několik článků a potom ti poradím konkrétněji :)

Nahoru Odpovědět 25.4.2013 18:53
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
pavel31b
Člen
Avatar
pavel31b:

dělám do školy ten stejný program. Ale nějak jsem se zasekl. Vytvořil jsem jsem si zatím jen načtení a uložení souboru, pak jsem si vytvořil novou třídu a snažím se pomocí pole udělat ten List známek. Ale neúspěšně. Mohl bys prosím trochu podrobněji vysvětlit jak to v té třídě udělat. Díky moc.

 
Nahoru Odpovědět 28.4.2013 14:14
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na pavel31b
Petr Nymsa:

Ahoj, využívej tlačítko odpovědět, aby přišlo upozornění :). Hádám že se třídami, metodami a vůbec OOP nemáš zkušenosti. Třídu nazveš nějak vhodně, například Student. Každý Student bude mít jméno a list jeho známek. Dále bude student obsahovat metodu VratPrumer(). V metodě proejdeš cyklem známky a spočítáš průměr (matematika zš).

Každopádně, oba nemáte ponětí co jsou třídy, metody apod , mám pravdu ? Když ti to tady napíšu, bude to fungovat, ale tobě to nic nedá. Ve vlatním zájmu si přečti zdejší články.

class Student
   {
       public string Jmeno { get; private set; }
       public List<int> Znamky { get; private set; }

       public Student(string jmeno, List<int> znamky)
       {
           this.Jmeno = jmeno;
           this.Znamky = znamky;
       }

       public double VratPrumer()
       {
           int soucet = 0;

           foreach (int p in Znamky)
               soucet += p;

           return (double)soucet/Znamky.Count;
       }

       public void PridatZnamku(int znamka)
       {
           Znamky.Add(znamka);
       }
   }
Nahoru Odpovědět 28.4.2013 14:33
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Зайчик
Člen
Avatar
Зайчик:

nemam po ruce IDE pro C# ale tak zkusím něco vymáčknout z hlavy.

// načtení

public class LoadData{
   private List<int> Znamky = new List<int>();
   public LoadData(String path){
      using(System.IO.StreamReader sr = new System.IO.StreamReader(path)){
          while ((string s = sr.ReadLine()) != null){
          Znamky.Add(Int.Parse(s));
          }
       }
    }
    public List<int> getZnamky(){ return Znamky; }

teď třída kde se počítá průměr

public class Prumery(){
    private double prumer = 0;
    public Prumery(List<int> list){
        int pocet = 0, soucet = 0;
        foreach(int i in list){
           soucet += i;
           pocet++;
        }
         prumer = soucet / pocet;
     }

     public double getPrumer() { return prumer;}
}

no a potom už jen nějaká hlavní třída

public class program{
   public static void main(String args[]){
      LoadData load = new LoadData("cesta/k/souboru.txt");
      Prumery prumer = new Prumery(load.getZnamky());
      Console.WriteLine("Vas prumer je : " + prumer.getPrumer());
   }

Pokud by si průměr chtěl zapsat do souboru tak

public class SaveData{
  public SaveData(string path, double prumer){
     using(System.IO.StreamWriter sw = new System.IO.StreamWriter(path)){
        sw.WriteLine(prumer.ToString());
        sw.Flush();
     }
   }

a do main tridy pridame jen řádek

new LoadData("cesta", prumer.getPrumer());

Takhle by to mělo fungovat na známky jednoho člověka ale přispůsobit to pro více lidí nebude problém. Je to vytažené z patra ale myslím, že to bude fungovat.

Nahoru Odpovědět 28.4.2013 14:41
Коммунизм для нашего будущего!
Avatar
mudonja
Člen
Avatar
mudonja:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace Znamky
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Student> students = new List<Student>();
            using (StreamReader sr = new StreamReader("Znamky.txt"))
            {
                string s;
                while ((s = sr.ReadLine()) != null)
                {
                    string[] hodnoty = s.Split(';');
                    string name = hodnoty[0];
                    float cj = VypoctiPrumer(hodnoty[1]);
                    float aj = VypoctiPrumer(hodnoty[2]);
                    float ma = VypoctiPrumer(hodnoty[3]);
                    float it = VypoctiPrumer(hodnoty[4]);

                    students.Add(new Student(name, cj, aj, ma, it));
                }
            }

            using (StreamWriter sw = new StreamWriter("prumer.txt"))
            {
                foreach (Student s in students)
                {
                }
            }
        }

        public static float VypoctiPrumer(string znamky)
        {
            float soucetZnamek = 0;
            string[] cisla = znamky.Split(',');
            int pocetZnamek = 0;

            for (int i = 0; i < cisla.Length; i++)
            {
                soucetZnamek += float.Parse(cisla[i]);
                pocetZnamek++;
            }

            return soucetZnamek / pocetZnamek;
        }
    }
}

Zdravím tak už sem to nějak dodělal ale u

soucetZnamek += float.Parse(cisla[i]);

mi to hází Input string was not in a correct format. Nevím co stím. Soubor ze kterého čte tak je tam uloženo
Student;ČJ;AJ;MAT;­IT
Jan N;1,1,1,2,3,1­;3,2,1,3,4;2,2,2,3,1,2;1­,2,2,1,1,1
Karel V;3,2,1,3,4;1­,1,1,2,3,1;1,2,2,1,1,1;2­,2,2,3,1,2
Prosím o radu. Díky za odpověď

 
Nahoru Odpovědět 4.5.2013 17:13
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na mudonja
David Čápka:

Přeskakuješ ten 1. řádek? :`

Nahoru Odpovědět 4.5.2013 17:14
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
mudonja
Člen
Avatar
mudonja:

Promiň ale nepochopil jsem tě :D

 
Nahoru Odpovědět 4.5.2013 17:17
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na mudonja
David Čápka:

Pokud máš na prvním řádku v tom souboru toto: "Student;ČJ;AJ;MAT;­IT" tak to nemůže fungovat, jelikož jsou tam očekávána čísla ;-)

Nahoru Odpovědět 4.5.2013 17:20
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na mudonja
David Čápka:

Navíc tam máš těch hodnot nějak hodně, nepřijde mi, že jsou 4.

Nahoru Odpovědět 4.5.2013 17:22
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
mudonja
Člen
Avatar
mudonja:

Jo aha takže to jen vynechám, ale i potom my to nedělá to co by mělo, nic se nestane spustím program ale nevypočítá ten průměr a nezapíše do souboru. Takže pořád tam je někde chyba ;)

 
Nahoru Odpovědět 4.5.2013 17:22
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na mudonja
David Čápka:

Ona tam není chyba, ono tam něco chybí. A navíc nechápu, proč máš na řádku 10 známek a pak načteš jen 4.

Nahoru Odpovědět 4.5.2013 17:28
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.