Informatică, întrebare adresată de george91florin, 8 ani în urmă

Se citeste de la tastatura un numar natural nenul n, apoi se citesc succesiv n valori reale. Scrieti un program care determina si afiseaza cea mai mare si cea mai mica valoare reala citita. Rezolvati problema in 2 moduri: prima data folosind instructiunea FOR, si apoi folosind instructiunea WHILE.

Răspunsuri la întrebare

Răspuns de Sergetec
2

Mai jos rezolvarea in 2 moduri in C++

I. cu instructiunea for

#include <iostream>

using namespace std;

int main()

{

 int n;

 cin >> n;

 double x, maxi = -100000, mini = 100000;

 for (int i = 1; i <= n; ++i)

 {

   cin >> x;

   if (x >= maxi)

   {

     maxi = x;

   }

   if (x <= mini)

   {

     mini = x;

   }

 }

 cout << maxi << " " << mini;

 return 0;

}

II. cu instructiunea while (exact la fel, doar ca inlocuiesti for-ul cu while)

#include <iostream>

using namespace std;

int main()

{

 int n, i = 1;

 cin >> n;

 double x, maxi = -100000, mini = 100000;

 while (i <= n)

 {

   cin >> x;

   if (x >= maxi)

   {

     maxi = x;

   }

   if (x <= mini)

   {

     mini = x;

   }

   i++;

 }

 cout << maxi << " " << mini;

 return 0;

}


danboghiu66: Nici o sansa sa functioneze. In primul rind x e neinitializat. Tu ai i in cicluri. In al doilea rind, pentru numere mici, vei tipari mereu -100000 si 100000. Ca ifurile alea nu vir trigera.....
danboghiu66: Recomand rularea aplicatiei inainte de postarea solutiei
danboghiu66: Acu vazui ca maxi e mini si mini e maxi... solutie greoaie.... considera minim si maxim egale cu prima valoare.
Sergetec: Mereu rulez inainte sa postez ambele solutii merg ca la carte
danboghiu66: Zici tu? Ia incearca cu n=1 si x=-200000. Ar trebui ca min=max=-200000. Asa iti da?
Sergetec: Nu e precizata vreo restrictie in cerinta asa ca am luat o valoare considerabila pt min si max.
Sergetec: Nu am vrut sa adaug alte headere ca sa nu stric simplitatea problemei, dar poti sa incluzi float.h si atunci ai acces la DBL_MAX pt min si -DBL_MAX pt max
Sergetec: sau alternativ special pt c++
danboghiu66: Nu. La chestii de acest gen, eu am implementat prin if (prima_citire) {min=v(0), max=v(0)}, unde v(0) este primul numar. In felul asta nu depind nici de 100000, dbl-max, sau alte nebuni.
danboghiu66: Daca faci presupuneri ca numetele trebuie sa fie intre -100000 si 100000, valideaza-le si da mesaj: numrul introdus nu se gaseste in intervalul .
Răspuns de andrei750238
3

► SOLUTIE FOR :

#include <iostream>

#include <float.h>

using namespace std;

int main() {

int n;

double curent;

double mx = -DBL_MAX;

double mn = DBL_MAX;

//Citire dimensiune sir elemente

cout << "Introduceti numarul de elemente : ";

cin >> n;

if (n == 0) {

 cout << "Sirul nu poate fi vid !";

 return 0;

}

cout << "Introduceti elementele : ";

for (int i = 0; i < n; i++) {

 //Citeste valoarea curenta

 cin >> curent;

 //Actualizeaza minim si maxim daca e nevoie

 if (curent > mx) mx = curent;

 if (curent < mn) mn = curent;

}

//Afisare rezultat

cout << "\nMinim : " << mn;

cout << "\nMaxim : " << mx;

return 0;

}

► SOLUTIE WHILE :

#include <iostream>

#include <float.h>

using namespace std;

int main() {

int n;

int i = 0;

double curent;

double mx = -DBL_MAX;

double mn = DBL_MAX;

//Citire dimensiune sir elemente

cout << "Introduceti numarul de elemente : ";

cin >> n;

if (n == 0) {

 cout << "Sirul nu poate fi vid !";

 return 0;

}

cout << "Introduceti elementele : ";

while (i<n) {

 //Citeste valoarea curenta

 cin >> curent;

 //Actualizeaza minim si maxim daca e nevoie

 if (curent > mx) mx = curent;

 if (curent < mn) mn = curent;

 //Incrementeaza numarul de elemente citite

 i++;

}

//Afisare rezultat

cout << "\nMinim : " << mn;

cout << "\nMaxim : " << mx;

return 0;

}

► Explicatie :

Deoarece e nevoie sa trecem prin sirul de valori o singura data nu e necesar sa memoram sirul de numere. Citim fiecare valoare si determinam daca trebuie actualizat minim/maxim sau nu.

Initializam valoarea minima si valoarea maxima cu cel mai mare numar reprezentabil in C++ pentru tipul double, respectiv cel mai mic numar reprezentabil in C++ pentru tipul double.

Numarul DBL_MAX e o constanta declarata in fisierul header float.h care retine cel mai mare numar care poate fi retinut intr-un double. Intervalele sunt simetrice pentru plus si minus, din acest motiv -DBL_MAX e cel mai mic numar care poate fi retinut.

Alternativ puteam initializa minimul si maximul cu primul element din sir.

► Amintim :

Toate instructiunile repetitive (FOR, WHILE, DO...WHILE) sunt echivalente si se poate transforma dintr-o forma in alta fara prea mari batai de cap.

Anexe:
Alte întrebări interesante