Zmienna nazwy zmiennej - istnieje?

0

Witam,

przejdę od razu do przykładu bo tak będzie najprościej:

Mam jednowymiarowe tablice : tab1[],tab2[],tab3[].
Chcę im nadać wartości za pomocą zagnieżdżonych pętli for.
Jedna (i=0;i<3;i++) odpowiadała by za zmianę tablicy z tab1 na tab2 i potem tab3,a druga(j=0;j<rozm;j++) za nadawanie wartości każdej kolumnie w danej tablicy.

Czy istnieje jakiś sposób aby w pierwszej pętli zmienna "i", zmieniała nazwę tablicy?
Tzn dla i=0 np coś w stylu tab%d [],gdzie %d to i+1 ? Dzięki temu otrzymałbym prosty i szybki sposób na zapisanie wszystkich tablic po kolei.

Z góry dzięki za pomoc.

0

Najprościej będzie zrobić jedną, dwuwymiarową tablicę. Wtedy będziesz się do niej odwoływał przez tab[i][j]

0

Wszystko by było ok,tylko treść zadania na to nie pozwala.Musi być w jednowymiarowej tablicy,a dopiero później mam je scalić do jednej 2d.

Probowałem problem rozwiązać switchem i wskaźnikiem - w zależności od case'a wskaźnik wskazywał inną tablicę - ale to nie jest zbyt wydajny sposób,nie mówiąc co by było w przypadku większej ilości takich tablic.

Jakieś pomysły?

0

Lepiej wstaw treść zadania, bo coś mi się zdaje że próbujesz wynaleźć kwadratowe koło.

0

Czyli masz stworzonych kilka tablic. Pewnie z tą samą ilością elementów, skoro taki sposób sam sobie obrałeś. Może funkcja, która przyjmuje jako argumenty tablicę i wartość jaką chcesz ją uzupełnić? W tym sposobie masz ten plus, że tablice mogą mieć różne rozmiary. Jeśli tablic jest mało, to możesz wywołać ręcznie funkcję dla każdej z nich. Jeśli jest ich więcej, to użyj vectora albo i zwykłej tablicy do przechowywania w niej wskaźników do tablic, a potem wywołuj dla nich funkcję w pętli.

0

Przepisałem tylko tą interesującą część,bo całe jest za długie.

"Napisz program ,który prosi użytkownika o podanie trzech zbiorów składających się z pięciu liczb ,zapisuje je do osobnych jednowymiarowych tablic,a następnie:
-Scala trzy tablice jednowymiarowe,w tablicę typu 2D,o rozmiarze 3x5.
-Oblicza średnią dla każdego zbioru z osobna

  • (...)
    (...)
    -Wyświetla wszystkie wyniki

Każdy z podpunktów powinien być obsługiwany przez osobne funkcję.
(...) "

To powinno wystarczyc.

0

Zadanie jest takie to po prostu leć trzema forami i przepisz z tych tablic do tej dwuwymiarowej.

nie mówiąc co by było w przypadku większej ilości takich tablic.
W przypadku większej ilości tablic nikt normalny by nie dał takiego zadania.

0

zrób sobie trzecją tablice 3x1 ze wskaźnikami do tych tabliv jednowymiarowych.

0

Rozumiem, w takim razie spróbuję z tą tablicą wskaźników bo pomysł faktycznie jest wart uwagi.
Dzieki ! :)

2

No... to jest przeciez normalne zadanie. Zrób np. tablice:

int tab[3][5];
 

i przepisuj każdą z trzech tablic w jednej pętli for:

 
for(int i=0;i<5;i++){
    tab[0][i]=tab1[i];
    tab[1][i]=tab2[i];
    tab[2][i]=tab3[i];
}
0

@Złoty Pomidor Tablica wskaźników do tablic to jest prawie jak tablica dwuwymiarowa (w przypadku tablicy dynamicznej to jest dokładnie to samo).

0

@grzesiek51114 Wiem ,że normalne ale chyba się nie zrozumieliśmy bo napisałeś mi kod który scala tablice jednowymiarowe do 2d,a mi chodzi tylko i wyłącznie o kwestie wprowadzania danych do tych pojedynczych tablic (za pomocą scanf). Chciałem użyć 2 pętli zagnieżdżonych for,jednej do zmieniania tablicy jednowymiarowej,a drugiej wewnętrznej do nadawania wartości aktualnie wybranej tablicy. Tyle ,że nie potrafię to zrobić inaczej niż za pomocą case'a...

0

No to nie wiem... O to Ci chodziło?

#include <stdio.h>

int main(void)
{
    int tab1[5], tab2[5], tab3[5];
    int tab[3][5];

    int i=0, j=0;
    for(i=0;i<3;i++){
        for(j=0;j<5;j++){
            if(i==0){
                printf("Podaj tab1[%d]:", j);
                scanf("%d", &tab1[j]);
                tab[i][j] = tab1[j];
            }
            else if(i==1){
                printf("Podaj tab2[%d]:", j);
                scanf("%d", &tab2[j]);
                tab[i][j] = tab2[j];
            }
            else if(i==2){
                printf("Podaj tab3[%d]:", j);
                scanf("%d", &tab3[j]);
                tab[i][j] = tab3[j];
            }
        }
    }

    for(i=0;i<3;i++){
        for(j=0;j<5;j++)
            printf("%d ", tab[i][j]);
        printf("\n");
    }

    return 0;
}

Chociaż... poniższe rozwiązanie jest szybsze, bo warunek sprawdzany jest tylko w pierwszym zagnieżdżeniu i każda zagnieżdżona pętla leci już bez jego sprawdzania:

#include <stdio.h>

int main(void)
{
    int tab1[5], tab2[5], tab3[5];
    int tab[3][5];

    int i=0, j=0;
    for(i=0;i<3;i++){
        if(i==0){
            for(j=0;j<5;j++){
                printf("Podaj tab1[%d]:", j);
                scanf("%d", &tab1[j]);
                tab[i][j] = tab1[j];
            }
        }
        else if(i==1){
            for(j=0;j<5;j++){
                printf("Podaj tab2[%d]:", j);
                scanf("%d", &tab2[j]);
                tab[i][j] = tab2[j];
            }
        }
        else if(i==2){
            for(j=0;j<5;j++){
                printf("Podaj tab3[%d]:", j);
                scanf("%d", &tab3[j]);
                tab[i][j] = tab3[j];
            }
        }
    }

    for(i=0;i<3;i++){
        for(j=0;j<5;j++)
            printf("%d ", tab[i][j]);
        printf("\n");
    }

    return 0;
}

Jeszcze za pomocą wskaźnika możesz:

#include <stdio.h>

int main(void)
{
    int tab1[5], tab2[5], tab3[5];
    int tab[3][5];

    int i=0, j=0;
    int *wsk=NULL;
    for(i=0;i<3;i++){
        if(i==0) wsk=tab1;
        else if(i==1) wsk=tab2;
        else if(i==2) wsk=tab3;
        for(j=0;j<5;j++){
            printf("Podaj tab[%d]:", j);
            scanf("%d", &wsk[j]);
            tab[i][j] = wsk[j];
        }
    }

    for(i=0;i<3;i++){
        for(j=0;j<5;j++)
            printf("%d ", tab[i][j]);
        printf("\n");
    }

    return 0;
}

Jak nie o to Ci chodziło to ja już nie wiem o co :)

0

Ot właśnie o to mi chodziło dokładnie,tyle że tak jak Ty już zrobiłem (przynajmniej podobnie,bo ja użyłem switch'a zamiast if'ow),a pytałem czy jest jakiś inny szybszy sposób ;)
No nic,zrobiłem już normalnie,każdą tablicę osobno.Jest dłużej ale znacznie prościej.

0

Prościej się nie da. Nie możesz zmienić nazwy tablicy zadeklarowanej w programie. Najszybciej jest poprzez wskaźnik tak jak podałem w sposobie trzecim (ustawiając wskaźnik robisz taką "quazi zmianę nazwy", bo używasz później wskaźnika zamiast nazwy tablicy.). Cóż, jeżeli rozwiązanie Ci pasuje to zaznacz prawidłowe posty i odfajkuj wątek. Więcej się tutaj chyba nie da napisać.

0

Dokładnie.Oznaczyć,ani odfajkować chyba nie mogę jako niezalogowany użytkownik.Chyba ,że czegoś nie wiem :)
Nie mniej jednak dzięki za pomoc i poświęcony czas.

1 użytkowników online, w tym zalogowanych: 0, gości: 1