C,wskaźniki

piasektt
Użytkownik
Użytkownik
Posty: 195
Rejestracja: 14 paź 2007, o 20:59
Płeć: Mężczyzna
Lokalizacja: MM
Podziękował: 29 razy

C,wskaźniki

Post autor: piasektt »

Witam
Proszę o poprawienie programu.Treść zadania: Zainicjuj tablicę, a następnie przekopiuj jej zawartość do dwóch innych tablic.Użyj funkcji, wykorzystującej notację wskaźnikową.

Kod: Zaznacz cały

#include <stdio.h> 
#include <conio.h> 


void kopiowanie_tablica(int *tab1, int *tab2, int rozmiar) 
{ 
for(int i=0; i<rozmiar; ++i) 
{ 
tab2[i]=tab1[i]; 
} 
} 


void drukuj(int *tab, int rozmiar) 
{ 
for(int i=0; i<rozmiar; ++i) 
{ 
printf("Element [ %d ]: %d
", i, tab[i]); 

} 
} 

int main(void) 
{ 
int i, rozmiar; 
int tablica1[rozmiar]; 
int tablica2[rozmiar]; 
int r; 
printf("Podaj ilu elementowe maja byc tablice!! :"); 
scanf("%d", &rozmiar); 
printf("
 A teraz podaj elementy pierwszej tablicy:
"); 

for(i=0; i<rozmiar; ++i) 
{ 
scanf("%d", &tablica1[i]); 
} 

printf("Kopiujemy tablice 1 do 2
"); 
kopiowanie_tablica(tablica1, tablica2, rozmiar); 
printf("tablica 1
"); 
drukuj(tablica1, rozmiar); 
printf("Tablica 2
 "); 
drukuj(tablica2, rozmiar); 
getche(); 

return 0; 
} 
spajder
Użytkownik
Użytkownik
Posty: 735
Rejestracja: 7 lis 2005, o 23:56
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 2 razy
Pomógł: 133 razy

C,wskaźniki

Post autor: spajder »

Kod: Zaznacz cały

int i, rozmiar;
int tablica1[rozmiar];
int tablica2[rozmiar];
int r;
printf("Podaj ilu elementowe maja byc tablice!! :");
scanf("%d", &rozmiar); 
po pierwsze zmień kolejność. Na początku zmienna rozmiar jest niezainicjowana (może mieć np. wartość -5), a tworzenie tablicy o takim rozmiarze nie jest najlepszym pomysłem . Można to zrobić tak:

Kod: Zaznacz cały

scanf("%d", &rozmiar); 
int tablica1[rozmiar];

Kod: Zaznacz cały

getche(); 
Ta funkcja nazywa się getch() i raczej warto jej nie używać (kwestia przenośności itp). Proponuję piękny kod:

Kod: Zaznacz cały

#ifdef _WIN32
    system("pause>>nul");
#endif
Jeśli będzie do tego potrzebował wyjaśnienia to pisz.

Co do samej funkcji kopiującej (to samo możesz zastosować w funkcji wyświetlającej) to wystarczy zmienić rodzaj indeksowania. Jeśli chcesz się odwołać to elementu i tablicy tab możesz to zrobić na dwa sposoby:

Kod: Zaznacz cały

tab[i];
*(tab+i);       // nawiasy są ważne!!!
Te instrukcje robią to samo. W programie masz napisaną pierwszą wersję, wystarczy w tych dwóch funkcjach wszystko pozmieniać na drugą.
Mam nadzieję, że to pomoże.
piasektt
Użytkownik
Użytkownik
Posty: 195
Rejestracja: 14 paź 2007, o 20:59
Płeć: Mężczyzna
Lokalizacja: MM
Podziękował: 29 razy

C,wskaźniki

Post autor: piasektt »

Panie Spajder,czy mozesz podać kod z uzytymi poprawkami,by działał. Próbowałem sam poprawic ale nie udało mi się.
Awatar użytkownika
argv
Użytkownik
Użytkownik
Posty: 569
Rejestracja: 27 maja 2009, o 01:27
Płeć: Mężczyzna
Podziękował: 51 razy
Pomógł: 66 razy

C,wskaźniki

Post autor: argv »

1. W C to nie przejdzie:

Kod: Zaznacz cały

for(int i=0; i<rozmiar; ++i) 
Zmienną musisz zdefiniować poza pętlą

2.

Kod: Zaznacz cały

void kopiuj(int *tab1, int *tab2, int r)
{
	while(r--) *(tab2+r) = *(tab1+r);
}
Chyba najoszedniejsza wersja z tym że kopiuje od konca nie poczatku, ale co to ma za znaczenie
spajder
Użytkownik
Użytkownik
Posty: 735
Rejestracja: 7 lis 2005, o 23:56
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 2 razy
Pomógł: 133 razy

C,wskaźniki

Post autor: spajder »

@piasektt, pokaż co Ci wyszło z tych poprawek
ODPOWIEDZ