Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

nyac55

[C/C++] Problemy z prostymi zadaniami

Polecane posty

Witam. Mam problem z deklaracją tablicy dynamicznej dwuwymiarowej w języku c++ w programie dev++. A mianowicie nie do końca wiem jak się to robi ,a program po próbie deklaracji przy kompilacji programu pokazuje błędy. Czy mogę prosić o pomoc???

_____________________________________________

Na marginesie program ,który muszę wykonać musi korzystać z tablic.

Pomyślałem ,że najlepiej nada się 2-wymiarowa dynamiczna.

Z treści zadania wynika ,że tablica ma mieć rozmiar 2xN. Program ma wypisywać kolejne potęgi liczb podanych z klawiatury np. :

5 2 -5 0 4 itd.

25 4 25 0 16 itd.

To jest tylko przykład jak program ma wyglądać.

Link do komentarza
Udostępnij na innych stronach

Ok. Dzięki za pomoc. Ale jakbyś mógł podać jak można taką tablicę zadeklarować ,żebym wiedział na przyszłość to byłbym wdzięczny. Próbowałem dla liczb i np.


...
int tab[2][5];
...
tab[2][5]=2*2;

i ta deklaracja tablicy 2-wymiarowej działa ,ale dla tablicy dynamicznej 2-wymiarowej:


int n, *tab;
cin>>n;
tab = new int tab[2][n]; /*ta deklaracja w dev++ już nie działa. Nie wiem może robię coś źle*/

Proszę nie zamykać jeszcze tematu ,gdyż prawdopodobnie będę jeszcze potrzebował pomocy przy pisaniu programów.

____________________________________

Obenie napisałem coś takiego i mam problem z kompilacją. Kompilator wykrywa błędy na cout'ach za pętlą while.


#include <iostream>
#include <cstdlib>
using namespace std;
int main(){
int n,*tab;
cout<<"Wprowadz liczbe dla ktorej ma byc obliczony kwadrat: \n";
while(n!=0){
cin>>n;
for(int i=n; i==n;i++)
{
tab = new int[n];
cout<<tab[n];


}

}

//cout<<tab[n]=n;
//cout<<tab[n]=n*n<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}

Link do komentarza
Udostępnij na innych stronach

Na przyszłość podawaj komunikaty błędów. Po to one są, żeby pomóc w rozwiązaniu problemu.

Ja tu widzę dwa błędy.

Po pierwsze przypisujesz do wskaźnika na typ int podwójny wskaźnik na typ int.

Po drugie taka alokacja nie jest możliwa w C/C++.

Rzecz w tym, że w C/C++ tablica to tak naprawdę obszar pamięci, czyli wskaźnik. W przypadku tablic statycznych (o stałych rozmiarach), kompilator jest w stanie zaszyć odpowiednie informacje w kodzie. Dlatego statyczne tablice mają pewne ułatwienia składniowe i można napisać tak:

int tab[12][34];

tab[y][x];

W praktyce jest to jednak równoważne czemuś takiemu:

int * tab = stack_alloc(sizeof(int) * 12 * 34);

tab[y * 34 + x];

Gdzie stack_alloc to funkcja, która alokuje pamięć ze stosu.

W przypadku dynamicznie alokowanych tablic kompilator nie jest w stanie dodać od siebie odpowiedniego kodu, dlatego trzeba to zrobić samemu. Istnieją dwa sposoby dynamicznej alokacji tablic wielowymiarowych.

1) w jednym bloku pamięci

int * tab = new int [n * m];

tab[y * m + x];

delete [] tab;

2) w wielu blokach pamięci

int ** tab = new int *[n];
for (unsigned int i = 0; i < n; ++i)
{
tab[i] = new int [m];
}

tab[y][x];

for (unsigned int i = 0; i < n; ++i)
{
delete [] tab[i];
}
delete [] tab;

Link do komentarza
Udostępnij na innych stronach

Ja tu widzę dwa błędy.

Po pierwsze przypisujesz do wskaźnika na typ int podwójny wskaźnik na typ int.

Po drugie taka alokacja nie jest możliwa w C/C++.


#include <iostream>
#include <cstdlib>
using namespace std;
int main(){
int n,*tab;
cout<<"Wprowadz liczbe dla ktorej ma byc obliczony kwadrat: \n";
while(n!=0){
cin>>n;
for(int i=n; i==n;i++)
{
tab = new int[n];
cout<<tab[n];


}

}

//cout<<tab[n]=n;
//cout<<tab[n]=n*n<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}

To co tu napisałem miało tyczyć się 1-wymiarowej tablicy alokowanej dynamicznie jednak program się kompiluje lecz nie mogę podać żadnej liczby z klawiatury tylko wyświetla się wprowadzony komunikat. Dalej pisze naciśnij klawisz ,żeby kontynuować i program się zamyka. (Napisałem tak ,bo Hakken polecił mi zrobić to w tablicy 1-wymiarowej z użyciem for'a).

_____________________________

Na początku pisałem ,że chcę użyć tablicy dynamicznej 2-wymiarowej ,bo myślałem ,że na 1-wymiarowej się nie da tego zrobić ,a sam nie wiedziałem jak zadeklarować ową tablicę.(Więc dzięki ,że pokazałeś mi jak mogę to zadeklarować. Przyda mi się to na przyszłość). Jadnak stwierdzam ,że lepiej będzie zrobić to w tablicy dynamicznej 1-wymiarowej ,gdyż nie mam odpowiedniego doświadczenie ,żeby wiedzieć jak napisać to za 1 razem.

+_+_+_+_+_+_+_+_+_

Program ,który przedstawiłem powyżej kompiluje się jednak zawiera jakieś błędy ,gdyż nie mogę do niego wprowadzić ,żadnej liczby ,a tym samym nie mogę wyświetlić tego czego chcę. Czy ktoś mógłby zaznaczyć te błędy i podać jak powinno się ja poprawić.

Link do komentarza
Udostępnij na innych stronach

Program się zamyka po komunikacie gdyż wcześniej nie podajesz wartości 'n'. Ale kod wewnątrz pętli while też jest błędny. Ten for nie ma sensu (pomijając fakt że składnia wewnątrz jest błędna).

Podziel zadanie, które masz zrealizować na kawałki. Po pierwsze, Wystarczy Ci tu spokojnie tablica jednowymiarowa. Zrób tak.

Na początku zapytaj użytkownika dla ilu liczb chce liczyć potęge. Wartość zapisz w zmiennej.

Dalej utwórz tablicę dynamiczną jednowymiarową o takim rozmiarze jak wartość wcześniej odczytanej zmiennej.

Następnie w pętli for od 0 do wartości wcześniej wczytanej pytaj użytkownika o liczby i wpisuj do kolejnych komórek tablicy.

Ostatni krok. W kolejnej pętli for bierz element tablicy, podnoś go do kwadratu i wypisuj na ekran. To wszystko.

Link do komentarza
Udostępnij na innych stronach

Czy chodziło o coś takiego:


#include <iostream>
#include <cstdlib>
using namespace std;
int main(){
int n,*tab;
cout<<"Wprowadz liczbe dla ktorej ma byc obliczony kwadrat: \n";
cin>>n;
for(int i=0;i<=n;i++)
{
cout<<tab[n];
for(int j=0;j<=n;j++)
{
tab[n]=n*n;
cout<<tab[n];
}

}



//cout<<tab[n]=n;
//cout<<tab[n]=n*n<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}

W kodzie są jeszcze błędy, nie bardzo wiem jak je poprawić.

Poniżej umieściłem treść zadania ,które mam zrobić. (Z użyciem tablic)

________________

Czy ktoś może mi napisać ten program jak najprostszą metodą z użyciem tablic???(Treść zadania w załączniku poniżej) z góry dziękuję.

post-345620-0-26330800-1353260971_thumb.

Link do komentarza
Udostępnij na innych stronach

No już niewiele brakuje wink_prosty.gif Popatrz na swojego pierwszego fora bo to tam są błędy. Próbujesz tam wypisać tablicę, która nie jest jeszcze tak naprawdę utworzona i nic do niej nie jest wpisane. Do tego nie zamykasz klamry. Twój pierwszy for powinien wyglądać mniej więcej tak (oczywiście rozwiazanie poglądowe):


//utwórz n-elementową tablicę operatorem new
for(int i=0;i<n;i++)
{
//wpisuj do i-tego elementu tablicy (czyli cin nie cout)
}

Do tego jeśli w pętli chcesz coś robić z elementami tablicy to dostęp masz do nich dzięki zmiennej i a nie n (czyli tab a nie tab[n]), to sprawia że z każdym obiegiem pętli brany jest kolejny element. To tez musisz poprawić.

I nikt tutaj nie napisze za Ciebie gotowego programu. Możemy za to wspomóc i pomóc Ci to zrobić. Polecam też zmienić środowisko, na którym pracujesz na jakieś wygodniejsze, choćby Visual Studio 2010 Express Edition. Łatwiej ustrzec się błędów.

Link do komentarza
Udostępnij na innych stronach

Co jeszcze muszę tutaj zmienić:


#include <iostream>
#include <cstdlib>
using namespace std;
int main(){
int n,*tab;
cout<<"Wprowadz liczbe dla ktorej ma byc obliczony kwadrat: \n";

cin>>n;
for(int i=0;i<n;i++)
{
tab = new int [i];
cin>>tab[i];
tab[i]=n;
for(int j=0;j<=n;j++)
{
tab[i]=n*n;
cout<<tab[i];
}
}

//cout<<tab[n]=n;
//cout<<tab[n]=n*n<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}

Link do komentarza
Udostępnij na innych stronach

No dalej sporo błędów jest.

Tablice musisz tworzyć przed wejściem do pierwszej pętli (robisz to tylko raz) i nie od i a od n.

W pętli tylko odczytujesz dane cinem, to tab=n jest całkowicie zbędne.

Zamknij tą klamrę w tym forze (właśnie dlatego polecam Visual Studio, tam od razu wychwyciło by taki błąd).

W drugim forze daj warunek < nie <= gdyż wyjedziesz poza zakres tablicy.

Przeszukuj tablicę po j a nie po i (przecież teraz zmienną, która się zwieksza jest j).

Mnożysz przez siebie wartości tablicy a nie n, czyli

tab[j] = tab[j] * tab[j]

No i wypisujesz też tab[j] a nie tab.

A na koniec poważne pytanie. Czy Ty chcesz się nauczyć programować, czy po prostu chcesz mieć program na informatyke, a w żadnym wypadku programowanie Cię nie interesuje? Bo jeśli to pierwsze to bierz książkę (Symfonia C++) albo jakiś kurs z neta i jedź dokładnie od samego początku. A jeśli to drugie to może ktoś łaskawie napiszę ten program za Ciebie (ja się boje, że zostane "stracony" za to przez moderatorów :D)

Link do komentarza
Udostępnij na innych stronach

Dalej błędy:

In lambda function:

16 14 D:\PROGRAMY C++\l6zad1a.cpp [Error] expected '{' before '*' token

D:\PROGRAMY C++\l6zad1a.cpp In function 'int main()':

16 14 D:\PROGRAMY C++\l6zad1a.cpp [Warning] lambda expressions only available with -std=c++0x or -std=gnu++0x [enabled by default]

In lambda function:

16 18 D:\PROGRAMY C++\l6zad1a.cpp [Error] expected '{' before ';' token

D:\PROGRAMY C++\l6zad1a.cpp In function 'int main()':

16 18 D:\PROGRAMY C++\l6zad1a.cpp [Warning] lambda expressions only available with -std=c++0x or -std=gnu++0x [enabled by default]

16 18 D:\PROGRAMY C++\l6zad1a.cpp [Error] no match for 'operator*' in '{j} * {j}'


#include <iostream>
#include <cstdlib>
using namespace std;
int main(){
int n,j,i,*tab;
cout<<"Wprowadz liczbe dla ktorej ma byc obliczony kwadrat: \n";
tab = new int [j];

for(int i=0;i<n;i++)
{
cin>>tab[i];
for(int j=0;j<n;j++)
{
cout<<tab[i];
tab[j]=[j]*[j];
cout<<tab[j];
}
}

//cout<<tab[n]=n;
//cout<<tab[n]=n*n<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}

Link do komentarza
Udostępnij na innych stronach

Nie odpowiedziałeś na moje pytanie kolego ;)

Co do błędów: nie podajesz liczby elementów, j nie jest znane, więc jak chcesz stworzyć tablicę o rozmiarze j?

Musisz cinem wcześniej pobrać zmienną i wtedy stworzyc tablicę o rozmiarze jak tej zmiennej.

Cały czas nie zamykasz pierwszej pętli. Zamknij ją klamrą '}';

W drugiej petli pierwsze wypisywanie jest całkowicie bez sensu i niepotrzebne.

I nie [j] * [j] a tab[j] * tab[j].

Naprawdę, z błędami jakie robisz to polecam symfonie i to dokładnie od początku.

Wieczorem napiszę Ci ten program wraz z objaśnieniami która linia co robi, jeśli dalej będziesz miał błędy...

Link do komentarza
Udostępnij na innych stronach


#include <iostream>
using namespace std;

int main()
{
int n,*tab;
cout<<"Podaj liczbę liczb, którą chcesz podnieść do kwadratu:\n";

//podajesz ilosc licz jakie chcesz podniesc do kwadratu
cin>>n;

//deklarujesz n-elementowa tablice
tab = new int[n];

//w petli podajemy liczby do elementow tablicy
for(int i=0; i<n; ++i)
{
cout<<"Podaj liczbe nr "<<i<<"\n";
cin>>tab[i];
}
cout<<"\n";

//w petli mnozymy kazdy element tablicy przez siebie (czyli podnosimy do kwadratu) i wypisujemy
for(int j=0; j<n; ++j)
{
tab[j] = tab[j] * tab[j];
cout<<tab[j]<<" ";
}

system("pause");
return 0;
}

Link do komentarza
Udostępnij na innych stronach

Dzięki za pomoc. Teraz rozumiem. Bardzo fajnie ,że napisałeś komentarze ,które mogą pomóc i wyjaśniają jak działa program.


#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
int n,j,x,b;
cout<<"Podaj ile elementow ma zawierac ciag: \n";
cin>>n;
for(int i=1;i<=n;i++)
{
if(n%3==0)
{x=1;
cout<<x;
}
else if(n%3==1)
{x=2;
cout<<x;
}
else if(n%3==2)
{x=3;
cout<<x;
}


}

system("PAUSE");
return 0;
}

Obecnie próbuję napisać program ,który:

1. Wypisać ciąg n-elementowy zawierający następujące elementy:

a) 1, 2 ,3,1 ,2,3,1,2,3,1,2,3...,

tzn. podam np. 8 to program wypisze mi 8 wyrazów tego ciągu ,czyli: 1,2,3,1,2,3,1,2.

Link do komentarza
Udostępnij na innych stronach

@up - nie wiem czemu się dziwisz, że Ci nie działa, skoro dzielisz modulo 3 liczbę n a nie i.

Poza tym for od 1 to dość ryzykowny zabieg - w zważywszy na numerowanie tablic w c++ od 0, robienie fora od 1 to proszenie się o pominięcie pierwszego indeksu i wyjazd za prawą granicę.

Link do komentarza
Udostępnij na innych stronach

Przekombinowałeś. Zauważ, że wypisujesz tu cały czas ciąg "1,2,3" więc możesz przecież wypisywać go na sztywno:


cout<<" 1 2 3 ";

Wtedy wystarczy Ci to wszystko wsadzić do 1 fora od 0 do n-1 i już po robocie.

Down: Faktycznie, nie przeczytałem dokładnie jak ma działać program. Ale widzę, że już wies.niak pospieszył z pomocą ;)

Link do komentarza
Udostępnij na innych stronach

Przesadziłeś z tymi warunkami w pętli. Zauważ, że jeśli wywalisz warunek i wyświetlisz wynik dzielenia modulo, to dostaniesz 0, 1, 2, 0, 1, 2 itd (zaczynając pętlę od 0). Zresztą Twoje warunki w pętli to potwierdzają. Skoro tak, to wystarczy zwiększyć wszystkie wartości o 1 by uzyskać to, co chcesz.

Podsumowując, zrób po prostu

cout << i%3 + 1;

gdzie i jest z zakresu <0, n-1>.

Link do komentarza
Udostępnij na innych stronach

Dzięki za poradę. Zmieniłem i działa.


#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
int n,j,x,b;
cout<<"Podaj ile elementow ma zawierac ciag: \n";
cin>>n;
for(int i=0;i<=n-1;i++)
{
if(i%3==0)
{x=1;
cout<<x;
}
else if(i%3==1)
{x=2;
cout<<x;
}
else if(i%3==2)
{x=3;
cout<<x;
}


}

system("PAUSE");
return 0;
}

_________________________

Proszę nie zamykać jeszcze tematu.

Link do komentarza
Udostępnij na innych stronach

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

i<n zamist i<=n-1 pozwoli Ci tworzyć czytelniejszy kod.

Nie wspominając już o tym, że bez sensu robisz zmienną x. Jeżeli nie możesz się dać przekonać do zastosowania rozwiązania

cout << i%3 + 1;

to wypisuj bezpośrednio 1,2 oraz 3, a nie podstawiasz je za x, a potem wypisujesz.

Link do komentarza
Udostępnij na innych stronach

OK. Dzięki.

Teraz podobny program ,tylko ,że wyświetla ciąg n-elementowy: 1,-1,2,-2,3,-3 ,a w swoim mam jeszcze błędy ,co powinienem zmienić(poprawić):


#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
int n,i,x;
cout<<"Podaj ilosc elementow ciagu:\n";
cin>>n;
for(int i=1;i<=n;i++)
{
if(i%2==1)
cout<<i;
else if(i%2==0)
cout<<-i;
}
system("PAUSE");
return 0;
}

Link do komentarza
Udostępnij na innych stronach

No więc ja to zrobiłem w pętli nieskończonej while, przerywając ją w odpowiednim momencie.


int i=1 //to co inkrementujemy
int x=1 //to co wyswietlamy
int n=5 //to ile chcemy wyswietlic
while(1)
{
//1.sprawdzaj warunke czy i>n, jesli tak to break
//2.wyswietlaj x
//3.mnoz x przez -1 (zmienia sie znak za kazdym razem)
//4.inkrementuj i
//powtorz kroki 1-4 jeszcze raz
//inkrementuj x
}

Pewnie można to prościej jakoś zrobić, niemniej jednak tak też działa biggrin_prosty.gif

EDIT: No, już jest ładniejsze rozwiązanie, tym razem ja przecudowałem ;)

Link do komentarza
Udostępnij na innych stronach

Dzięki za pomoc. Mam jeszcze pytanie do t3tris ,a mianowicie:


for(int i=0;i<n;i++)
{
if(i%2==0)
++x;
cout<<x<<", ";
x=-x;
}

[Nie wiem gdzie w pętli zmienia się wartość z ujemnej na dodatnią]???-pytanie dodatkowe

Czy mógłbyś dodać komentarze ,jaki dokładne będzie przebieg pętli (jaka wartość zostanie zwrócona) oraz jak będą zmieniać się wartości z tak ,żeby ciąg był: 1,-1. (Ja sam próbowałem napisać program na podstawie twojego i moim wynikiem jest ciąg (-1,2,-3,4 itd.) --> tzn. nie rozumiem jeszcze co mam wpisać ,żeby wypisywało wartości np. 1,-1,2,-2.

[Nie wiem gdzie w pętli zmienia się wartość z ujemnej na dodatnią] ??? - pytanie dodatkowe

(Poniżej zamieszczam swoje dokonania).


#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
int n,x=0;
cout<<"Podaj dlugosc ciagu: \n";
cin>>n;
for(int i=1;i<=n;i++)
{
//x=i;
if(i%2==0)
{
x=i;
}
else if(i%2==1)
{
x=-i;
}
cout<<x<<", ";
x++;
}
system("PAUSE");
return 0;
}

Sory za moje pytania ,ale chcę się nauczyć ,by wiedzieć jak to zrobić samemu.

Link do komentarza
Udostępnij na innych stronach



  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.

×
×
  • Utwórz nowe...