Škôlka jazyka C

Fórum o programovaní v jazyku C založené 3. januára 2012

Aktuálny čas je 16 Apr 2024, 12:14

Všetky časy sú v GMT + 1 hodina




Fórum je zamknuté Táto téma je zamknutá, nemôžete posielať nové príspevky alebo odpovedať na staršie.  [ Príspevok: 1 ] 
Autor Správa
PoslaťNapísal: 04 Mar 2012, 09:49 
Offline
Stredoškolák
Stredoškolák
Obrázok užívateľa

Registrovaný: 06 Jan 2012, 19:26
Príspevky: 458
Bydlisko: pod Pátrovom
Udelené body: 228 bodov
Získané body: 21 bodov
1) Vytvorte textový súbor ZNAKY.TXT, v ktorom budú náhodné znaky. Tento súbor čítajte
po znakoch v cykle do-while. Ak je prečítaný znak 'q' (Quit), program ukončite.
Ak je znak '0', vypíšte: Bola to nula
Ak je prečítaný znak '1', vypíšte: Bola to jednicka
Testujte aj OEF a použite switch.
Poznámka:
Súbor ZNAKY.TXT vytvorte za pomoci náhodných čísiel:
(vygeneruje celé čísla v rozsahu 0 - 49)
Spoiler:
Kód:
#include <stdio.h>
#include <time.h> // kniznica potrebna ku generatoru

int main ()
{
  FILE *fw, *fr;
  int i, j, znak;

  /********************************************************
   * generovanie nahodnych cisiel v rozsahu viditelnych znakov ASCII tabulky
   *  a ich zapis do suboru v riadkoch
   ********************************************************/
  srand( time( 0 ) ); // inicializacia generatora nahodnych cisiel
  fw = fopen("POKUS.TXT", "w"); // otvorenie suboru na zapis
  for (i = 0; i < 2000; i++) { // pocet generovanych cisiel
    j = rand()%254 + 1; // generovanie nahodneho cisla v rozsahu 1 - 254
    if (j >= 33 && j <= 254) // vymadzenie viditelnych znakov ASCII tabulky
      fprintf(fw, "%c ", '\0' + j); // uloženie znakov do suboru
    if ((i + 1) % 50 == 0) // ohranicenie konca riadku v subore
      fprintf(fw, "%c", '\n'); // zapis konca riadku do suboru
  }
  fclose(fw); // zavretie suboru

  fr = fopen("POKUS.TXT", "r"); // otvorenie suboru na citanie
  do {
    znak = getc(fr); // cita zo suboru po znakoch
    switch (znak) {
      case ('0'): // ak je nula
        printf("Bola to nula: %c\n", znak);
        break;
      case ('1'): // ak je jedna
        printf("Bola to jednicka: %c\n", znak);
        break;
      case ('q'): // ak je q
        printf("Quit\n");
        return 1; // ukončenie behu programu
    }
  } while (znak = getc(fr), feof(fr) == 0); // podmienka behu cyklu
  printf("V subore nebol znak 'q'.\n");
  fclose(fr); // zavretie suboru

  return 0;
}

2) Vytvorte textový súbor DOPIS.TXT, v ktorom bude niekoľko riadkov z malých,
veľkých písmen a medzier. Tento súbor celý vypíšte na monitor. Súčasne do súboru
KOPIA.TXT zapíšte obsah čítaného súboru, ale malé písmená preveďte na veľké.
Spoiler:
Kód:
#include <stdio.h>

int main(void)
{
  FILE *fr, *fw;
  int c;

  if ((fr = fopen("DOPIS.TXT", "r")) == NULL) { // otvorenie suboru na citanie s kontrolou jeho existencie
    printf("Subor DOPIS.TXT sa nepodarilo otvorit.\n");
  return;        /* ukoncenie programu */
  }
  if ((fw = fopen("KOPIA.TXT", "w")) == NULL) { // otvorenie suboru na zapis s kontrolou jeho existencie
    printf("Subor KOPIA.TXT sa nepodarilo otvorit.\n");
  return;        /* ukoncenie programu */
  }
  while ((c = getc(fr)) != EOF) { // v cykle cita subor po znakoch
    putchar(c); // vypis znakov na obrazovku
    if (c >= 'a' && c <= 'z') // ak su znaky male pismena
      putc(c - 32, fw); // zapis ich do suboru ako velke pismena
    else
      putc(c, fw); // ak znaky nie su male pismena, zapis ich do suboru
  }
  fclose(fr); // zavretie suboru
  fclose(fw); // zavretie suboru

  return 0;
}

3) Napíšte program, ktorý spočíta celkový počet znakov súboru DOPIS.TXT.
Spoiler:
Kód:
#include <stdio.h>

int main(void)
{
  FILE *fr;
  int i = 0, c;

  if ((fr = fopen("DOPIS.TXT", "r")) == NULL) { // otvorenie suboru na citanie s kontrolou jeho existencie
    printf("Subor DOPIS.TXT sa nepodarilo otvorit.\n");
  return;        /* ukoncenie programu */
  }
  while ((c = getc(fr)) != EOF) // v cykle cita subor po znakoch
    i += 1; // pri kazdom cykle zvysi hodnotu i o jedna
  printf("Subor DOPIS.TXT obsahuje %d znakov.\n", i); // vypis poctu znakov v subore
  fclose(fr); zavretie suboru

  return 0;
}

4) Napíšte program, ktorý prečíta PISMENA.TXT po riadkoch. Každý riadok presne opíšte
do súboru KOLKO.TXT a na novom riadku uveďte. koľko malých písmen v riadku bolo.
Spoiler:
Kód:
#include <stdio.h>

int main(void)
{
  FILE *fr, *fw;
  int c, i = 0;

  if ((fr = fopen("PISMENA.TXT", "r")) == NULL) { // otvorenie suboru na citanie s kontrolou jeho existencie
    printf("Subor PISMENA.TXT sa nepodarilo otvorit.\n");
  return;        /* ukoncenie programu */
  }
  if ((fw = fopen("KOLKO.TXT", "w")) == NULL) { // otvorenie suboru na zapis s kontrolou jeho existencie
    printf("Subor KOLKO.TXT sa nepodarilo otvorit.\n");
  return;        /* ukoncenie programu */
  }
  while ((c = getc(fr)) != EOF) { // v cykle cita subor po znakoch
    putc(c, fw); // zapis po znakoch do suboru
    if (c >= 'a' && c <= 'z') // ak je znak male pismeno
      i += 1; // zvacsi sa hodnota i o jedna
    if (c == '\n') { // ak je koniec riadku
      fprintf(fw, "%d pismen a - z\n", i); // zapise do suboru pocet malych pismen v riadku
      i = 0; // vynulovanie i, aby sa pocty z riadkov nenacitavali
    }
  }
  fprintf(fw, "\n%d pismen a - z\n", i); // zapise do suboru pocet malych pismen v poslednom riadku
  fclose(fr); // zavretie suboru
  fclose(fw); // zavretie suboru

  return 0;
}

5) Vytvorte program, ktorý zapíše do súboru CISLA.TXT dvadsať reálnych čísiel,
- násobkov 3.14. Pred každé číslo napíšte znak "$" a každé číslo napíšte na samostatný
riadok. napr.:
$3.14
$6.28
Spoiler:
Kód:
#include <stdio.h>
int main(void)
{
  FILE *fw;
  int i;
  float f;

  f = 3.14;
  if ((fw = fopen("CISLA.TXT", "w")) == NULL) {
    printf("Subor CISLA.TXT sa nepodarilo otvorit.\n");
  return;        /* ukoncenie programu */
  }
  for (i = 1; i <= 20; i++)
    fprintf(fw, "$%.2f\n", f * i);
  if (fclose(fw) == EOF) {
    printf("Subor CISLA.TXT sa nepodarilo zavriet.\n");
  return;
  }
  return 0;
}

6) Čítajte všetky reálne čísla zo súboru CISLA.TXT a vypočítajte ich aritmetický priemer.
Vo funkcii fscanf() vyskúšajte formáty čítania "%f", "%f\n", " %f", " %f\n".
Koniec súboru netestujte pomocou EOF, ale pomocou návratovej hodnoty funkcie fscanf().
Spoiler:
Kód:
#include <stdio.h>
int main(void)
{
  FILE *fr;
  int c;
  float f, g;

  f = g = 0;
  if ((fr = fopen("CISLA.TXT", "r")) == NULL) {
    printf("Subor CISLA.TXT sa nepodarilo otvorit.\n");
  return;        /* ukoncenie programu */
  }
  do {
    while ((c = getc(fr)) == '$')
      ;               /* precita vsetky predchadzajuce znaky $ */
    ungetc(c, fr);    /* vratenie prvej cislice cisla do bufferu */
    fscanf(fr, "%f\n", &f);
    printf("%.2f\n", f);
    g += f;
  } while (!(f >= 3.14 * 19));
  printf("\nAritmeticky priemer realnych cisiel zo suboru CISLA.TXT je %.2f.\n", g / 20);
  if (fclose(fr) == EOF)
    printf("Subor CISLA.TXT sa nepodarilo zavriet.\n");
  return 0;
}

7) Napíšte program, ktorý porovná oblasť súborov PISMENA1.TXT a PISMENA2.TXT
(vytvorte ich napríklad pomocou príkazu operačného systému - copy).
Program vypíše hlásenie:
"Subory su zhodne."
alebo
"Subory sa lisia v x znakoch."
Odlišné znaky priebežne vypisujte.
Spoiler:
Kód:
#include <stdio.h>

int main(void)
{
  FILE *fr, *gr;
  int j, c, d;

  j = 0;
  if ((fr = fopen("PISMENA1.TXT", "r")) == NULL) {
    printf("Subor PISMENA1.TXT sa nepodarilo otvorit.\n");
  return 1;        /* ukoncenie programu */
  }
  if ((gr = fopen("PISMENA2.TXT", "r")) == NULL) {
    printf("Subor PISMENA2.TXT sa nepodarilo otvorit.\n");
  return 1;        /* ukoncenie programu */
  }
  do {
    c = getc(fr);
    d = getc(gr);
    if (c != d) {
      j++;
      printf("%d. %c != %c\n", j, c, d);
    }
  }while (!feof(fr) || !feof(gr));
  if (j > 0)
    printf("\nSubory sa lisia v %d znakoch.\n\n", j);
  else
    printf("\nSubory su zhodne.\n\n");
  if (fclose(fr) == EOF) {
    printf("Subor KOPIA.TXT sa nepodarilo zavriet.\n");
  return 1;
  }
  if (fclose(gr) == EOF) {
    printf("Subor KOPIA.TXT sa nepodarilo zavriet.\n");
  }

  return 0;
}

8) Napíšte program, ktorý sa pokúsi čítať neexistujúci súbor. Zaistite, aby program
vhodne reagoval na túto situáciu.
Spoiler:
Kód:
#include <stdio.h>
int main(void)
{
  FILE *fr;
  int c;

  if ((fr = fopen("BLBOST.TXT", "r")) == NULL) {
    printf("Subor BLBOST.TXT sa v patricnej zlozke nanachadza!\n");
    return 0;
  }
  while ((c = getc(fr)) != EOF)
    putchar(c);
  putchar('\n');
  if (fclose(fr) == EOF)
    printf("Subor BLBOST.TXT sa nepodarilo zavriet");
  return 0;
}

9) Napíšte program, ktorý číta znaky zo súboru PISMENA.TXT a odpisuje ich buď na obrazovku,
alebo do súboru NOVY.TXT. Užívateľ má možnosť si vybrať smer výstupu.
Spoiler:
Kód:
#include <stdio.h>
int main(void)
{
  FILE *fr, *fw;
  int c, d;

  if ((fr = fopen("PISMENA.TXT", "r")) == NULL) {
    printf("Subor PISMENA.TXT sa nepodarilo otvorit");
    return;
  }
  if ((fw = fopen("NOVY.TXT", "w")) == NULL) {
     printf("Subor NOVY.TXT sa nepodarilo otvorit");
    return;
  }
  printf("Vyber si, ci chces obsah suboru PISMENA.TXT vypisat \n"
          "do <s>uboru alebo na <o>brazovku:  ");
  for (;;) {
    d = getchar();
    while (getchar() != '\n')
      ;
    if (d == '0')
      break;
    if (d == 's') {
      while ((c = getc(fr)) != EOF)
        putc(c, fw);
        printf("\nDo suboru NOVY.TXT sa zapisal obsah súboru PISMENA.TXT.\n");
        break;
    }
    if (d == 'o') {
      putchar('\n');
      while ((c = getc(fr)) != EOF)
        putchar(c);
        putchar('\n');
        break;
    }
    if (d != 's' && d != 'o')
      printf("\nZadaj <s>, <o> pre vyber alebo nulu <0> pre ukoncenie!!!\n\n");
  }
  return 0;
}

10) Napíšte program, ktorý vypisuje prirodzené čísla od 1. Po každých 10 číslach vypíše otázku:
"Mam pokracovat ? [A/N] :"
a podľa odpovede sa zariadi.
Spoiler:
Kód:
#include <stdio.h>
int main(void)
{
  int i, c;

  i = 1;
  c = 'A';
  for (;;) {
    if (c != 'A' && c != 'N')
      break;
    printf("%d, ", i);
    if ((i %10) == 0) {
      printf("\n\nMam pokracovat ? [A/N] : ");
      c = getchar();
      while (getchar() != '\n')
        ;
      if (c == 'N') {
        putchar('\n');
        return 0;
      }
      if (c != 'A') {
        printf("\n\nKed nedokazes zadat [A], ukoncujem program!\n");
        return 0;
      }
    }
    i++;
  }
  return 0;
}

11) V súbore CISLA.TXT je na každom riadku jedno celé číslo, ktorému predchádza neznámy
počet znakov "$". Spočítajte tieto čísla a výsledok vypíšte na obrazovku.
Spoiler:
Kód:
#include <stdio.h>
int main(void)
{
  FILE *fr;
  int i, j, c;

  i = j = 0;
  if ((fr = fopen("CISLA.TXT", "r")) == NULL) {
    printf("Subor CISLA.TXT sa neotvoril.\n");
    return;
  }
  while ((c = getc(fr)) != EOF) {
    while ((c = getc(fr)) == '$')
      ;
    ungetc(c, fr);
    fscanf(fr, "%d\n", &i);
    j += i;
  }
  printf("Sucet cisiel zo suboru CISLA.TXT je %d.\n", j);
  if (fclose(fr) == EOF)
    printf("Subor CISLA.TXT sa nepodarilo zavriet.\n");
  return 0;
}

_________________
kódy píšem na platforme: linux Ubuntu 12.04 (Geany, Code::Blocks), WinXP (Code::Blocks, PsPad editor),
Skype: libcokamo, ICQ: 56312279
Ak treba, napíš mi na libcosenior@gmail.com. To mám v mobile a stále po ruke.


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
Zobraziť príspevky z predchádzajúceho:  Zoradiť podľa  
Fórum je zamknuté Táto téma je zamknutá, nemôžete posielať nové príspevky alebo odpovedať na staršie.  [ Príspevok: 1 ] 

Všetky časy sú v GMT + 1 hodina


Kto je on-line

Užívatelia prezerajúci fórum: Žiadny registrovaný užívateľ nie je prítomný a 1 hosť


Rýchla úprava:
Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre
Nemôžete zasielať súbory v tomto fóre

Hľadať:
Skočiť na:  
cron
Powered by phpBB® Forum Software © phpBB Group

Hosted by FreeSpace SK