String, cykly - scitani komplex. cisel – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

String, cykly - scitani komplex. cisel – Pascal – Fórum – Programujte.comString, cykly - scitani komplex. cisel – Pascal – Fórum – Programujte.com

 

Packal
~ Anonymní uživatel
12 příspěvků
27. 12. 2014   #1
-
0
-

Zdravim, uz se tu druhy den peru s jednou ulohou, a protoze uz mi pomalu dochazi trpelivost, tak vas prosim o pomoc. Program by mel delat to, ze do nej uzivatel zada soucet/rozdil komplexnich cisel s celociselnymi koeficienty (napr. 3+5i-7-1i+2i+1) a ma se vypsat vysledek operace (v tomhle pripade -3 + 6i).

Prikladam zdrojak a vim, ze je asi neuveritelne slozity az hloupy. Bohuzel mi to programovani nejde a predmet jsem si vubec nemel zapisovat, s cimz ted uz ovsem nic moc nenadelam :).

Krom toho mam u Pascala porad nejake problemy s kompatibilitou, procez si napr. nejsem schopny zprovoznit to "krokovani" v debuggeru, takze sice vim, ze nekde "pretikam" mimo pole, ale nevim kde atd., tak uz to tady zkousim metodou pokus/omyl a vidim, ze to nikam nevede, tak budu rad za kazdou pomoc.

program komplexcis;
uses crt;

const zaklad=10;
var zadane:string;
    i,j,k,mocnina,vysledek1,vysledek2,cislo,cislo2,p:integer;
    prvniakladne:boolean;

begin
clrscr;

  writeln('Zadejte pocetni operaci ve tvaru souctu/rozdilu komplex. cisel s celociselnymi koeficienty ');
  writeln('(napr. 3+5i-7-1i+2i+1): ');
  readln(zadane);

  i:=0;
  if zadane[1]<>'-' then prvniakladne:=true
    else prvniakladne:=false;

  repeat

    mocnina:=1;
    i:=i+1;
    if zadane[i]='-' then begin

      cislo:=0;
      i:=i+1;
      j:=i;
      while (ord(zadane[j])>=ord('0')) and (ord(zadane[j])<=ord('9')) and (j<length(zadane)) do j:=j+1;

      for k:=i to j-1 do begin

        p:=j-1-k;
        mocnina:=1;

        repeat

          mocnina:=zaklad*mocnina;
          p:=p-1;

        until p=0;

        cislo:=cislo+((ord(zadane[k])-ord('0'))*mocnina);

      end;

      i:=j-1;
      if zadane[i]='i' then vysledek2:=vysledek2-cislo
        else vysledek1:=vysledek1-cislo;

    end

    else if (zadane[i]='+') or prvniakladne then begin

      cislo2:=0;
      if not prvniakladne then i:=i+1;
      j:=i;
      while (ord(zadane[j])>=ord('0')) and (ord(zadane[j])<=ord('9')) and (j<length(zadane)) do j:=j+1;

      for k:=i to j-1 do begin

        p:=j-1-k;
        mocnina:=1;

        repeat

          mocnina:=zaklad*mocnina;
          p:=p-1;

        until p=0;

        cislo2:=cislo2+((ord(zadane[k])-ord('0'))*mocnina);

      end;

      i:=j-1;
      if zadane[i+1]='i' then vysledek2:=vysledek2+cislo2
        else vysledek1:=vysledek1+cislo2;

    end;

    prvniakladne:=false;

  until i=length(zadane);

  writeln(vysledek1,' ',vysledek2,'i');


  readln;

end.
Nahlásit jako SPAM
IP: 94.113.222.–
Mircosoft+1
Věrný člen
27. 12. 2014   #2
-
0
-

Doporučoval bych to nakouskovat na dílčí kroky a řešit postupně:
- Úvodní kontrola zadání, vyházení mezer a dopsání plusu na začátek (pokud tam žádné znaménko není).
- Postupné procházení řetězce člen po členu. Každý začíná znaménkem, pak je x číslic a pak buď i, nebo nic (resp. začátek dalšího členu). Zjištění hodnoty čísla pomocí Val.
- Hodnoty bez i přičítat k jednomu výsledku, ty s i do druhého.

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 141.0.8.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Mircosoft+1
Věrný člen
27. 12. 2014   #3
-
0
-

(do zdrojáku jsem moc podrobně nekoukal, na mobilní verzi fóra nejde rozumně scrollovat doprava)

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 141.0.8.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Packal
~ Anonymní uživatel
12 příspěvků
28. 12. 2014   #4
-
0
-

Microsoftovi dekuju za odpoved, nicmene uloha nejspis predpoklada vstup bez mezer, tak se mi nechtelo se s tim otravovat :). S plusem na zacatku jsem se nakonec vyporadal (snad) booleanem a dal jsem uz puvodne (pred napsanim semka) vsechno delal zhruba tak, jak jsi navrhoval, akorat jsem tam mel spoustu chyb.

Nakouskovat reseni do procedur a funkci by asi bylo vic nez zadouci, ale zatim procedury ani funkce neumim :D, tak treba pozdeji.

Nicmene se mi i presto po moc a moc hodinach prace povedlo neco, co vypada aspon trochu funkcne, tak to sem prikladam. Zkoumat to stejne asi nikdo moc nebude vzhledem ke komplikovanosti toho kodu :). 

program kolokv_komplexcis1;
uses crt;

const zaklad=10;
var zadane:string;
    i,j,k,mocnina,vysledek1,vysledek2,cislo,p:integer;
    prvniakladne,komplex:boolean;

begin
clrscr;

  writeln('Zadejte pocetni operaci ve tvaru souctu/rozdilu komplex. cisel s celociselnymi koeficienty ');
  writeln('(napr. 3+5i-7-1i+2i+1): ');
  readln(zadane);

  komplex:=false;
  vysledek1:=0;
  vysledek2:=0;
  i:=0;
  if zadane[1]<>'-' then prvniakladne:=true
    else prvniakladne:=false;

  repeat

    if komplex then i:=i+2
      else i:=i+1;
    if zadane[i]='-' then begin

      cislo:=0;
      i:=i+1;
      j:=i;
      while (ord(zadane[j])>=ord('0')) and (ord(zadane[j])<=ord('9')) and (j<length(zadane)) do j:=j+1;

      if j<length(zadane) then for k:=i to j-1 do begin

        p:=j-1-k;
        mocnina:=1;

        if p>0 then repeat

          mocnina:=zaklad*mocnina;
          p:=p-1;

        until p=0;

        cislo:=cislo+((ord(zadane[k])-ord('0'))*mocnina);

      end

      else for k:=i to j do begin

        p:=j-k;
        mocnina:=1;

        if p>0 then repeat

          mocnina:=zaklad*mocnina;
          p:=p-1;

        until p=0;

        cislo:=cislo+((ord(zadane[k])-ord('0'))*mocnina);

      end;

      i:=j-1;
      if zadane[i+1]='i' then begin

        vysledek2:=vysledek2-cislo;
        komplex:=true;

      end

      else begin

        vysledek1:=vysledek1-cislo;
        komplex:=false;

      end;

      prvniakladne:=false;

    end

    else if (zadane[i]='+') or prvniakladne then begin

      cislo:=0;
      if not prvniakladne then i:=i+1;
      j:=i;
      while (ord(zadane[j])>=ord('0')) and (ord(zadane[j])<=ord('9')) and (j<length(zadane)) do j:=j+1;

      if j<length(zadane) then for k:=i to j-1 do begin

        p:=j-1-k;
        mocnina:=1;

        if p>0 then repeat

          mocnina:=zaklad*mocnina;
          p:=p-1;

        until p=0;

        cislo:=cislo+((ord(zadane[k])-ord('0'))*mocnina);

      end

      else for k:=i to j do begin

        p:=j-k;
        mocnina:=1;

        if p>0 then repeat

          mocnina:=zaklad*mocnina;
          p:=p-1;

        until p=0;

        cislo:=cislo+((ord(zadane[k])-ord('0'))*mocnina);

      end;

      i:=j-1;
      if zadane[i+1]='i' then begin

        vysledek2:=vysledek2+cislo;
        komplex:=true;

      end

      else begin

        vysledek1:=vysledek1+cislo;
        komplex:=false;

      end;

      prvniakladne:=false;

    end;

  until i=length(zadane);writeln;

  write(vysledek1);
  if vysledek2>=0 then write('+');
  write(vysledek2,'i');

  readln;

end.
Nahlásit jako SPAM
IP: 94.113.222.–
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ů

Podobná vlákna

Scitani rady cisel — založil Lusi

Tkinter a cykly — založil Spectator

Zamotane cykly — založil blibli

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ý