Diskuze: textový soubor
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 12 zpráv z 12.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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
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.
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);
}
}
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.
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ěď
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
Navíc tam máš těch hodnot nějak hodně, nepřijde mi, že jsou 4.
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.
Zobrazeno 12 zpráv z 12.