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.
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[]
.
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.
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 :).
peter90 napisał(a):
Oczywiście chodziło mi o język C.
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.
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.
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.
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.
Czyli pozostaje jedynie zmiana całego kompilatora. No nic, zobaczę co tam ciekawego jest i coś wybiorę.
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ł.
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 :).
Jest poprawny, starsze kompilatory tego nie łapią, bo nie są zgodne z nowszymi standardami C
.
Jeszcze tak gwoli ścisłości, rozumiem że nowy standard już nie zakłada używania calloca albo malloca do inicjalizowania tablic?
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.
Pewnie wyskakujesz poza zakres.
Czyli sama metoda jest prawidłowa?
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.
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;
}
i<n-1 ma być.
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++)
<, a nie <=
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ę.
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.
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.
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 :/
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.