Informatika2-2015/Gyakorlat10

A MathWikiből
A lap korábbi változatát látod, amilyen Csirke (vitalap | szerkesztései) 2015. április 24., 14:29-kor történt szerkesztése után volt.

Tartalomjegyzék

10. gyakorlat - C tömbök és karakterláncok

Ezen a gyakorlaton az előző heti előadás anyagát dolgozzuk fel.

Feladatok

Feladatok a CloudCoder-en megtalálhatóak. Ajánlott sorrend:

  • percdij
  • turista
  • szamok
  • eratosztenesz
  • romai

C program és C függvény

Ezen a gyakorlaton, és mostantól, vannak olyan feladatok, ahol nem függvényt, hanem teljes programot kell írni. Ez azt jelenti hogy:

  • a bemenetet nem függvényparaméterként kapod, hanem scanf()-el kell beolvasni
  • a kimenetet nem return-ölni kell, hanem printf()-elni
  • kell lennie main() függvénynek

A main() függvénynek az előadáson említettel ellentétben int kell hogy legyen a visszatérési típusa. (A void is működik, de arra panaszkodik a fordító.) És ezért a végén vissza kell térni 0-val (ami egy egész szám ugye). A 0 azt jelenti hogy hibátlanul lefutott a program, tehát az ilyen feladatoknál a return mindig 0 legyen, ne az amit kiszámoltatok.

percdij

int percdij(int telefon, int hossz) {
    int dijak[] = {20, 35, 12, 7, 78, 44, 31, 19};
    --telefon;
    return dijak[telefon] * hossz;
}

turista

Két lehetséges megoldás is van. Az egyik az, hogy végigmenve a felhőkarcolókon, mindegyikre külön ellenőrizzük, hogy lesz-e még utána magasabb, még egy ciklussal. Ennek a kódja:

#include <stdio.h>
 
int main()
{
    int magassag[10];
    int i, j;
    for(i = 0; i < 10; ++i) {
        scanf("%d", &magassag[i]);
    }
 
    int osszeg = 0;
    for(i = 0; i < 10; ++i) {
        int mindkisebb = 1;
        for(j = i+1; j < 10; ++j) {
            if(magassag[j] >= magassag[i]) {
                mindkisebb = 0;
            }
        }
 
        if(mindkisebb == 1) {
            osszeg += magassag[i];
        }
    }
    printf("%d", osszeg);
 
    return 0;
}

Van egy másik lehetséges megoldás, amire nehezebb rájönni, de könnyebb leprogramozni. Itt visszafelé megyünk végig a felhőkarcolókon, és számontarjuk hogy mekkora volt eddig a legmagasabb. Ha a most következő alacsonyabb annál, akkor nem látszik, és nem kell beszámítani. Ha magasabb annál, akkor be kell számítani, és mostantól az számít a legmagasabbnak. Kódban ez a megoldás így néz ki:

#include <stdio.h>
 
int main()
{
    int magassag[10];
    int i;
    for(i = 0; i < 10; ++i) {
        scanf("%d", &magassag[i]);
    }
 
    int max = 0;
    int osszeg = 0;
    for(i = 9; i >= 0; --i) {
        if(magassag[i] > max) {
            osszeg += magassag[i];
            max = magassag[i];
        }
    }
    printf("%d\n", osszeg);
 
    return 0;
}

szamok

Itt is több lehetséges megoldás van. Szerintem a legegyszerűbb, ha a számok végét keressük csak meg, tehát azokat a helyeket, ahol az aktuális betű egy számjegy, de a következő már nem. Erre kód:

#include <ctype.h>
 
int szamok(const char mondat[]) {
  int i;
  int db = 0;
  for(i = 0; mondat[i]; ++i) {
    if(isdigit(mondat[i]) && !isdigit(mondat[i+1])) ++db;
  }
 
  return db;
}

eratoszthenesz

#include <stdio.h>
 
int main()
{
    int N;
    scanf("%d", &N);
 
    int prime[200];
    int i, j;
    for(i = 0; i < N; ++i) {
      prime[i] = 1;
    }
 
    for(i = 2; i < N; ++i) {
      if(prime[i]) {
        printf("%d ", i);
        for(j = 2*i; j < N; j+=i) {
          prime[j] = 0;
        }
      }
    }
 
    return 0;
}

romai

Ez nem egy szép megoldás, de megírni nekem ezt volt a legegyszerűbb:

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int N;
    scanf("%d", &N);
 
    char ki[20];
    int i = 0;
    while(N >= 1000) {
        ki[i] = 'M';
        ++i;
        N -= 1000;
    }
    if(N >= 900) {
        ki[i] = 'C';
        ki[i+1] = 'M';
        i += 2;
        N -= 900;
    }
    if(N >= 500) {
        ki[i] = 'D';
        i += 1;
        N -= 500;
    }
    if(N >= 400) {
        ki[i] = 'C';
        ki[i+1] = 'D';
        i += 2;
        N -= 400;
    }
    while(N >= 100) {
        ki[i] = 'C';
        i += 1;
        N -= 100;
    }
    if(N >= 90) {
        ki[i] = 'X';
        ki[i+1] = 'C';
        i += 2;
        N -= 90;
    }
    if(N >= 50) {
        ki[i] = 'L';
        i += 1;
        N -= 50;
    }
    if(N >= 40) {
        ki[i] = 'X';
        ki[i+1] = 'L';
        i += 2;
        N -= 40;
    }
    while(N >= 10) {
        ki[i] = 'X';
        i += 1;
        N -= 10;
    }
    if(N >= 9) {
        ki[i] = 'I';
        ki[i+1] = 'X';
        i += 2;
        N -= 9;
    }
    if(N >= 5) {
        ki[i] = 'V';
        i += 1;
        N -= 5;
    }
    if(N >= 4) {
        ki[i] = 'I';
        ki[i+1] = 'V';
        i += 2;
        N -= 4;
    }
    while(N >= 1) {
        ki[i] = 'I';
        i += 1;
        N -= 1;
    }
    ki[i] = 0;
    printf(ki);
 
    return 0;
}
Személyes eszközök