Nacteni hodnot do pole – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Nacteni hodnot do pole – Pascal – Fórum – Programujte.comNacteni hodnot do pole – Pascal – Fórum – Programujte.com

 

Romanzdk
~ Anonymní uživatel
21 příspěvků
27. 4. 2015   #1
-
0
-

Zdravim, mam problem s nactenim hodnot z textoveho souboru do pole.

Mam textovy soubor, ve kterem jsou dva sloupce oddelene mezerou. V kazdem sloupci je 5 celych cisel.

Jak dostanu tyto dva sloupce do pole, abych s temi hodnotami mohl dale pracovat? Dejme tomu ze chci pak secist vsechny hodnoty ve druhem sloupci.

Dal bych to asi do dvou-indexoveho pole (pole:array[1..2,1..5] of integer), ale pak netusim, jak tam ty hodnoty proste dostat.. Jak nacist hodnoty z textaku a dostat je do pole.

Predem diky vsem za rady.

Nahlásit jako SPAM
IP: 82.100.31.–
Honzc
~ Anonymní uživatel
225 příspěvků
28. 4. 2015   #2
-
0
-
Nahlásit jako SPAM
IP: 93.181.78.–
Romanzdk
~ Anonymní uživatel
21 příspěvků
28. 4. 2015   #3
-
0
-

Ahoj, tak jsem to zkusil pomoci tech matic.. Ale mam nejakou chybu nekde, ale nevidim kde.. Jako vysledek mi vyhodi 0, prestoze v souboru jsou hodnoty:

2000 85
500 -10
10 20

Program by mel secist vsechny hodnoty v prvnim sloupci.. Kde je chyba prosim?

A jeste bych chtel poprosit o komentar k casti od: read(soubor,matice[i,j]); do close(soubor)... Co presne ktery radek dela? Moc diky

program vylet;
const max=100;
type tMatice=array[1..max,1..max] of integer;
     tIndex=1..max;
procedure nacteni(udaje:string; var Matice:tMatice);
var soubor:text;
    i,j:tIndex;
    r,s:integer;
begin
  assign(soubor,'udaje.txt');
  reset(soubor);
  read(soubor,r,s);
  i:=1;
  j:=1;
  while (i<=r) and (i<=max) do
  begin
    while (j<=s) and (j<=max) do
    begin
      read(soubor,matice[i,j]);
      inc(j);
    end;
    j:=1;
    inc(i);
    readln(soubor);
  end;
  close(soubor);
end;

var i,j,r:tIndex;
    matice:tMatice;
    delka_trasy:integer;
begin
for i:=1 to r do
delka_trasy:=matice[i,1]+matice[i+1,1];
writeln(delka_trasy);
readln;
end.
Nahlásit jako SPAM
IP: 82.100.31.–
peter
~ Anonymní uživatel
4016 příspěvků
29. 4. 2015   #4
-
0
-

 V cem se asi lisi tvuj kod od kodu ne te strance? Zkus pouzit tenhle kod a uprav ho o to pocitani a vlastni jmena promennych.


Příklad číslo 2 - Vypsání matice

Zadání:

    Vytvořte proceduru pro vypsání hodnot matice

Algoritmus:


    Procedure PisMatici(var Matice:tMatice;M,N:tIndex);
    {Procedura vypise matici o M sloupcich a N radcich.}
    var i,j:tIndex;
    begin {PisMatici}
      for i:=1 to m do
      begin
        for j:=1 to n do
          write(matice[i,j]:3:0,' ');
        writeln;
      end;
    end; {PisMatici}

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:dc05:25...–
Honzc
~ Anonymní uživatel
225 příspěvků
29. 4. 2015   #5
-
0
-

#3 Romanzdk
1. v hlavním tělu nemáš nikde použitou tu nadefinovanou proceduru nacteni

2. do souboru udaje.txt je potřeba napsat na prvni radek hodnoty r s tedy 3 2 (oddělené mezerou)

3. nevím, ale místo inc použij raději succ(j) succ(j)

4. hlavní tělo by potom mělo vypadat:(včetně deklarace proměnných)

var i,delka_trasy:integer;
    matice:tMatice;
begin

  nacteni('udaje.txt',matice);

  delka_trasy:=0;
  for i:=1 to max do
    delka_trasy:=delka_trasy+matice[i,1];
  writeln(delka_trasy);
  readln;
end.

Nahlásit jako SPAM
IP: 93.181.78.–
Romanzdk
~ Anonymní uživatel
21 příspěvků
29. 4. 2015   #6
-
0
-

Tak jsem to udelal dle vasich rad, ale pri spusteni programu mi to hazi error: exitcode 201, proc? :/

kod vypada takto:

program vylet;

const maxR=100;
      maxS=2;

type tMatice=array[1..maxR,1..maxS] of integer;
     tIndexR=1..maxR;
     tIndexS=1..maxS;

procedure nacteni(udaje:string; var Matice:tMatice);
var soubor:text;
    i:tIndexR;
    j:tIndexS;
    r,s:integer;
begin
  assign(soubor,'udaje.txt');
  reset(soubor);
  read(soubor,r,s);
  i:=1;
  j:=1;
  while (i<=r) and (i<=maxR) do
  begin
    while (j<=s) and (j<=maxS) do
    begin
      read(soubor,matice[i,j]);
      j;=succ(j);
    end;
    j:=1;
    i:=succ(i);
    readln(soubor);
  end;
  close(soubor);
end;

var i,r:tIndexR;
    j,s:tIndexS;
    matice:tMatice;
    delka_trasy:integer;
begin
nacteni('udaje.txt',matice);

delka_trasy:=0;
for i:=1 to r do
delka_trasy:=delka_trasy+matice[i,1];
writeln('Delka trasy bude: ',delka_trasy,'metru');
readln;
end.

Jeste se chci zeptat - k cemu slouzi prikaz v procedure: read(soubor,r,s)?
- proc je v procedure while se dvema argumenty?
- proc je tam succ(i) a succ(j)?

Dekuju moc

Nahlásit jako SPAM
IP: 82.100.31.–
romanzdk0
Newbie
29. 4. 2015   #7
-
0
-

preklep ; u  j;=succ(j); opraven

Nahlásit jako SPAM
IP: 82.100.31.–
JoDiK
~ Anonymní uživatel
987 příspěvků
29. 4. 2015   #8
-
0
-

A v souboru jsou pořád hodnoty:

2000 85
500 -10
10 20

???

Nahlásit jako SPAM
IP: 88.103.228.–
romanzdk0
Newbie
29. 4. 2015   #9
-
0
-

Ano

Nahlásit jako SPAM
IP: 82.100.31.–
romanzdk0
Newbie
29. 4. 2015   #10
-
0
-

Zkousim to bez te procedury, ale podarilo se mi nacist hodnoty ze souboru pouze jako char - nevim jak to udelat jako integer, abych s tim mohl dal pracovat.. Takhle muzu sice to pole vypsat, ale treba ten soucet sloupce neudelam ... Uz zacinam byt zoufaly..

program vylet;
var soubor:text;
    pole:array[1..2,1..100] of char;
    obsah:string;
    i,j:integer;
    delka_trasy:string;
begin
  i:=1;
  j:=1;
  assign(soubor,'udaje.txt');
  reset(soubor);
  repeat
    read(soubor,obsah);
    for j:=1 to length(obsah) do
    begin
      pole[i,j]:=obsah[j];
    end;
    inc(i);
  until eof (soubor);
  
  for j:=1 to 100 do
  delka_trasy:=delka_trasy+pole[1,j];
  writeln(delka_trasy);
end.

Neporadite nejaky jiny zpusob? Nejak rutinne-laicky, bez procedur - Jak proste dat dva sloupce s cisly v souboru do dvouindexoveho pole a pak secist cisla v prvnim sloupci? (to je jen prvni uloha co musim udelat, ostatni ulohy uz snad odvodim od toho)

Nahlásit jako SPAM
IP: 82.100.31.–
JoDiK
~ Anonymní uživatel
987 příspěvků
29. 4. 2015   #11
-
0
-

#10 romanzdk
zoufalý jsi proto, že děláš něco, nevíš co...

buď dopiš jak ti radili do souboru na první řádek počty hodnot, nebo je tam nepiš a za předpokladu, že v souboru bude opravdu vždy jasný počet čísel, tak ten počet zadej v tom svém programu a nesnaž se je číst ze souboru...

Nahlásit jako SPAM
IP: 88.103.228.–
JoDiK
~ Anonymní uživatel
987 příspěvků
29. 4. 2015   #12
-
0
-

#10 romanzdk
z textového souboru se čte úplně stejně jako z klávesnice, takže celá čísla, reálná čísla, znaky i řetězce...

Nahlásit jako SPAM
IP: 88.103.228.–
romanzdk0
Newbie
29. 4. 2015   #13
-
0
-

V souboru budou vzdy 2 sloupce a v kazdem 100 radku => 200 cisel

Nahlásit jako SPAM
IP: 82.100.31.–
JoDiK
~ Anonymní uživatel
987 příspěvků
29. 4. 2015   #14
-
0
-

#13 romanzdk
tak napiš testovací program, kde z toho souboru přečteš jen první číslo a vypiš ho.

pak napiš druhý program, kde přečteš obě čísla z jednoho řádku a obě vypíšeš.

Udělej to hned, jestli s tím chceš poradit...

Nahlásit jako SPAM
IP: 88.103.228.–
romanzdk0
Newbie
29. 4. 2015   #15
-
0
-

Ok, jdu na to

Nahlásit jako SPAM
IP: 82.100.31.–
romanzdk0
Newbie
29. 4. 2015   #16
-
0
-

Takto? Ale je to bez toho pole

program test;
var soubor:text;
    i,j,cisla:integer;
begin
assign(soubor,'udaje.txt');
reset(soubor);
for i:=1 to 2 do
begin
read(soubor,cisla);
write(cisla,' ');
end;
end.
Nahlásit jako SPAM
IP: 82.100.31.–
JoDiK
~ Anonymní uživatel
987 příspěvků
29. 4. 2015   #17
-
0
-

#16 romanzdk
Přeskočil jsi sice první krok, ale budiž....

Předpokládejme, že na každém řádku jsou dvě čísla, která chceme mít pro další zpracování uložená. Tak to uprav tak, že to přečte obě čísla najednou včetně ukončení řádku, pak ty dvě čísla vypiš.

Nahlásit jako SPAM
IP: 88.103.228.–
romanzdk0
Newbie
29. 4. 2015   #18
-
0
-

To asi bohuzel nevim, co presne mam udelat - neni to to same co jsem udelal predtim?

Nahlásit jako SPAM
IP: 82.100.31.–
JoDiK
~ Anonymní uživatel
987 příspěvků
29. 4. 2015   #19
-
0
-

#18 romanzdk
Není, ty jsi přečetl jedno číslo, vypsal a to jsi dvakrát zopakoval, přičemž sis v paměti přepsal tu první hodnotu druhou.

Správné řešení:

program test;
var soubor:text;
    i,j,cislo1,cislo2:integer;
begin
assign(soubor,'udaje.txt');
reset(soubor);
readln(soubor,cislo1,cislo2);
writeln(cislo1,' ', cislo2);
close(soubor);
end.
Nahlásit jako SPAM
IP: 88.103.228.–
JoDiK
~ Anonymní uživatel
987 příspěvků
29. 4. 2015   #20
-
0
-

#18 romanzdk
jo, a nemůže ti to vyhodit 1 1 když v souboru máš přece 2000 85!!!
 

Nahlásit jako SPAM
IP: 88.103.228.–
romanzdk0
Newbie
29. 4. 2015   #21
-
0
-

Ahaaaaaa, jasne... Jojo, to je mi jasny :D... Takze ted to nahazet do pole?

Nahlásit jako SPAM
IP: 82.100.31.–
JoDiK
~ Anonymní uživatel
987 příspěvků
29. 4. 2015   #22
-
0
-

#21 romanzdk
Nespěchej, už ti to háže 2000 85?

Nahlásit jako SPAM
IP: 88.103.228.–
romanzdk0
Newbie
29. 4. 2015   #23
-
0
-

Ano

Nahlásit jako SPAM
IP: 82.100.31.–
JoDiK
~ Anonymní uživatel
987 příspěvků
29. 4. 2015   #24
-
0
-

#23 romanzdk
Tak to čtení pro začátek zopakuj jen třikrát a zkontroluj, že to vypíše první tři řádky ze souboru...

Nahlásit jako SPAM
IP: 88.103.228.–
romanzdk0
Newbie
29. 4. 2015   #25
-
0
-

Ano

program test;
var soubor:text;
    i,j,cislo1,cislo2,cislo3:integer;
begin
assign(soubor,'udaje.txt');
reset(soubor);
for i:=1 to 3 do
begin
readln(soubor,cislo1,cislo2);
writeln(cislo1,' ', cislo2);
end;
close(soubor);
end.
Nahlásit jako SPAM
IP: 82.100.31.–
JoDiK
~ Anonymní uživatel
987 příspěvků
29. 4. 2015   #26
-
0
-

#25 romanzdk
OK.

Teď zaveď pole pro dvě čísla a načti je do něj z prvního řádku a vypiš (jen ty dvě, nic neopakuj)...

Nahlásit jako SPAM
IP: 88.103.228.–
romanzdk0
Newbie
29. 4. 2015   #27
-
0
-

   

program test;
var soubor:text;
    i,j,cislo1,cislo2:integer;
    pole:array[1..2] of integer;
begin
assign(soubor,'udaje.txt');
reset(soubor);
readln(soubor,cislo1,cislo2);
pole[1]:=cislo1;
pole[2]:=cislo2;
writeln(pole[1],' ',pole[2]);
close(soubor);
end.
Nahlásit jako SPAM
IP: 82.100.31.–
JoDiK
~ Anonymní uživatel
987 příspěvků
29. 4. 2015   #28
-
+1
-
Zajímavé

#27 romanzdk
Zvláštní, že

writeln(pole[1],' ',pole[2]);

uděláš a

readln(soubor,pole[1],' ',pole[2]);

nee
 

Nahlásit jako SPAM
IP: 88.103.228.–
JoDiK
~ Anonymní uživatel
987 příspěvků
29. 4. 2015   #29
-
+1
-
Zajímavé

#27 romanzdk
Pokud je v souboru jasně daný počet řádků, tak zaveď dvojrozměrné pole pro všechny řádky a načti to do něj...

Nahlásit jako SPAM
IP: 88.103.228.–
romanzdk0
Newbie
29. 4. 2015   #30
-
0
-

Dobre, pokusim se :D .. A pokud neni jasne definovany pocet radku?

Nahlásit jako SPAM
IP: 82.100.31.–
JoDiK
~ Anonymní uživatel
987 příspěvků
29. 4. 2015   #31
-
+1
-
Zajímavé

#30 romanzdk
Tak bys nepoužil cyklus for ale třeba while, který bude číst řádky dokud nenarazí na konec souboru?

Nahlásit jako SPAM
IP: 88.103.228.–
romanzdk0
Newbie
29. 4. 2015   #32
-
0
-

Ok, moc dekuju, pokusim to dostat do toho dvourozmerneho pole

Nahlásit jako SPAM
IP: 82.100.31.–
JoDiK
~ Anonymní uživatel
987 příspěvků
29. 4. 2015   #33
-
0
-

#32 romanzdk
ty to tam ještě nemáš? jdu spát, tak si nech dařit...

Nahlásit jako SPAM
IP: 88.103.228.–
romanzdk0
Newbie
29. 4. 2015   #34
-
0
-

Ne :D... Mam tohle

program test;
var soubor:text;
    i,j,cislo1,cislo2:integer;
    pole:array[1..4,1..2] of integer;
begin
assign(soubor,'udaje.txt');
reset(soubor);
for i:=1 to 4 do
begin
for j:=1 to 2 do
begin
readln(soubor,pole[i,j],pole[i,j+1]);
writeln(pole[i,j],' ',pole[i,j+1]);
close(soubor);
end;
end;
end.
Nahlásit jako SPAM
IP: 82.100.31.–
romanzdk0
Newbie
29. 4. 2015   #35
-
0
-

Je to takhle spravne?

program test;
var soubor:text;
    i,j,cislo1,cislo2:integer;
    pole:array[1..4,1..2] of integer;
begin
assign(soubor,'udaje.txt');
reset(soubor);
for i:=1 to 4 do
begin
readln(soubor,pole[i,1],pole[i,2]);
writeln(pole[i,1],' ',pole[i,2]);
end;
close(soubor);
end.
Nahlásit jako SPAM
IP: 82.100.31.–
JoDiK
~ Anonymní uživatel
987 příspěvků
29. 4. 2015   #36
-
+1
-
Zajímavé

#35 romanzdk
Jo, to je lepší..

Teď odděl to načítání a vypisování... (2 samostatné cykly)

Pak v tom duhém proveď nějaké výpočty (třeba součet hodnot z prvního sloupce...) a vypiš výsledek

Nahlásit jako SPAM
IP: 88.103.228.–
romanzdk0
Newbie
29. 4. 2015   #37
-
0
-

Super!!! Funguje to!! Moc moc moc dekuju!

program test;
const maxR=4;
var soubor:text;
    i,j,delka_trasy:integer;
    pole:array[1..maxR,1..2] of integer;
begin
assign(soubor,'udaje.txt');
reset(soubor);
for i:=1 to maxR do
begin
readln(soubor,pole[i,1],pole[i,2]);
end;
for i:=1 to maxR do
delka_trasy:=delka_trasy+pole[i,1];
writeln(delka_trasy);
close(soubor);
readln;
end.
Nahlásit jako SPAM
IP: 82.100.31.–
JoDiK
~ Anonymní uživatel
987 příspěvků
30. 4. 2015   #38
-
0
-

#37 romanzdk
To jsem rád. Máš pochvalu za tu konstantu maxR.

Dovol ještě jednu radu, není od věci psát program přehledně - odsazovat bloky, aby na první pohled bylo jasné odkud kam je třeba cyklus, nebo nějaký vnořený blok. Budou se ti pak lépe hledat případné logické chyby.

Takhle nějak to myslím:

program test;
const maxR=4;
var soubor:text;
  i,j,delka_trasy:integer;
  pole:array[1..maxR,1..2] of integer;
begin
  assign(soubor,'udaje.txt');
  reset(soubor);
  for i:=1 to maxR do
    begin
      readln(soubor,pole[i,1],pole[i,2]);
    end;
  for i:=1 to maxR do
    delka_trasy:=delka_trasy+pole[i,1];
  writeln(delka_trasy);
  close(soubor);
  readln;
end.
Nahlásit jako SPAM
IP: 88.103.236.–
romanzdk
~ Anonymní uživatel
21 příspěvků
30. 4. 2015   #39
-
0
-

Jojo, ja to prave vetsinou clenim, ale u tohoto jednoducheho prikladu jsem to jen rychle splacal :D. Diky :)

Nahlásit jako SPAM
IP: 90.182.20.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 5 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý