Clasa a V-a lecția 6 S6

From Algopedia
Jump to navigationJump to search

Lectie

Structura repetitiva while do

Structura repetitivă de tip WHILE-DO (cîtă timp - execută) reprezinta structura de control cu ajutorul careia executam un set de instructiuni, de mai multe ori, in functie de o conditie. Conditia se testeaza imediat la intrarea in structura repetitiva, de aceea, “while-do” se numeste structura repetitiva conditionata anterior.

Structura repetitivă de tip WHILE-DO

Pseudocod

Cat_timp(cond)executa
  Prel

C/C++

while(cond){
  Prel;
}

Mecanism:

  • Pas1. Se testeaza conditia. Daca conditia este adevarata atunci trecem la pasul 2. Daca conditia este falsa se trece la pasul 3
  • Pasul 2: Se executa pachetul de instructiuni “Prel” si se revine la pasul 1.
  • Pasul 3. Stop

Aplicatii cu while do

Afisare cifre in ordine inversa

Se citește n. Să se afișeze cifrele lui n în ordine inversă.

Afișare cifre număr în ordine inversă

Acest algoritm de PARCURGERE a cifrelor unui numar, se va aplica problemelor care prelucreaza intr-un fel sau altul cifrele numarului respectiv. Pentru a putea parcurge cifrele unui numar, accesam mai intai cifra care se poate extrage cel mai usor din numar, si anume ultima cifra (stim ca ultima cifra a oricarui numar este restul impartirii numarului respectiv la 10). Dupa ce am extras aceasta cifra si am afisat-o , eliminam aceasta cifra din numar, astfel incat, penultima cifra a numarul va deveni ultima cifra, si deci o vom putea extrage usor si pe aceasta, la pasul urmator.

Pseudocod

intreg n
Citeste n
Cat_timp(n>0)executa
  scrie n mod 10
  n = n div 10

C:

#include<stdio.h>
int main(){
  int n;
  printf( "Dati un numar: " );
  scanf( "%d", &n );
  printf( "Cifrele in ordine inversa: " );
  while(n > 0){         
    printf( "%d", n % 10 );
    n = n / 10;
  }
  return 0;
}

C++:

#include <iostream>
using namespace std;
int main(){
  int n;
  cout << "Dati un numar:";
  cin >> n;
  cout << "Cifrele in ordine inversa:";
  while( n > 0 ){
    cout << n % 10;
    n = n / 10;
  }
return 0;
}

Suma cifrelor unui numar

Schemă logică

Acest algoritm, se bazeaza pe algoritmul de parcurgere a cifrelor unui numar, descris anterior. Vom avea nevoie in plus, de o variabila ACUMULATOR (o vom denumi s, de la suma), variabila in care vom aduna pe rand valorile cifrelor accesate. Pe masura ce accesam o cifra a unui numar, adunam valoarea cifrei la valoarea anterioara a acumulatorului, care valoare, este initial 0. Daca am fi dorit sa calculam produsul cifrelor unui numar, cat ar fi trebuit sa fie initial variabila acumulator?

Pseudocod

intreg n, s
citeste n
s = 0
cat_timp( n > 0 )executa
  s <- s + n mod 10
  n <- n / 10
scrie s

C

include<stdio.h>
int main(){
  int n,s;
  scanf("%d",&n);
  s=0;
  while(n>0){
    s= s + n % 10;
    n=n/10;
  }
  printf("%d",s);
  return 0;
}

Cate cifre are un numar

Acest algoritm, se bazeaza pe algoritmul de parcurgere a cifrelor unui numar, descris anterior. Vom avea nevoie in plus, de o variabila CONTOR , cu ajutorul caruia vom numara cifrele pe masura ce le vom parcurge. Vom parcurge cifrele numarului incepand cu ultima cifra , si pentru fiecare cifra accesata, vom mari valoarea contorului cu 1.

Pseudocod

contor = 0
cat_timp( n > 0 )executa
  contor <- contor + 1
    n = n / 10
scrie contor

C

cnt=0;
while(n>0){
   cnt++; //cnt=cnt+1; cnt+=1
   n=n/10;
}
printf("%d",contor);

Cate cifre sunt egale cu o cifra k

Acest algoritm, se bazeaza pe algoritmul de parcurgere a cifrelor unui numar, descris anterior. De asemenea, vom avea nevoie sa numaram cifrele care indeplinesc conditia data, folosind o variabila contor. In plus, vom avea nevoie sa testam daca o anumita cifra indeplineste conditia ceruta, si numai daca conditia este adevarata sa marim valoarea contorului.

Pseudocod

contor=0;
cat_timp(n>0)executa
  daca( n mod 10 == k)
    contor <- contor+1
      n = n / 10
scrie contor

C

contor=0;
while(n>0){
   if( n % 10 == k)
      contor++;
   n=n/10;
}
printf(“%d”,contor);

Sunt toate cifrele lui n pare?

Acest algoritm, se bazeaza pe algoritmul de parcurgere a cifrelor unui numar, descris anterior. Vom avea nevoie in plus, de o variabila STEAG (SEMN) , cu ajutorul caruia vom identifica daca numarul are o cifra care nu respecta conditia data. Vom parcurge toate cifrele numarului si de fiecare data cand vom gasi o cifra care nu respecta conditia( nu este para) vom seta valoarea steguletului pe 0 (codificare a raspunsului NU, nu este ok numarul). Initial valoarea steguletului va fi setata pe 1 (codificare a raspunsului DA; presupunem ca numarul are numai cifre pare, adica este ok) Variabila cu rol de steag este gasit.

Pseudocod

gasit=1;
cat_timp(n>0)executa
  daca( n mod 2 == 1)
    gasit=1
    n<-n div 10;
daca (gasit==0)
  scrie “nu sunt toate pare”
altfel
  scrie “sunt toate pare”

C

gasit = 1; 
while( n > 0 ){
   if( n % 2 == 1 )
    gasit = 0;
   n=n/10;
}
if( gasit == 0 )
  printf(“nu sunt toate pare”);
else
   printf(“sunt toate pare”);

Varianta condensata:

while( n > 0 && n % 2 == 0 ){   
    n=n/10;
}
if( n > 0 )
  printf("nu sunt toate pare");
else
  printf("sunt toate pare");

Inversul unui numar

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( "%d\n", r );
  return 0;
}

Palindrom

Definiție: un număr palindrom (sau simetric) este un număr care este identic cu răsturnatul lui. Cu alte cuvinte el arată la fel dacă îi scriem cifrele de la stînga la dreapta sau de la dreapta la stînga. Exemple de numere palindrom sînt 1221, 5229225, 27272, 44, 1. Problemă: să se determine dacă un număr n este palindrom. Rezolvare: vom calcula răsturnatul lui n în variabila r. Dacă cele două numere sînt egale înseamnă ca numărul este palindrom. Trebuie să acordăm atenție faptului că n va fi distrus în timpul calculului, drept pentru care îi vom face o copie în nc.

#include <stdio.h>

int main() {
  int n, nc, r;

  scanf( "%d", &n );
  nc = n;
  r = 0;
  while ( n > 0 ) {
    r = r * 10 + n % 10;
    n = n / 10;
  }
  if ( nc == r )
    printf( "%d este palindrom\n", nc );
  else
    printf( "%d nu este palindrom\n", nc );
  return 0;
}

TEMA6

  • (usoara) Sa se calculeze 2 la puterea n.
  • (medie) Se citeste un numar n, de maxim 9 cifre dintr-un fisier "date.in". Afisati numarul care contine, in aceeasi ordine doar cifrele pare ale lui n, intr-un fisier "date.out". Ex: n= 12345, Se va afisa 24;
  • (usoara) Se citeste un numar n. Afisati numarul rezultat prin eliminarea primei cifre a lui n.
  • (medie) Se citeste un numar n. Afisati cifra de control a numarul n. Cifra de control se obtine prin adunarea repetata a cifrelor numarului pana cand se obtine o singura cifra.

Ex: n=193, s=1+9+3=13, s=1+3=4

  • (dificila) Se citeste un numar n. Sa se afiseze cel mai apropiat fata de n numar palindrom.

Ex1: 122 , afisam 121; nr 122 e cuprins intre 121 si 131, iar 121 este mai apropiat fata de 122 Ex2: 452 , afisam 454; nr 452 este cuprins intre 444 si 454.

Optional

Util