[C++] Zamiana miejsc elementów w tablicy

zuzka_kotek
Użytkownik
Użytkownik
Posty: 46
Rejestracja: 23 lut 2016, o 20:45
Płeć: Kobieta
Lokalizacja: Gdańsk
Podziękował: 4 razy

[C++] Zamiana miejsc elementów w tablicy

Post autor: zuzka_kotek »

Mam za zadanie napisać program,który będzie zamieniał miejscami dwa wybrane przez użytkownik a elementy oraz wyszukiwał dwa najmniejsze elementy razem z indeksem.A na koniec funkcje, która będzie sortowała elementy za pomocą algorytmu z funkcji o zamianie. Starałam się napisać oba kody tylko nie wiem gdzie popełniam błąd.
Bardzo proszę o pomóc.

Kod: Zaznacz cały

#include <string>
#include <iostream>
#include <time.h>
#include <cstdlib>
#define ROZMIAR 10
using namespace std;

void menu();
void wypelnianie_losowe(float tablica[]);
void wypelnianie_kolejne(float tablica[]);
float suma_ujemna(float tablica[]);
void przesuniecie_w_lewo(float tablica[]); //przesunie elementy tablicy o 1 w lewo
void przesuniecie_w_prawo(float tablica[]); //przesunie elementy o 2 w prawo
float maksimum(float tablica[]);
void minimum(float tablica[]); //wyswietla 2 najmiejsze liczby razem z jej indeksem
void zamiana(float tablica[]); //zamienia dwie liczby
int main()
{
    srand(time(NULL));
    float tablicaa[ROZMIAR];
    int liczba;
    menu();
    cout << "podaj liczbe:";
    cin >> liczba;
    switch (liczba) {
    case 1:
        wypelnianie_losowe(tablicaa);
        cout << endl;
        break;
    case 2:
        wypelnianie_kolejne(tablicaa);
        cout << endl;
        break;
    }
    cout << "Suma ujemnych elementow wynosi: " << suma_ujemna(tablicaa) << endl;
    przesuniecie_w_lewo(tablicaa);
    cout << endl;
    przesuniecie_w_prawo(tablicaa);
    cout << endl;
    cout << "Najwiekszy element tablicy to: " << maksimum(tablicaa) << endl;
    // minimum(tablicaa);
    cout << endl;
    zamiana(tablicaa);
    cout << endl;
    system("pause");
    return 0;
}

void menu()
{
    cout << "---	MENU UZYTKOWNIKA	---" << endl;
    cout << "1:Wypelnij tablice losowymi liczbami" << endl;
    cout << "2:Wypelnij tablice kolejnymi liczbami" << endl;
    cout << "a:Suma ujemnych elementow" << endl;
    cout << "b:Przesuuniecie wszystkich elementow o 1 w lewo" << endl;
    cout << "c:Przesuuniecie wszystkich elementow o 2 w prawo" << endl;
    cout << "d:Najwieksza liczba w tablicy" << endl;
    cout << "e:Dwie najmniejsze wartosci z ich indeksami" << endl;
    cout << "f:Najczesciej pojawiajaca sie wartosc" << endl;
    cout << "g:Zamiana miejscami dwoch zmiennych" << endl;
    cout << "h:Sortowanie tablicy" << endl;
    cout << "i:Usuwanie wszystkich spacji" << endl;
    cout << "j:Usuwanie spacji wielokrotnych" << endl;
}
void wypelnianie_kolejne(float tablica[])
{
    cout << "Tablica z kolejnymi elementami:" << endl;
    for (int i = 0; i < ROZMIAR; i++) {
        tablica[i] = i + 1;
        cout << tablica[i] << "	";
    }
}
void wypelnianie_losowe(float tablica[])
{
    cout << "Tablica z elementami wylosowanymi:" << endl;
    for (int i = 0; i < ROZMIAR; i++) {
        tablica[i] = rand() % 201 - 100;
        cout << tablica[i] << "	";
    }
}
float suma_ujemna(float tablica[])
{
    int suma = 0;
    for (int i = 0; i < ROZMIAR; i++) {
        if (tablica[i] < 0)
            suma += tablica[i];
    }
    return suma;
}
void przesuniecie_w_lewo(float tablica[])
{
    cout << "Tablica po przesunieciu o 1 w lewo: " << endl;
    for (int i = 0; i < ROZMIAR; i++) {
        if (i == ROZMIAR - 1) {
            cout << tablica[0] << "	";
        }
        else {
            cout << tablica[i + 1] << "	";
        }
    }
}
void przesuniecie_w_prawo(float tablica[])
{
    cout << "Tablica po przesunieciu elementow o 2 w prawo:" << endl;
    for (int i = 0; i < ROZMIAR; i++) {
        if (i == 0) {
            cout << tablica[ROZMIAR - 2] << "	";
        }
        else if (i == 1) {
            cout << tablica[ROZMIAR - 1] << "	";
        }
        else {
            cout << tablica[i - 2] << "	";
        }
    }
}
float maksimum(float tablica[])
{
    int maks = tablica[0];
    for (int i = 0; i < ROZMIAR; i++) {
        if (tablica[i] > maks)
            maks = tablica[i];
    }
    return maks;
}
void minimum(float tablica[])
{
    float mini_1, mini_2;
    mini_1 = tablica[0];
    mini_2 = tablica[1];
    int indeks_mini_1 = 0;
    int indeks_mini_2 = 1;
    if (mini_1 > mini_2) {
        mini_1 = tablica[1];
        mini_2 = tablica[0];
        indeks_mini_1 = 1;
        indeks_mini_2 = 0;
    }
    for (int i = 0; i < ROZMIAR; i++) {

        if (tablica[i] < mini_2)
            mini_2 = tablica[i];
        indeks_mini_2 = i;

        if (mini_1 > mini_2 || mini_1 == mini_2) {
            mini_1 = tablica[i];
            mini_2 = tablica[1];
            indeks_mini_2 = 1;
            indeks_mini_1 = i;
        }

        int indeks_mini_1 = 0;
        int indeks_mini_2 = 1;
        for (int j = 1; j <= ROZMIAR; j++) {
            if (tablica[j] < tablica[indeks_mini_1])
                indeks_mini_1 = j;
            if (tablica[j] < tablica[indeks_mini_2])
                indeks_mini_2 = j;
        }
    }
    cout << "Element najmniejszy nr_1: " << mini_1 << endl;
    cout << "Index najmniejszego elementa nr_1: " << indeks_mini_1 << endl;
    cout << "Element najmniejszy nr_2: " << mini_2 << endl;
    cout << "
	Index najmniejszego elementa nr_2: " << indeks_mini_2 << endl;
}
void zamiana(float tablica[])
{
    float a, b, c;
    cout << "Podaj pierwsza liczbe do zamiany: ";
    cin >> a;
    cout << "Podaj druga liczbe do zamiany: ";
    cin >> b;
    for (int i = 0; i < ROZMIAR; i++) {
        if (tablica[i] == a || tablica[i] == b) {
            for (int j = 0; j < ROZMIAR; j++) {
                if (tablica[j] == b && i != j || tablica[j] == a && i != j) {
                    c = tablica[j];
                    tablica[j] = tablica[i];
                    tablica[i] = c;
                }
            }
        }

        cout << tablica[i] << " ";
    }
}


Ostatnio zmieniony 4 cze 2016, o 12:28 przez Afish, łącznie zmieniany 1 raz.
Powód: Przeczytaj http://www.matematyka.pl/273220.htm
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++] Zamiana miejsc elementów w tablicy

Post autor: kalwi »

1. Nie używaj define, tylko np. const int do deklarowania stałych
2. Zamiast funkcji void menu() lepiej zrobić const string menu= "..." i potem po prostu dać cout <<menu;
3. Przydałoby się default w switchu
4. Funkcja wypelnianie_losowe jest zła - ma ona zwracać wartości typu float, a zawsze zwróci typu int.
5.

Kod: Zaznacz cały

 float suma_ujemna(float tablica[])
{
    int suma = 0;
    for (int i = 0; i < ROZMIAR; i++) {
        if (tablica[i] < 0)
            suma += tablica[i];
    }
    return suma;
}
Skoro ma być zwrócona wartości typu float, to czemu suma jest typu int?
6.

Kod: Zaznacz cały

void przesuniecie_w_lewo(float tablica[])
{
    cout << "Tablica po przesunieciu o 1 w lewo: " << endl;
    for (int i = 0; i < ROZMIAR; i++) {
        if (i == ROZMIAR - 1) {
            cout << tablica[0] << "	";
        }
        else {
            cout << tablica[i + 1] << "	";
        }
    }
}
To jest źle pod kątem optymalizacji - obecnie to działa w ten sposób, że pierwszy if jest sprawdzany zawsze, a else - ROZMIAR-1 razy. Z kolei jeśli zamienić if z elsem:

Kod: Zaznacz cały

void przesuniecie_w_lewo(float tablica[])
{
    cout << "Tablica po przesunieciu o 1 w lewo: " << endl;
    for (int i = 0; i < ROZMIAR; i++) {
        if (i != ROZMIAR - 1) {
            cout << tablica[i+1] << "	";
        }
        else {
            cout << tablica[0] << "	";
        }
    }
}
to if będzie sprawdzany zawsze, a else tylko raz.
w funkcji przesuniecie_w_prawo analogicznie.

7.

Kod: Zaznacz cały

float maksimum(float tablica[])
{
    int maks = tablica[0];
    for (int i = 0; i < ROZMIAR; i++) {
        if (tablica[i] > maks)
            maks = tablica[i];
    }
    return maks;
}
Znowu - tablica jest typu zmiennoprzecinkowego, ale zakładasz, że elementy w niej to typ całkowity.

8. Algorytm w funkcji minimum nie ma prawa zadziałać, chociażby z faktu, że jeszcze raz w środku fora deklarujesz zmienne z indeksem. Nie lepiej zrobić to w ten sposób (ok, może jest nieco gorzej pod kątem wydajności, bo 2 razy trzeba przelecieć całą tablicę - ale w tym przypadku nie ma to większego znaczenia).

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <iso646.h>

const int G_MAX = 40;

void minimum(int *);

int main()
{
    time_t t;
    srand((unsigned int)time(&t));
    int tab[G_MAX];
    for(int i = 0; i < G_MAX; ++i)
    {
        tab[i] = rand() % 100;
        printf("%d ", tab[i]);
    }
    printf("
");
    minimum(tab);
    return 0;
}

void minimum(int tab[])
{
    int min1, min2, min1_index, min2_index;
    if(tab[0] < tab[1])
    {
        min1 = tab[0];
        min1_index = 0;
        min2 = tab[1];
        min2_index = 1;
    }
    else
    {
        min1 = tab[1];
        min1_index = 1;
        min2 = tab[0];
        min2_index = 0;
    }

    for(int i = 2; i < G_MAX; ++i)
    {
        if(min1 > tab[i])
        {
            min1 = tab[i];
            min1_index = i;
        }
    }
    for(int i = 2; i < G_MAX; ++i)
    {
        if(min2 > tab[i] and tab[i] != min1)
        {
            min2 = tab[i];
            min2_index = i;
        }
    }
    printf("Najmniejszy element: %d, indeks: %d
", min1, min1_index);
    printf("Drugi ajmniejszy element: %d, indeks: %d
", min2, min2_index);

}
W języku C, ale akurat pod ręką miałem taki projekt otworzony w IDE. Jedyna różnica - cout zamiast printfa.

9. W funkcji zamiana znowu niepotrzebnie komplikujesz. Lepiej zrobić tak:
1) Wprowadź liczby
2) Pierwsza pętla - znajdź indeks pierwszej liczby i go zapisz - koniec pierwszej pętli
3) Druga pętla - znajdź indeks drugiej liczby i go zapisz - koniec drugiej pętli; pętle nie są zagnieżdżone
4) Zamień dane

10. Nie używaj system("pause"); - powoduje to nieprzenośność kodu (np. zadziała pod Windowsem, a nie zadziała pod OSX/Linuxem).

11. Staraj się używać preinkrementacji, zamiast postinkrementacji (nawet pomimo tego, iż kompilator to powinien zoptymalizować)
ODPOWIEDZ