AJUTOR VA ROG FRUMOS
Problema subprograme, clasa a XI-a
Răspunsuri la întrebare
Răspuns:
#include <iostream>
#include <fstream>
void sterge(int tablouNumere[], int& dimensiuneTablou, int indexElement);
int main()
{
int tablouNumere[100]{};
std::ifstream fisierNumere("NUMERE.IN", std::ios::in);
if (!fisierNumere.good())
{
std::cerr << "Eroare la deschiderea fisierului \"NUMERE.IN\"!\n";
exit(EXIT_FAILURE);
}
int dimensiuneTablou = 0;
/*
* Citim de pe prima linie din „NUMERE.IN” dimensiunea tabloului
*/
fisierNumere >> dimensiuneTablou;
for (int i = 0; i < dimensiuneTablou; i++)
{
/*
* De pe următoarea linie citim în tablo numerele
*/
fisierNumere >> tablouNumere[i];
}
/*
* Afișăm tabloul înainte de ștergere
*/
std::cout << "Inainte de stergere:\n\t";
for (int i = 0; i < dimensiuneTablou; i++)
{
std::cout << tablouNumere[i] << " ";
}
std::cout << "\n\n";
/*
* Ștergem duplicatele ( astfel încât să rămână doar un număr din cele duplicate )
*/
for (int i = 0; i < dimensiuneTablou; i++)
{
/*
* Tabloul nostru inițial e [10, 10, 2, 2, 19, 9, 9, 9, 9, 15, 15, 15]
*
* La prima iterație:
* [10, 10, 2, 2, 19, 9, 9, 9, 9, 15, 15, 15]
* ^ ^
* i i+1 ( observăm că valorile sunt egale deci intrăm în while-ul de mai jos )
*
* La a doua iterație
* [10, 2, 2, 19, 9, 9, 9, 15, 15, 15, 15]
* ^ ^
* i i+1 ( din nou ștergem )
*
* La a treia iterație nu vom șterge nimic deoarece 19 != 9
* [10, 2, 19, 9, 9, 9, 15, 15, 15, 15, 15]
*
* La a patra iterație ștergem 2 din cele 3 de 9 și continuăm așa până când ori nu mai găsim numere de șters
* ori i e diferit de dimensiuneTablou - 1
*/
while (tablouNumere[i] == tablouNumere[i + 1] && i != dimensiuneTablou - 1)
{
/* le ștergem ( prima iterație ) iar tabloul nostru va fi următorul:
* [10, 2, 2, 19, 9, 9, 9, 15, 15, 15, 15]
*/
sterge(tablouNumere, dimensiuneTablou, i);
}
}
/*
* Afișăm tabloul după ștergere
*/
std::cout << "Dupa stergere:\n\t";
for (int i = 0; i < dimensiuneTablou; i++)
{
std::cout << tablouNumere[i] << " ";
}
return 0;
}
void sterge(int tablouNumere[], int& dimensiuneTablou, int indexElement)
{
/* Dacă indexul elementului ce vrem să-l ștergem din tablou e mai mic decât 0 sau egal cu dimensiunea tabloului
* înseamnă că nu am introdu de la tastatură un index corect deci ieșim din program ( sau na, reintroduci alt index
* depinde cum vrei să tratezi cazul ăsta )
*/
if (indexElement < 0 || indexElement == dimensiuneTablou)
{
std::cerr << "Indexul elementului ce urmeaza sa fie sters este incorect!\n";
exit(EXIT_FAILURE);
}
/*
* Altfel dacă tabloul nostru este de exemplu
* [1, 2, 3, 4]
* și vrem să ștergem al 2-lea element ( de pe indexul 1 ) pornim cu i = indexul elementului pe care vrem să-l ștergem
* și egalăm valoarea de pe indexul i cu următoarea valoare... ceva de genul
*
* [1, 2, 3, 4] ( prima iterație )
* ^
* i = 1
* iar când ajungem la tablouNumere[i] = tablouNumere[i + 1] tabloul se transformă în:
* [1, 3, 3, 4]
*
* [1, 3, 3, 4] ( a doua iterație )
* ^
* i = 2
* => [1, 3, 4, 4]
*
* la a 3a iterați i ( care e 3 ) nu e mai mic decât dimensiuneTablou ( 4 ) - 1 deci ne oprim iar vectorul
* final va fi [1, 3, 4, 4] ( deci am șters 2-ul de pe indexul 1 )
*/
for (int i = indexElement ; i < dimensiuneTablou - 1; i++)
{
tablouNumere[i] = tablouNumere[i + 1];
}
/*
* Decrementăm dimensiunea tabloului iar vectorul final va fi [1, 3, 4] ( pentru că ignorăm al 4lea element deoarece
* am șters al doilea element iar ultimul element s-a mutat o poziție la stânga )
* Dacă chiar vrei poți crea un nou tablou doar cu primele 3 numere
*/
dimensiuneTablou--;
}
Acum l-am testat pe input-ul tău, outputul meu e ca și-n poză 10 2 19 9 15 + alte input-uri și a dat bine de fiecare dată )), dacă nu înțelegi ceva scrie-mi.