Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 08. 04. 2010 21:22

MARTZ
Zelenáč
Příspěvky: 2
Reputace:   
 

C - ukoly - prosím o radu

Zdravim, chtěl bych vás poprosit o radu s dvouma úkoly. Jako nováček v programování v jazyce C ( před dvouma měsícema mi začal tento předmět) jsem dostal ve škole tyto dva úkoly :

1)
Napište program, který zjistí počet slov v souboru.

    * Slova jsou oddělena mezerami, tabulátory nebo konci řádků
    * Pozor, mezi slovy může být více oddělovačů!
------------------------------------------------------------------------------

Pomocí jednoho návodu z učebnice o programování jsem vytvořil program, který spočítá počet znaků v souboru, jenže nemohu přijít na to, jak udělat, aby to spočítalo místo znaků slova dle zadání úkolu. Nevíte prosim vás, jak toho docílit ?

Zde je kód :

Code:

#include <stdio.h>

int main(int argc, char * argv[])
{
  FILE *fr;
  int c;
  long pocet = 0;               /* pocet znaku v souboru */

  if ((fr = fopen("PISMENA.TXT", "r")) == NULL) {
    printf("Soubor PISMENA.TXT se nepodarilo otevrit\n");
    system("PAUSE");
    return;
  }

  while ((c = getc(fr)) != EOF)
    pocet++;

  printf("V souboru PISMENA.TXT je %ld slov \n", pocet);

  if (fclose(fr) == EOF)
    printf("Soubor PISMENA.TXT se nepodarilo uzavrit\n");
    
    system("PAUSE");
    return 0;
}

---------------------------------------------------------------------------------------------

a tady mám zadání druhého úkolu :

2)
Napište program, který:

    *
      Načte číslo (od 1 do 254) – bude použito jako klíč
    *
      Načte slovo
    *
      Zašifruje slovo Césarovou šifrou se zadaným klíčem
    *
      Pozor na znak '\0'!
--------------------------------------------------------------------------------------------

Opět prvně jsem si zkusil poradit sám, ale tenhle úkol mi příde pro začátečníka dosti záludnej.
Hledal jsem všude možně na internetu a dal jsem dohromady zatim toto, když zadám písmeno tak ho to zašifruje, ale bohužel nevím jak docílit funkcím dle zadání.
Zde je kód:

Code:

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

char *abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // nacteni pismen

int subst(char x); 

int main(void)
{
    char key;
    int key2;
    

    printf("Zadejte jedno pismeno \n");
    scanf("%c", &key);
    
    key = toupper(key); 
    key2 = subst(key); 
    
    printf("%d\n", key2);
    system("PAUSE");
    return 0;
}

int subst(char x)
{
    int out, i, len;    
    len = strlen(abc); //
    
    for((i = 0); (i < len); i++)
    {
        if(abc[i] == x)
        {
            out = i;
        }
    
    }
    
    return out;
}

---------------------------------------------------------------------

Moc děkuji za pomoc s vyřešením těchto úloh a doufám, že nevádí, že jsem do jednoho tématu vložil dvě úlohy. Děkuji

Offline

  • (téma jako vyřešené označil(a) byk7)

#2 09. 04. 2010 00:51

septolet
Příspěvky: 334
Reputace:   
 

Re: C - ukoly - prosím o radu

Ahoj.

1) V tom cyklu while postupně proměnnou c projde celý obsah souboru, hezky znak po znaku. Zkus si tedy v tomto cyklu napsat nějaké podmínky, tz. pokud je v proměnné c znak, tak chceš udělat to a to a pokud je tam mezera, tabulátor tak zase chceš započítat nové slovo. Pak už je jen krůček k tomu, aby program správně fungoval i v případě, že slova jsou oddělena např. více mezerami.

2) Potřebuješ nějaký řetězec, kam si načteš zadané slovo. V C se řetězec implementuje jako pole charů. Pak v nějakém cyklu budeš procházet to načtené slovo (tedy to pole charů, řetězec) a každé písmenko zašifruješ.

Ještě bych měl takové doporučení. Nepoužívej system("PAUSE");, nevím kde konkrétně se toto učí, ale je to funkce závislá na API konkrétního OS, navíc se tím volá jiný program a to všechno jen kvůli tomu, aby náš program počkal na stisk libovolné klávesy. Dále pokud nastane situace, kdy by program neměl dále pokračovat, tak se většinou vrací hodnota 1, pokud program skončí dle očekávání, tak se vrací 0.

Zkus nad tím ještě popřemýšlet, třeba ti ty moje řeči trochu pomohly. Kdyby ne, tak se tu určitě najde někdo, kdo ti to celé napíše, případně ti to napíšu zítra já (ale stejně si myslím, že by bylo dobré, abys to zvládnul sám).

Offline

 

#3 09. 04. 2010 14:49

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: C - ukoly - prosím o radu

↑ septolet:

Nepoužívej system("PAUSE");,

Není to u tady těch mini programů do školy jedno? Stejně to asi nebude používat jinde než na windowsech a kdyby jo tak jednoduše přidá nějakou podmínku kdy to má skončit.

Nás to tedy učily používat, na SŠ i VŠ také, a nikdo mi ještě neřekl, aby to nepoužívala.


Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

#4 09. 04. 2010 14:56

septolet
Příspěvky: 334
Reputace:   
 

Re: C - ukoly - prosím o radu

Není to u tady těch mini programů do školy jedno?

To mi přijde stejné, jako prohlásit, že určovat podmínky u výrazů (jmenovatel různý od 0, etc.) je zbytečné, protože to jsou proboha jen mini příklady do školy. Mě osobně navíc přijde logické, že prostě program skončí, když provede všechno co má (nebo nemá :-)), proč by ještě měl čekat na vstup uživatele, když už stejně nebude nic vykonávat. Když už jednou píšu console application, tak to v té konzoli mám také spouštět a ne takto pochybně zabraňovat ukončení programu jen proto, abych si přečetl výsledky.

Offline

 

#5 09. 04. 2010 21:22

MARTZ
Zelenáč
Příspěvky: 2
Reputace:   
 

Re: C - ukoly - prosím o radu

Septolet: moc děkuji za rady, zejtra se to pokusím zprovoznit a napisu, jestli to funguje ;) ještě jednou díky:)

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson