online: 2; azi: 2; total: 52008 Manual clasa a xi a - Implementarea structurilor de date - Lista liniara

Probleme Rezolvate



Manual clasa a Xi a

Implementarea structurilor de date

Lista liniara

În fişier sunt memorate foarte multe numere (maxim 10.000). Foarte multe dintre aceste numere se repetă (există maxim 100 de numere distincte). Se creează o listă ordonată crescător numai cu numerele distincte şi cu frecvenţa lor de apariție. Se afişează cel mai mare număr şi cel mai mic număr. Se calculează media aritmetică a numerelor care au valoarea cea mai mare sau au valoarea cea mai mică şi se afişează numai numerele care sunt mai mari decât media aritmetică.
# include < iostream >
# include < fstream >
struct Node {
int val;
int freq ;
Node * next ;
};
Node * create_node ( int val) {
Node * new_node = new Node ;
new_node ->val = val;
new_node -> freq = 1 ;
new_node -> next = nullptr ;
return new_node ;
}
void insert_or_increment ( Node *& head , int val) {
if (! head || head ->val >= val) {
if ( head && head ->val == val) {
head -> freq ++;
} else {
Node * new_node = create_node (val);
new_node -> next = head ;
head = new_node ;
}
} else {
Node * current = head ;
while ( current -> next && current -> next ->val < val) {
current = current -> next ;
}
if ( current -> next && current -> next ->val == val) {
current -> next -> freq ++;
} else {
Node * new_node = create_node (val);
new_node -> next = current -> next ;
current -> next = new_node ;
}
}
}
void print_greater_than_average ( Node * head , int min_val , int max_val ) {
double average = ( min_val + max_val ) / 2.0 ;
while ( head ) {
if ( head ->val > average ) {
std :: cout << head ->val << " ( freq : " << head -> freq << ")\n" ;
}
head = head -> next ;
}
}
void delete_list ( Node *& head ) {
while ( head ) {
Node * temp = head ;
head = head -> next ;
delete temp ;
}
}
int main () {
std :: ifstream input_file ( "numere.txt" ) ;
int num;
Node * head = nullptr ;
int min_val , max_val ;
if ( input_file >> num) {
min_val = max_val = num;
insert_or_increment ( head , num);
while ( input_file >> num) {
insert_or_increment ( head , num);
min_val = std :: min ( min_val , num);
max_val = std :: max ( max_val , num);
}
std :: cout << "Min: " << min_val << "\ nMax : " << max_val << "\n" ;
print_greater_than_average ( head , min_val , max_val );
delete_list ( head );
} else {
std :: cout << "Fișierul este gol sau nu a putut fi citit.\n" ;
}
return 0 ;
}

D atele de intrare ar trebui să fie un fișier text numit numere.txt care conține numere întregi separate prin spațiu, pe același rând. De exemplu, fișierul numere.txt ar putea arăta astfel:
15 8 8 15 6 9 6 9 20 7 8 14 11 11 11 20
Această secvență de numere întregi va fi procesată de program, care va crea o listă ordonată crescător numai cu numerele distincte și cu frecvența lor de apariție, va afișa cel mai mare număr și cel mai mic număr, va calcula media aritmetică a acestor două numere și va afișa numai numerele care sunt mai mari decât media aritmetică.
În cazul exemplului de mai sus, rezultatul va fi următorul:
Min: 6
Max: 20
15 ( freq : 2)
20 ( freq : 2)
Puteți crea fișierul numere.txt folosind un editor de text precum Notepad sau Notepad ++ și salvând fișierul în aceeași locație cu programul C++ (sau specificând calea completă a fișierului în program). Dacă doriți să testați programul pe mai multe seturi de date, puteți modifica conținutul fișierului numere.txt și să rulați programul din nou.