Nefunguje podmínka if při načítání znaků – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Nefunguje podmínka if při načítání znaků – C / C++ – Fórum – Programujte.comNefunguje podmínka if při načítání znaků – C / C++ – Fórum – Programujte.com

 

Jonasberg
~ Anonymní uživatel
6 příspěvků
28. 4. 2013   #1
-
0
-

Prosil bych o radu:

Vůbec nechápu proč to nefunguje.

Sestavil jsem si takový prográmek, který mi rozháže slova v textu tak, že dá každé slovo na nový řádek. Koncipoval jsem program pro německá slova, podst. jména mají členy der/die/das.  Mělo by to fungovat tak, že pokud je tam člen mělo by být slovo i se členem na jednom řádku.

Posílám tedy kód programu - mužský rod funguje (der), ten jsem pro zjednodušení problematiky vymazal, ten mi funguje.

Střední rod funguje (das), je zde obsažen.

Ženký rod mi nefunguje (die) a nevím proč.

Popis programu:

Program načítá znaky - řádka :   while((zn=getc(sb)) != EOF)

Pokud je zn == nejaký znak - vytiskne ten znak

Pokud je zn == '  ' (mezera) a zároveň pokud je MEZERA == NE, pak odskočí na nový řádek

MEZERA = ANO je tehdy pokud se jedná o mezeru mezi členem a podst. jménem. Pak program udělá pouze mezeru a neodskakuje.

Tato MEZERA = ANO je definována jako:

- program projde prvním cyklem while a někde dole je podmínka if(zn=='d') prvni = zn; pokud je splněna, program si   pamatuje "d"

- ve druhem cyklu narazí na podmínku if(prvni=='d' && (zn=='e' || zn=='i' || zn=='a')) druhy = zn;  - pokud je splněna pamatuje si např. "a"

- ve třetím cyklu narazí na podmínku if(prvni=='d' && druhy=='a' && zn=='s')  treti = zn;  - pokud je splněna pamatuje si "s" - jedná se o střední rod, je to tedy člen a MEZERA = ANO.

Je zajímavé, že je zde úplně stejná podmínka pro die a to nefunguje, princip je úplně stejný. Jestli víte proč, budu rád  

Ještě přikládám obsah souboru slovicka.txt, které program vyžaduje:

lehrnen das Buch lehrnen
das Auto
die Schule
das Auto

Pokud to uložíte do txt. souboru a spustíte, zjistíte že das Auto napíše na jednu řádku a die Schule ne ???

Díky

#include<stdio.h>
#include <string.h>

main() // Pocitani slov, radek a znaku v souboru 1_11.txt
{
 typedef int BOOL;
 const BOOL ANO = 1,NE = 0;      // Definice logickych konstant
 BOOL mezera;                    // Zajistuje aby mezera mezi 2 sloupci
                                 // byla nacitana pouze 1x
 FILE *sb=fopen("slovicka.txt","r"); // Otevreni souboru 1_11.txt
 
 int rd ,sl;                 // rd - radek, sl - sloupec, zn - znak
 char zn, prvni, druhy, treti;
 
 mezera = NE;
 
 while((zn=getc(sb)) != EOF)     // dokud neskonci soubor, nacita znaky
   {
   if(prvni=='d' && druhy=='a' && zn=='s') // -- podminka pro 3. znak --                 
     treti = zn;                           // stredni rod
   if(prvni=='d' && druhy=='i' && zn=='e') // -- podminka pro 3. znak --                 
     treti = zn;                           // zensky rod - nefunguje ??
   
   
   if(prvni=='d' && (zn=='e' || zn=='i' || zn=='a'))                  
     druhy = zn;                           // -- podminka pro 2. znak --
                          
   
   if(zn==' '){           // pise mezeru pokud je splnena podm s/z rodu.
     if (prvni=='d' && druhy=='a' && treti=='s') mezera = ANO;
     if (prvni=='d' && druhy=='i' && treti=='e') mezera = ANO;
     
  
     if (mezera == ANO){
       printf(" ");
       prvni = ' ';
       druhy = ' ';
       treti = ' ';
       mezera = NE;
     }   
      
     else {             // pokud mezera mezi slovy, skoci na novy radek
       printf("\n");
     }   
   }  
   else 
     printf("%c", zn);  
   
   if(zn=='d')
     prvni = zn;                     // -- podminka pro 1. znak --
  }
     
  fclose(sb);
  if ((sb = fopen("slovicka.txt", "r")) == NULL) {
    fprintf(stderr, "Chyba cteni souboru %s\n", "1_11.txt");
  }
}  
Nahlásit jako SPAM
IP: 90.180.63.–
KIIV
~ Moderátor
+43
God of flame
29. 4. 2013   #2
-
0
-

#1 Jonasberg
co to dela kdyz odkomentujes vypisy co mas a vypisujes na konci cyklu:

printf("%c => %c%c%c\n", zn,prvni,druhy,treti);

l => 
e => 
h => 
r => 
n => 
e => 
n => 
  => 
d => d
a => da
s => das
   =>    
B =>    
u =>    
c =>    
h =>    
  =>    
l =>    
e =>    
h =>    
r =>    
n =>    
e =>    
n =>    

 =>    
d => d  
a => da 
s => das
   =>    
A =>    
u =>    
t =>    
o =>    

 =>    
d => d  
i => di 
e => dee
  => dee
S => dee
c => dee
h => dee
u => dee
l => dee
e => dee

 => dee
d => dee
a => dae
s => das
   =>    
A =>    
u =>    
t =>    
o =>    

 =>   

schvalne jestli to uz takhle najdes... ja tam z tohodle vypisu chybu vidim hned

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+43
God of flame
29. 4. 2013   #3
-
0
-

mimochodem sranda bude, az zkusis libovolny slovo, obsahujici der/die/das vevnitr :D   takovy Adidas :D

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jonasberg
~ Anonymní uživatel
6 příspěvků
2. 5. 2013   #4
-
0
-

Jo díky moc.

Nahlásit jako SPAM
IP: 90.180.63.–
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, 33 hostů

Podobná vlákna

Podminka pri nacteni znaku — založil crash40

Podmínka pro NEopakování znaku — založil Mongoloid

Nefunguje Podminka [C#] — založil Mutagen

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ý