Clasa a V-a lecția 7 - 05 oct 2019

From Algopedia
Jump to navigationJump to search

Anunțuri

  • Lecția numărul 6 a avut niște informații neconcordante. Am adus modificări, nu vă alarmați.
  • Anunțul cu grupul de email a fost pus din greșeală la acea lecție, urma să fie disponibil pentru această lecție. Dacă nu ați primit răspuns, este normal, nu aveți acces la Clubul Curioșilor.

Grup de discuții

Grupul de informatică al grupelor de informatică de clasa a 5a se numește clubul savanților. Înscrierea este obligatorie pentru cei selecționați la cursul de informatică și opțională pentru elevii din grupa de începători. Se pot înscrie şi părinţii, dacă doresc. Atenţie: grupul clubul savanților este modul prin care pot face anunţuri urgente. El este, de asemenea, locul unde puteți primi ajutor de la colegii voștri și de la instructori, orice întrebări ați avea:

Tema - rezolvări

Comentarii generale

  • Toate exercițiile au fost date pentru a vă obișnui cu mediul de programare Code::Blocks.
  • Este prima temă, încă ne obișnuim cu stilul. Motiv pentru care nu iau în calcul penalizări. Însă încercați să țineți pasul și să respectați instrucțiunile.
  • Termenul limită trebuie respectat. Acesta este în fiecare zi de joi, ora 23:59. Cine trimite după termen, voi corecta doar dacă am timp. Altfel voi considera tema nefăcută.
  • Mulți dintre voi mi-ați trimis fișiere individuale, denumite main.c. Nu mă ajută. Îmi ia timp să îmi dau seama ce ați vrut să rezolvați. Aici mă refer la Maria Dinu, Luca Zamfir, Vladimir Gavriș. Denumiți fișierele cu numele problemei. Ex.: problema1.c .
  • Nu mai trimiteți surse fără să le rulați și să le testați. Atenționări speciale către: Codrin Rău, Mara Florian, Luca Zamfir, Vladimir Gavriș. Programele voastre nu funcționau corect.

Extragerea primei cifre

Se citește n, un număr natural strict mai mic decît 100. Să se afișeze prima cifră a lui n.


Prima cifră a lui n, n < 100
#include <stdio.h>
int main() {
  int n,c;

  scanf( "%d", &n );
  if(n < 10)
    c = n;
  else
    c = n / 10;
  printf( "%d\n", c );

  return 0;
}


Cifre impare

Se citește un număr n. Se știe că 1 ≤ n < 100. Să se spună dacă toate cifrele lui n sînt impare.

Varianta 1:

Toate cifrele lui n sînt impare, varianta 1
#include <stdio.h>
int main() {
  int n;

  scanf( "%d", &n );
  if( n < 10 ) {
      if( n % 2 == 1 )
         printf( "DA" );
      else
         printf( "NU" );
  } else {
      if( n % 10 % 2 == 1 ) {
         if( n / 10 % 2 == 1 )
            printf( "DA" );
         else
            printf( "NU" );
      } else
         printf( "NU" );
  }
  return 0;
}

Varianta 2:

Toate cifrele lui n sînt impare, varianta 2
#include <stdio.h>
int main() {
  int n, c;

  scanf( "%d" , &n );
  c = n % 10;
  if( c % 2 == 1 ) {
     n = n / 10;
     if( n > 0 ) {
        if( n % 2 == 1 )
            printf( "DA" );
        else
            printf( "NU" );
     } else
        printf( "DA" );
  } else
     printf( "NU" );

  return 0;
}

Maximul a trei numere

Se citesc trei numere, a, b și c. Să se afișeze valoarea maximă.

Varianta 1:

maximul a trei numere, varianta 1
#include <stdio.h>

int main() {
  int a, b, c;
  scanf( "%d%d%d", &a, &b, &c );
  if( a > b ) {
     if( a > c )
        printf( "%d", a );
     else
        printf( "%d", c );
  } else {
     if(b>c)
        printf( "%d", b );
     else
        printf( "%d", c );
  }
  return 0;
}


Varianta 2:

maximul a trei numere, varianta 2
#include <stdio.h>

int main() {
  int a, b, c, max;
  scanf( "%d%d%d", &a, &b, &c );
  max = a;
  if( b > max )
     max = b;
  if( c > max )
     max = c;
  printf( "%d", max );
  return 0;
}

Suma numerelor de la 1 la n

Să se calculeze suma numerelor de la 1 la n.

Varianta 1:

Suma numerelor de la 1 la n
#include <stdio.h>

int main() {
  int n;

  scanf( "%d", &n );
  printf( "Suma este %d", n * (n + 1) / 2 );

  return 0;
}

Varianta 2:

Suma numerelor de la 1 la n
#include <stdio.h>

int main() {
  int n, s, c;
  s = 0;
  c = 1;
  scanf( "%d", &n );
  while( c <= n ) {
     s = s + c;
     c = c + 1;
  }
  printf( "%d", s );

  return 0;
}

Zid

Problema zid de la test: Alin vrea să construiască un zid între doi stîlpi verticali, aflați la distanța D unul de altul. El dispune de n cărămizi de lungime l și înălțime h pe care le așează orizontal, una după alta, ca în figură. Pe fiecare rînd orizontal Ionel așează cîte cărămizi încap, lăsînd eventual un gol la capătul din dreapta. În sus el se oprește atunci cînd se termină cărămizile. Scrieți o schemă logică care citește D, n, l și h și afișează înălțimea maximă a zidului construit. În exemplul din figură: dacă D = 11, n = 8, l = 3 și h = 2 atunci înălțimea maximă a zidului va fi 6 (3 cărămizi fiecare de înălțime 2).

P4-zid.svg

Răspuns: Alin va așeza numărul maxim posibil de cărămizi pe fiecare rînd orizontal. Acest număr este cîtul împărțirii lui D (distanța dintre stîlpi) la l (lungimea unei cărămizi). Acest cît se calculează în mod natural cu operatorul împărțire întreagă, /. Vom avea, deci, D/l cărămizi pe rînd. Cîte rînduri va așeza Alin? Deoarece avem n cărămizi și D/l cărămizi pe orizontală, pentru a calcula numărul de cărămizi pe verticală vom împărți n la numărul de cărămizi pe orizontală, adică D/l. n/(D/l) este numărul de cărămizi pe verticală, dacă n se împarte la D/L, altfel trebuie să adunăm unu, deoarece ultimul rînd de cărămizi nu va fi complet. Pentru a acoperi ambele cazuri vom împărți (n + D/l - 1) la D/L. Acesta este numărul maxim de cărămizi pe verticală. Pentru a afla înălțimea zidului vom înmulți acest număr cu h, înălțimea unei cărămizi. Iată o soluție posibilă, atît schema logică cît și programul C:

Zid
#include <stdio.h>

int main() {
  int D, n, l, h;

  scanf( "%d%d%d%d", &D, &n, &l, &h );
  printf( "%d", (n + D/ l - 1) / (D / l) * h );

  return 0;
}

Lecție

Instrucțiunea if compusă

Instrucțiunea if permite cîte o singură instrucțiune pe fiecare ramură. Ce facem dacă avem mai multe instrucțiuni pe o ramură? Folosim instrucțiunea compusă, folosind acolade.

Exercițiu: ecuația de gradul 1

Fie ecuația :a · x = b

Să se calculeze x. Atenție! Ecuația poate avea multiple soluții, sau nici o soluție!

Schemă logică
#include <stdio.h>

int main() {
  int a, b, x;

  scanf( "%d%d", &a, &b );
  if ( a == 0 )
    if ( b == 0 )
      printf( "x oricare\n" );
    else
      printf( "x nu exista\n" );
  else {
    x = b / a;
    printf( "x este %d\n", x );
  }
  return 0;
}

if-uri imbricate

Exercițiu cu if-uri unul într-altul (numite și if-uri imbricate):

Exercițiu: an bisect

Să se spună dacă un an este bisect

Schemă logică
#include <stdio.h>

int main() {
  int a;

  scanf( "%d", &a );
  if ( a % 4 == 0 )
    if ( a % 100 == 0 )
      if ( a % 400 == 0 )
        printf( "da\n" );
      else
        printf( "nu\n" );
    else
      printf( "da\n" );
  else
    printf( "nu\n" );
  return 0;
}

Instrucțiunea while

Exerciții cu instrucțiunea while:

Exercițiu: afișarea tuturor cifrelor unui număr

Să se afișeze toate cifrele unui număr.

Schemă logică
#include <stdio.h>

int main() {
  int n, ult;

  scanf( "%d", &n );
  while ( n > 0 ) {
    printf( "Ultima cifra este %d\n", n % 10; );
    n = n / 10;
  }
  return 0;
}

Exercițiu: suma cifrelor unui număr

Să se afișeze suma cifrelor unui număr n.

Schemă logică
#include <stdio.h>

int main() {
  int n, s;

  scanf( "%d", &n );
  s = 0;
  while ( n > 0 ) {
    s = s + n % 10;
    n = n / 10;
  }
  printf( "Suma este %d\n", s );
  return 0;
}

Exercițiu: inversul unui număr

Să se afișeze inversul unui număr n.

Schemă logică
#include <stdio.h>

int main() {
  int n, r;

  scanf( "%d", &n );
  r = 0;
  while ( n > 0 ) {
    r = r * 10 + n % 10;
    n = n / 10;
  }
  printf( "Rasturnatul lui n este %d\n", r );
  return 0;
}

Tema

  • Să se rezolve următoarele probleme (schemă logică + program C în CodeBlocks). Acestea le veți trimite pe email doar către mine, nu pe grup! Nu trebuie să le trimiteți între voi și să le copiați, sunt doar pentru mine.
    • Calculați x11 cu număr minim de înmulțiri: Care este numărul minim?
    • Se citește un număr n. Să se spună cîte cifre pare are el. Exemple: dacă n=3528 el are 2 cifre pare (2 și 8), dacă n=49285640 el are 6 cifre pare (4, 2, 8, 6, 4, 0).
    • Se citește un număr n. Să se afișeze cel mai mare divizor propriu al lui n (strict mai mic decît n). Exemplu: dacă n=24 cel mai mare divizor propriu este 12. Dacă n=7 cel mai mare divizor propriu este 1. Dacă n=125 cel mai mare divizor propriu este 25. Dacă n = 175 cel mai mare divizor propriu este 35.
  • Problemă de logică: filozoful Immanuel Kant a ajuns acasă unde a constatat că ceasul de perete a stat deoarece a uitat să-l întoarcă. El a plecat către prietenul lui bun. Acolo a stat o vreme la discuții filozofice, apoi s-a întors înapoi acasă unde a potrivit ceasul la ora exactă! Cum a procedat Kant? Se știe că:
    • Prietenul lui Kant are un ceas care merge bine
    • Pe vremea lui Kant nu existau ceasuri de mînă sau alte dispozitive mobile cu ceas
    • Kant merge cu viteză constantă, de ani de zile aceeași, dar nu ştie cît este.

Rezolvări aici [1]