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

AJUTOR VA ROG FRUMOS
Problema subprograme, clasa a XI-a

Anexe:

Răspunsuri la întrebare

Răspuns de Apollyon
0

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.


bunagluma776: Nu-mi da return bine cu alte valori
bunagluma776: Asta uneori
bunagluma776: Si cum fac daca vreau sa elimin inainte de stergere?
Apollyon: ce valori?
Alte întrebări interesante