Nauka programowania - tablice.

0

Witam Serdecznie.
W dalszym etapie nauki programowania zająłem się tablicami. Mam w związku z tym jedno pytanie. Czy mógłbym prosić o jakiś prosty przykładzik w którym zainicjuje się tablice a następnie wypełni się ją cyframi ale wpisanymi z klawiatury tzn na początku inicjuję tablicę, podaję liczbę cyfr/liczb które chcę wpisać (cyfra ta staje się rzecz jasna wielkością tablicy) a następnie podaję po kolei cyfry/liczby które będą wpisane do tablicy. Z góry dziękuje.

0

Hmm, w internecie nie ma już przykładów?

int N;
cin>>N;
int* tab = new int[N];
for(int i = 0;i < N;++i)
    cin>>tab[i];

Na końcu należy oczywiście zwolnić pamięć za pomocą delete[].

0

Nie określiłeś w jakim to ma być języku, więc ja malutki przykład dam Ci w C:

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

int main()
{
   int n,i;

   printf("Liczba elementow: ");
   scanf("%d", &n);

   int tab[n];

   for (i=0; i<n;i++)
   {
       printf("Liczba nr %d: ", i+1);
       scanf("%d", &tab[i]);
   }

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


Najlepiej to takie rzeczy zrobić by było przy pomocy tablic dynamicznych, ale raczej na razie takie coś Ci wystarczy.

0

Dziękuję bardzo :). Oczywiście chodziło mi o język C. Druga sprawa, w internecie przykłady są ale to są przykłady w sensie np jakiś większy działający program a mi zależało wyłącznie na tym co napisałem, czyli konkretna inicjalizacja tablicy. Jak wspomniałem, dopiero się uczę, próbowałem już na przykładzie takiego jednego programu wydedukować jak taką tablicę z wczytywaniem danych z klawiatury za inicjalizować i nic mi nie wyszło. Jeszcze nie ten etap. Na pewno za jakiś miesiąc dwa będę taki kod że tak powiem w głowie kompilował ale jeszcze nie teraz :).

1
peter90 napisał(a):

Oczywiście chodziło mi o język C.

http://sjp.pwn.pl/lista.php?co=oczywiście

0

Witam Serdecznie.
Czy ja mógłbym prosić o pomoc co z kodem kolego mic4ael jest nie tak? Chodzi o to że podczas kompilacji kompilator wyświetla mi dwa błędy, oto one:

error C2057: expected constant expression
error C2466: cannot allocate an array of constant size 0

Wygląda na to że kompilator nie akceptuje tej wielkości "n" tablicy i chce aby mu podać konkretny rozmiar tablicy. Doświadczenia z tablicami jeszcze nie mam, dopiero je poznaje, moja wiedza w tym temacie jest kwestia czysto teoretyczna. Czy taką tablicę, której wielkość będziemy podawali z klawiatury, da się w ogóle zrobić metodą statyczną? Trochę na temat tablic czytałem i wydaje mi się że tablice statyczne stosuje się wyłącznie wtedy gdy w kodzie deklarujemy jej wielkość a w moim przypadku rozmiar tablicy jest podawany z klawiatury podczas działania programu zatem sądzę że należało by skorzystać z tablicy dynamicznej. Bardzo Was proszę o pomoc.

0

Używasz kompilatora który nie spełnia obecnych standardów.
Musiałbyś zrobić tak:

int* tab = calloc(N, sizeof(int));
... używaj tablicy...
free(tab);

Czy taką tablicę, której wielkość będziemy podawali z klawiatury, da się w ogóle zrobić metodą statyczną?
Da, np. w GCC albo Clang, ale nie w Visualu, który zatrzymał się na standardzie C89.

0

Używam Visual Studio C++ 2008. Czyli polecasz ściągnąć i zainstalować nowszą wersję visual'a? Bo może się okazać że w dalszych etapach nauki pojawią się inne problemy właśnie przez kompilator.

0

Nowsza wersja Visuala (nawet beta 11) i tak nie pozwala na VLA (variable-length arrays) w C, więc tu ci akurat nie pomoże.
Oczywiście możesz zainstalować nowszą wersję, ale 2008 jest całkiem stabilna.

0

Czyli pozostaje jedynie zmiana całego kompilatora. No nic, zobaczę co tam ciekawego jest i coś wybiorę.

0
peter90 napisał(a):

Czyli pozostaje jedynie zmiana całego kompilatora. No nic, zobaczę co tam ciekawego jest i coś wybiorę.

Możesz jeszcze nie korzystać z VLA i tablicę alokować dynamicznie przez malloc() lub calloc(), tak jak już kolega wyżej pokazał.

0

Czyli kod który podał kolega mic4ael jest zły? Pytam bo wrzuciłem go do code blocks'a i wszystko ładnie ruszyło tylko nie wiem czy to jest poprawnie zaalokowana tablica bo to że kod działa o niczym jeszcze nie świadczy. Także proszę o komentarz do tego kodu, czy jest on błędy czy też nie :).

0

Jest poprawny, starsze kompilatory tego nie łapią, bo nie są zgodne z nowszymi standardami C.

0

Jeszcze tak gwoli ścisłości, rozumiem że nowy standard już nie zakłada używania calloca albo malloca do inicjalizowania tablic?

0

Jeszcze jedno pytanko. Jak się panowie iteruje tablice? Chodzi mi o przelecenie po kolei jej zawartości która została wklepana z klawiatury a następnie porównywanie dwóch sąsiednich wartości i posegregowanie ich w rosnącej kolejności. Z posegregowaniem nie będzie problemu tylko po prostu nie wiem jak się odwołać do danej wartości w danej komórce tablicy. Próbowałem to robić porównując tab[i] z tab[i+1] i jeśli tab[i] było większe to stawało się tab[i+1] następnie i++ i tak aż do i<=n ale niestety nie nie działa bo zamiast do wartości wpisanych w tablice odwołuje się chyba do adresów tablicy bo na końcu wypluwa mi jakiś ciąg liczb który wydaje mi się że jest właśnie adresem danej komórki.

0

Pewnie wyskakujesz poza zakres.

0

Czyli sama metoda jest prawidłowa?

0

Tak, ale robisz for(int i=0; i<ilosc-1);i++). -1 dlatego, że jak miałbyś i=ilosc i byś dodał w pętli 1, to byś wyszedł poza zakres
Jeśli masz tablicę kwadratową, to trochę inaczej.

0

Chyba jednak poza zakres nie wyjeżdżam. Coś jest nie tak z tym porównywaniem. Cały kod wygląda następująco:

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

int main()
{
   int n,i;

   printf("Liczba elementow: ");
   scanf("%d", &n);

   int tab[n];

   for (i=0; i<n;i++)
   {
       printf("Liczba nr %d: ", i+1);
       scanf("%d", &tab[i]);
   }

for(i=0; i<=n; i++){
   if (tab[i]>tab[i+1]) {
   tab[i+1]=tab[i];
   }

}
printf("%d, ", tab[i+1]);

    getchar();
    return 0;
}
 
0

i<n-1 ma być.

0

Mówisz o tej pętli for? Zmieniłem tak ja poniżej ale nadal bez zmian. Na końcu drukuje mi ciąg liczb.

for(i=0; i<=n-1; i++)
 
0

<, a nie <=

0

Kod w tej chwili wygląda dokładnie tak:

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

int main()
{
   int n,i;

   printf("Liczba elementow: ");
   scanf("%d", &n);

   int tab[n];

   for (i=0; i<n;i++)
   {
       printf("Liczba nr %d: ", i+1);
       scanf("%d", &tab[i]);
   }

for(i=0; i<n-1; i++){
   if (tab[i]>tab[i+1]) {
   tab[i+1]=tab[i];
   }
}
printf("%d, ", tab[i+1]);
    getchar();
    return 0;
}
 

A w załączniku screen jaki dostaję wynik. Te linijki na dole zaczynające się od Proces returned to są od Code Blocks'a i zawsze się pojawiają także można to olać. Nad Proces returned .... jest wynik jaki dostaję.

0

Chcę wyłapać max ze wszystkich wpisanych do tablicy liczb a w tablicy robi się to w taki sposób że porównuje się dwa sąsiednie elementy, ustawia się (w moim przypadku) w kolejności rosnącej a następnie drukuje ostatni element tablicy który automatycznie jest tym największym elementem.

0

To tak to nie posortujesz, musisz dać jeszcze jedną pętlę, przeczytaj o sortowaniu bąbelkowym. A na koniec nie tab[i+1], tylko i[n-1], tak będzie czytelniej.

0

C++ :)

#include <iostream>
#include <conio.h>
 
using namespace std;

int main()
{
   int n; //ilosc elementow
   int *tab; //tablica
 
   cout << "Liczba elementow: ";
   cin >> n;
 
   tab = new int[n]; //tab to tablica n-elementow
 
   // wczytanie elementow
   for (int i=0; i<n; i++)
   {
       cout << "Liczba nr " << i+1 <<": ";
       cin >> tab[i];
   }
 
   //posortowanie
   for (int i=0; i<n-1; i++) { 
		for (int j=0; j<n-1; j++){
			if (tab[j] > tab[j+1]) {
				int temp = tab[j];
				tab[j]=tab[j+1];
				tab[j+1] = temp;
			}
		}
	}

   //wyswietlenie ostatniego elementu
	cout << tab[n-1] << " ";

	delete[] tab; //skasowanie tablicy
	getch();
    return 0;
}

Dziwnie mi to tu sformatowało :/

0

Możesz zerknąć w ten kod:

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

int main()
{
   int n,i;

   printf("Liczba elementow: ");
   scanf("%d", &n);

   int tab[n];

   for (i=0; i<n;i++)
   {
       printf("Liczba nr %d: ", i+1);
       scanf("%d", &tab[i]);
   }

for(i=0; i<n-1; i++){
   if (tab[i]>tab[i+1]) {
   tab[i+1]=tab[i];
   }
}
n=tab[n-1];
printf("%d, ", n);

    getchar();
    return 0;
}
 

Działać działa tylko nie wiem czy jest to poprawnie zakodowane.

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