Načítání string v proceduře – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Načítání string v proceduře – Pascal – Fórum – Programujte.comNačítání string v proceduře – Pascal – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Spuštěný nový filmový web Filmožrouti.cz — vše o Avengers, Pacific Rim, Thor, Star Wars…
borekj0
Duch
12. 4. 2017   #1
-
0
-

Ahoj,
mám problém s mým projektem do školy. Dumám nad tím už tři dny a nejsem schopný si poradit, proto mě napadlo obrátit se na vás. Předem díky za jakoukoli pomoc.

O co jde? Převodník mezi 2, 10 a 16 soustavou. Všechno mi funguje, krom jedné věci - v proceduře nejsem schopný do readln(vstup) cokoliv načíst, pokud 'vstup' není integer. U převodů z 10 to není vůbec potřeba řešit, u 2 se to dá obejít tak, že je načtu do integeru a až potom převedu na string (na ukázku to tak jednou mám a jednou ne), ale u 16 kvůli písmenům nemůžu načítat do integeru, přičemž potřebuje buď do stringu po jednotlivých znacích do charu, a nikdy se tak nedostanu dál. Více viz kód.

program Prevody;
procedure prevodz10do2;  {prevod z desitkove soustavy do dvojkove}
var vysl:string;
vstup:integer;
begin
 writeln('Co chces prevest?');
 readln(vstup);
 vysl:='';
  repeat
   if odd(vstup) then vysl:='1'+vysl     {pomoci lichosti pridavam jednicku nebo nulu}
                 else vysl:='0'+vysl;
   vstup:=vstup div 2;
   until vstup=0;
   writeln;
   writeln('Vysledek je ',vysl);
   readln;
 
end;


procedure prevodz2do10; {prevod z dvojkove soustavy do desitkove}
var pole:array[1..25] of string;
    pole2:array[1..25] of integer;
    vysl,dvojka,i,j:integer;
    vstup:string;
begin
 writeln('Co chces prevest?');
 readln(vstup);
 j:=length(vstup); {zjistim delku}
 writeln(j);
  for i:=1 to j do
  begin
   pole[i]:=vstup[i];;    {do pole ulozim znaky po jednotlivcich}
   val(pole[i],pole2[i]);     {prevedu znaky z pole na cisla}
  end;
 dvojka:=1;
 vysl:=0;
 for j:=i downto 1 do
  begin
   vysl:=vysl+pole2[j]*dvojka;  {nasobim mocniny dvojky 0 nebo jednickou}
   dvojka:=dvojka*2;
  end;
 writeln;
 writeln('Vysledek je ',vysl);
 readln;
end;

procedure prevodz10do16;       {prevod z desitkove do sestnactkove soustavy}
var vysl:string;
zbytek:integer;
vstup:integer;
begin
 writeln('Co chces prevest?');
 readln(vstup);
 if vstup<0 then writeln('Cislo nesmi byt mensi nez 0')
                         else begin
 vysl:='';
 repeat
  zbytek:=vstup mod 16;
   if zbytek>9 then vysl:=chr(zbytek+55)+vysl        {pomoci prevedeni na znaky prevadim na sestnactkovou soustavu}
               else vysl:=chr(zbytek+48)+vysl;
  vstup:=vstup div 16;
 until vstup=0;
 writeln();
 writeln('Vysledek je ',vysl);
 readln;
end;end;

procedure prevodz16do10;         {prevod z sestnactkove do desitkove soustavy}
var vysl,d,i,j:integer;
vstup:char;
pole:array[1..25] of char;
begin
 writeln('Co chces prevest? (pismena pis malym pismenem)');
 writeln();
 readln(vstup);
j:=length(vstup); {zjistim delku}
 writeln(j);
 for i:=1 to j do pole[i]:=vstup[i]; { do pole ulozim znaky po jednotlivcich}
 d:=1;
 vysl:=0;
 for i:=j downto 1 do
  begin
   if ord(pole[i])<58 then  vysl:=vysl+(ord(pole[i])-48)*d                        
                      else  vysl:=vysl+(ord(pole[i])-87)*d;
  d:=d*16;
 end;
 writeln;
 writeln('Vysledek je ',vysl);
 readln();
end;

procedure prevodz16do2; {prevod z sestnactkove soustavy do dvojkove}
var a,d,i,j:integer;
vysl,vstup:string;
pole:array[1..10] of char;
begin
 writeln('Co chces prevest? (pismena pis malym pismenem)');
 i:=0;
 repeat
  i:=i+1;
  read(pole[i]);
 until pole[i]=#13;
 i:=i-1;           {umazu si posledni clen, kde je zapsan enter}
 d:=1;
 a:=0;
 for j:=i downto 1 do
  begin
   if ord(pole[j])<58 then  a:=a+(ord(pole[j])-48)*d  {prevadim na desitkovou pomoci ASCII tabulky}
                      else  a:=a+(ord(pole[j])-87)*d;
   d:=d*16;
  end;
 readln();
 vysl:='';
 repeat
   if odd(a) then vysl:='1'+vysl      {prevadim na dvojkovou postupnym delenim dvema a zjistovanim lichosti}
             else vysl:='0'+vysl;
   a:=a div 2;
 until a=0;
 writeln;
 writeln('Vysledek je ',vysl);
 readln;
 end;

procedure prevodz2do16; {prevod z dvojkove soustavy do sestnactkove soustavy}
var pole:array[1..25] of string;
    pole2:array[1..25] of integer;
    a,dvojka,i,j,zbytek:integer;
    v:longint;
    vstup,vysl:string;
begin
 writeln('Co chces prevest?');
 readln(v);
 str(v, vstup);
 j:=length(vstup);                 {zjistim delku}
 for i:=1 to j do
  begin
   pole[i]:=copy(vstup,i,1);    {do pole ulozim znaky po jednotlivcich}
   val(pole[i],pole2[i]);     {prevedu znaky z pole na cisla}
  end;
 dvojka:=1;
 a:=0;
  for i:=j downto 1 do
   begin                          {prevadim na desitkovou soustavu}
    a:=a+pole2[i]*dvojka;         {pricitam dvojka*(0 nebo 1)}
    dvojka:=dvojka*2;             {nasobim dvojku}
   end;
 vysl:='';
 repeat
  zbytek:=a mod 16;
   if (zbytek>=10) and (zbytek<=15) then vysl:=chr(zbytek+55)+vysl    {prevadim na 16 soustavu, upravuju znaky pomoci ASCII tabulky}
                                    else vysl:=chr(zbytek+48)+vysl;
  a:=a div 16;
 until a=0;
 writeln();
 writeln('Vysledek je ',vysl);
 readln;
end;


var kam,odkud:integer;
begin {hlavni program}
 repeat
 writeln('Z jake soustavy chces prevest? 2=dvojkova, 10=desitkova, 16=hexa, 0=konec');
 readln(odkud);
 if odkud<>0 then begin
                writeln('Do jake soustavy chces prevest? 2=dvojkova, 10=desitkova, 16=hexa');
                readln(kam);
                writeln();
                if (odkud=10) and (kam=2) then prevodz10do2;
                if (odkud=2) and (kam=10) then  prevodz2do10;
                if (odkud=10) and (kam=16) then prevodz10do16;
                if (odkud=16) and (kam=10) then prevodz16do10;
                if (odkud=16) and (kam=2) then prevodz16do2;
                if (odkud=2) and (kam=16) then prevodz2do16;
                writeln();
               end;
until odkud=0;

end.

Zajímavé je, že pokud to není procedura, ale samostatný program, funguje to naprosto v pořádku. Tuším, že to bude mít nějaké úplně triviální řešení, ale nejsem schopný na to přijít. (také je možné, že mám pouze podivnou verzi pascalu a vám to fungovat bude).

Ještě jednou díky za případnou pomoc.

Nahlásit jako SPAM
IP: 31.31.228.–
KIIV
~ Moderátor
+42
God of flame
12. 4. 2017   #2
-
0
-

#1 borekj
Lekce cislo 1:  muzes prevest cokoliv do desitkove soustavy a z desitkove na libovolnou

Na to primo navazuje
Lekce cislo 2: predavani parametru funkci nebo procedure. V tomto pripade by byly lepsi dve funkce:
- prevod do desitkove soustavy. Jako parametr prevezme string a vstupni ciselnou soustavu. Vrati integer nebo longint.
- prevod z desitkove soustavy. Jako parametr prevezme integer nebo longint a vystupni soustavu. Vrati retezec.

Lekce cislo 3: napriklad v linuxu by ses docela nacekal, nez ti enter vygeneruje #13. Jelikoz se pouziva jen #10.

Kdyz zvladnes naimplementovat toto, tak jses uz temer za vodou. Odpadne ti hooodne malej rozsah pro binarni vstup. Funkce nebudou nic vypisovat ani nacitat. Proste dostanou odkud kam. A jeste budes moci prevest napriklad trojkovou na jedenactkovou.

Nahlásit jako SPAM
IP: 94.113.99.–
Program vždy dělá to co naprogramujete, ne to co chcete...
borekj0
Duch
12. 4. 2017   #3
-
0
-

Jak už bývá zvykem, problém jsem vyřešil vzápětí potom, co jsem ho přidal, stačilo přidat uses crt;, v hodinách jsme s tím nikdy nepracovali a proto jsem s tím nebyl zvyklý pracovat.

Každopádně děkuji za pomoc a na vaše nápady se ještě podívám.

Nahlásit jako SPAM
IP: 31.31.228.–
Coaster Racer
~ Anonymní uživatel
1 příspěvek
15. 4. 2017   #4
-
0
-
Nahlásit jako SPAM
IP: 123.16.139.–
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, 7 hostů

Moderátoři diskuze

 

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