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.
Nauka programowania - tablice.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 65
- Rejestracja: dni
- Ostatnio: dni
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[].
- Rejestracja: dni
- Ostatnio: dni
- Postów: 93
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 65
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 :).
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Wrocław
peter90 napisał(a):
Oczywiście chodziło mi o język C.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 65
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.
- Rejestracja: dni
- Ostatnio: dni
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 65
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.
- Rejestracja: dni
- Ostatnio: dni
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 65
Czyli pozostaje jedynie zmiana całego kompilatora. No nic, zobaczę co tam ciekawego jest i coś wybiorę.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 166
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ł.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 65
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 :).
- Rejestracja: dni
- Ostatnio: dni
Jest poprawny, starsze kompilatory tego nie łapią, bo nie są zgodne z nowszymi standardami C.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 65
Jeszcze tak gwoli ścisłości, rozumiem że nowy standard już nie zakłada używania calloca albo malloca do inicjalizowania tablic?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 65
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 91
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 65
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;
}
- Rejestracja: dni
- Ostatnio: dni
- Postów: 65
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++)
- Rejestracja: dni
- Ostatnio: dni
- Postów: 65
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ę.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 65
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 91
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 91
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 :/
- Rejestracja: dni
- Ostatnio: dni
- Postów: 65
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.