Clasa a V-a lecția 6 - 28 sep 2019

From Algopedia
Jump to navigationJump to search

Introducere

Am anunțat componența grupei. Note:

  • Grupa nu este închisă. Pe viitor voi accepta noi copii care fac foarte bine la teme și concursuri, sau voi renunța la cei ce nu-și dau silința, sau lipsesc de la curs. Nu uitați: temele și concursurile sunt obligatorii, participați la ele!

Tema - rezolvări

Biciul

De ce pocnește biciul? Răspuns: prin modul de mișcare vîrful biciului accelerează. Atunci cînd capătul biciului (șfichiul) se deplasează atît de repede încît depășește viteza sunetului se produce bangul sonic. Definiție din dexonline.ro: "BANG SONIC zgomot puternic asemănător sunetului produs de unda de șoc generată de un avion care zboară cu viteză supersonică, având o formă de propagare aproximativ conică – conul Mach – și care provoacă la altitudini mai mici de 500m efecte dăunătoare sănătății oamenilor, animalelor și unele avarii clădirilor și anumitor organe ale mijloacelor tehnice". O altă explicație a [bangului sonic].

Patru triunghiuri

Se dau șase chibrituri. Să se aranjeze astfel încît să se formeze 4 triunghiuri. Nu aveți voie să rupeți bețele și nici să lăsați "mustăți" (bucăți de bețe care nu sînt parte din nici un triunghi). Răspuns: veți așeza cele șase bețe în formă de tetraedru (piramidă triunghiulară regulată):

Tetraedru

Frînghiile care ard într-o oră

Răspuns: vom măsura 15 minute astfel: dăm foc primei frînghii la un capăt, iar celeilalte frînghii la ambele capete. Frînghia 2 va arde in 30 de minute, timp în care prima frînghie va mai avea 30 de minute de ardere. La momentul cînd frînghia 2 s-a terminat dăm foc și la celălalt capăt al frînghiei 1. În acest moment începem numărătoarea. Restul frînghiei 1 va arde în 15 minute.

Ani bisecți în interval

Să se afișeze numărul de ani bisecți între anul a și anul b.
Răspuns: Avem două rezolvări:

    • Rezolvarea 1: vom merge cu a din 1 în 1 pînă ce ajungem la b. Pentru fiecare valoare a lui a testăm dacă este an bisect și adunăm 1 la un contor de ani numit nr. Iată schema logică:
      Numărul de ani bisecți - rezolvarea 1
      Remarcați că a are rol de contor, el numărînd de la a la b, iar nr are rol atît de contor, el numărînd anii bisecți, cît și de acumulator, el acumulînd rezultatul.
    • Rezolvarea 2: ne folosim de ideea din altă schemă logică, cea din lecția 3 în care se cerea să afișăm numărul de numere divizibile cu k din intervalul [a, b]. Pentru a afla numărul de ani bisecți din intervalul [a, b] procedăm astfel: adunăm anii divizibili cu 4. Dar în felul acesta am adunat în plus anii divizibili cu 100, așa încît la pasul doi îi scădem. Dar acum am scăzut prea mulți ani, deoarece i-am scăzut pe cei divizibili cu 400, așa încît îi adunăm la loc. Iată schema logică:
      Numărul de ani bisecți - rezolvarea 2
    • Care din cele două rezolvări este mai bună? Pentru a răspunde să ne gîndim ce se întîmplă atunci cînd b este foarte mare. Să spunem că a este 2000 și b este 52000. Prima schemă va executa bucla de 50000 de ori, ceea ce duce la foarte multe calcule. A doua schemă, în schimb, va executa un număr mic de calcule, independent de valorile anilor a și b. Deci a doua rezolvare este mai bună. Țineți minte: nu întotdeauna rezolvarea mai scurtă, sau cea pe care o știți mai bine este și cea mai bună!

Numărul de cifre

Se dă un număr n. Să se afișeze numărul de cifre al lui n. Răspuns: vom folosi un contor nrcf care va număra cifrele lui n. Pentru fiecare cifră numărată vom împărți n la 10. Iată schema logică:

Numărul de cifre ale lui n

Putere a lui 2

Se dă un număr n. Să se spună dacă n este de forma 2k (adică dacă este putere a lui 2). Răspuns: dacă numărul este putere a lui doi înseamnă că împărțindu-l la doi în mod repetat vom obține în final 1. Vom face împărțirile numai atunci cînd n se împarte exact la doi. Iată o schemă logică:

Este n putere a lui 2?

Întrebare: funcționează această schemă dacă n = 0?

Rezolvări aici [1]

Lecție

Limbajul C

Limbaje de programare

În informatică vorbim despre limbaje naturale și limbaje artificiale. Limbajele naturale sînt limbile lumii, cum ar fi limba română, sau limba engleză. Este ironic că ele sînt denumite "naturale", dacă ne gîndim că "artificial" este ceva creat de om ☺. Prin contrast, limbajele artificiale sînt cele construite cu un scop; printre ele se află limbajele de programare. Un limbaj de programare este, precum limba română, o colecție de reguli (gramatică) și cuvinte (lexic) care împreună pot fi folosite pentru a construi programe (paragrafe). Programele au, ca și propozițiile în limba română, un înțeles (semantică). Ele au ca scop exprimarea unui algoritm ce se dorește a fi executat de calculator, spre deosebire de limba română unde scopul este comunicarea generală. Și limbajele de programare și schemele logice au ca scop descrierea algoritmilor. Dar, în vreme ce o schemă logică exprimă logica de bază a algoritmilor, limbajele de programare adaugă toate detaliile necesare pentru execuția algoritmului pe calculator.

Limbajul C

Limbajul C este un limbaj de programare dezvoltat de Brian Kernighan și Dennis Ritchie la Bell Labs în anii 1969-1973. În același timp cei doi au ajutat la dezvoltarea sistemului de operare UNIX, care se îmbina foarte bine cu acest limbaj.

Hello World

Un program simplu: Hello World (programul clasic pe care programatorii îl scriu atunci cînd învață un nou limbaj de programare):

#include <stdio.h>

int main() {
  printf( "Hello world!\n" );
  return 0;
}

Instrucțiuni de intrare/ieșire

Instrucțiunile scanf și printf sînt echivalentul blocului paralelogram în schemă logică. Exemplu: citirea a două numere și afișarea sumei lor:

#include <stdio.h>

int main() {
  int a, b;

  printf( "Introduceti doua numere: " );
  scanf( "%d%d", &a, &b );
  printf( "Suma numerelor este %d\n", a + b );
  return 0;
}

Secțiunile unui program C

Despre părțile unui program C:

  • Orice program C conține anumite elemente fixe, cum ar fi includerea bibliotecii standard de intrare/ieșire, începutul funcției principale (main) și finalul în care returnăm valoarea zero.
  • Elementele variabile ale programului C, ceea ce vom folosi noi pentru a implementa schema logică, sînt formate din două secțiuni: cea de declarare a variabilelor și cea a programului propriu-zis, precum se vede în programul anterior.

Instrucțiunea de atribuire (blocul dreptunghi)

  • Este o instrucțiune de calcul
  • Aproape identică cu conținutul blocului dreptunghi, în care săgețica ← se înlocuiește cu semnul egal =
  • În partea stîngă a semnului egal se află întotdeauna o variabilă. În partea dreaptă se află fie o variabilă, fie o expresie matematică.

Exercițiu: suma a două numere

Scrieți suma a două numere folosind o variabilă intermediară, de calcul:

#include <stdio.h>

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

  scanf( "%d%d", &a, &b );
  c = a + b;
  printf( "Suma numerelor este %d\n", c );
  return 0;
}

Exercițiu: calcul expresie

Scrieți la calculator programul care să calculeze expresia 24 / a + 100 / (c3 + b / (d2 + e2))

#include <stdio.h>

int main() {
  int a, b, c, d, e, expr;

  scanf( "%d%d%d%d%d", &a, &b, &c, &d, &e );
  expr = 24/a + 100 / (c * c * c + b / (d * d + e * e));
  printf( "expresia este %d\n", expr );
  return 0;
}

Intrucțiunea if

Am vorbit despre instrucțiunea if. Ea implementează structura alternativă. Apoi am vorbit despre operatorii de comparație ==, !=, <, <=, >, >=.

Să se spună dacă n divizibil cu k

Schemă logică
#include <stdio.h>

int main() {
  int n, k;

  scanf( "%d%d", &n, &k );
  if ( n % k == 0 )
    printf( "Da" );
  else
    printf( "Nu" );
  return 0;
}

Instrucțiunea while

Am vorbit despre instrucțiunea while. Ea implementează structura repetitivă de tip WHILE-DO.

Tema

  • Instalați codeblocks Code::Blocks. Dacă cumva aveți instalat MinGW dezinstalați-l înainte de a instala codeblocks, altfel s-ar putea să aveți probleme în recunoașterea compilatorului. Apoi urmăriți instrucțiunile pentru a vă face setările corespunzătoare: Setări necesare în Code::Blocks.
  • Scrieți programe pentru următoarele scheme logice de pe site-ul algopedia:
    • Lecția 2, extragerea primei cifre.
    • Lecția 2, cifre impare, ambele variante sugerate.
    • Lecția 2, maximul a trei numere, ambele variante sugerate.
    • Lecția 3, suma numerelor de la 1 la n, ambele variante sugerate.
    • Problema zid: 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

Rezolvări aici [2]