Skocz do zawartości

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

helfire

[C++] Tablice, case'y

Rekomendowane odpowiedzi

Otóż mam program:

#include <iostream>
using namespace std;
int main()
{
while (true)
{


	int tab[100];
	int x;

	cout << endl << "------------------------------------------------------------" << endl;
	cout << "Menu:" << endl << endl;
	cout << "1.  Wypelnij tablice wartosciami losowymi [0-100]" << endl;
	cout << "2.  Wypelnij tablice wartosciami losowymi [50-100]" << endl;
	cout << "3.  Wypelnij tablice wartosciami losowymi [-1,1]" << endl;
	cout << "4.  Wyswietl wskazana tablice" << endl;
	cout << "5.  Wyznacz sume oraz srednia arytmetyczna elementow w tablicy" << endl;
	cout << "6.  Wyznacz sume elementow zapisanych na parzystych pozycjach w tablicy" << endl;
	cout << "7.  Posortuj wskazana tablice" << endl;
	cout << "8.  Odwroc wskazana tablice" << endl;
	cout << "9.  Przesun wszystkie elementy w tablicy o jedna pozycje w prawo" << endl;
	cout << "10. Przesun wszystkie elementy w tablicy o dwie pozycje w lewo" << endl;
	cout << "11. Wyznacz dwie najmniejsze wartosci w tablicy oraz ich indeksy" << endl;
	cout << "12. Wyznacz ktora wartosc pojawia sie w tablicach najczesciej i ile razy" << endl;
	cout << endl << "Wpisz 0 aby zakonczyc dzialanie programu" << endl;
	cout << "------------------------------------------------------------" << endl;
	cout << endl << "Wybierz opcje" << endl;

	cin >> x;

	switch (x)
	{
	case 1:

		for (int i = 0; i <= 100; i++)
		{
			tab[i] = std::rand() % 101;
		}
		cout << "Zrobione!";
		break;


	case 2:

		for (int i = 0; i < 100; i++)
		{
			tab[i] = std::rand() % 51 + 50;
		}
		cout << "Zrobione!";
		break;


	case 3:

		for (int i = 0; i < 100; i++)
		{
			tab[i] = std::rand() % 3 - 1;
		}
		cout << "Zrobione!";
		break;


	case 4:

		break;

	case 5:  break;
	case 6: break;
	case 7: break;
	case 8: break;
	case 9: break;
	case 10:break;
	case 11:break;
	case 12:break;
	case 0:exit(0); break;

	}

}

system("pause");
return 0;
}

 

W 4 case, muszę zrobić, aby program mi wyświetlił uzupełnioną wcześniej tablice

 

Jeśli zapisuję to tak

cout<<tab[i];

 

To nie działa, i nie mam pomysłu, jak to zrobić

 

Pomoże ktoś?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ale tak po prostu cout << tab, czy w pętli tak jak w innych przypadkach?

 

Co rozumiesz pod "nie działa"? Nic nie wypisuje, źle wypisuje, wywala się?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Taka mała uwaga - w case 1 wychodzisz poza zakres.... Dodatkowo Wypisane będą głupoty, bo w kolejnym przejściu pętli może być tab w innym miejscu pamięci.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Po prostu cout<<tab, wciskając case 4, muszę wyświetlić wcześniejszą tablice. Jednak gdy pisze tak jak pisze, visual wywala mi błąd, że nie zdefiniowano i.

 

Rzeczywiscie, w 1 jest też poza zakresem. Jak byłoby lepiej to zapisać?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

po pierwsze jak już wyżej napisano

 

int tab[100];

 

ma być przed while bo inaczej będzie prawdopodobnie źle działać (tab będzie tworzone i niszczone co przebieg pętli)

 

co do wyświetlania

 

               case 4:

                       for (int i = 0; i < 100; i++)
                       {
                               cout << tab[i] << " ";
                       }
                       cout << endl;
                       cout << "Zrobione!";
                       break;

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dzięki wielkie, tab przed whilem, i 4 w forze. Wszystko śmiga jak należy ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Po prostu cout<<tab, wciskając case 4, muszę wyświetlić wcześniejszą tablice. Jednak gdy pisze tak jak pisze, visual wywala mi błąd, że nie zdefiniowano i.

 

Rzeczywiscie, w 1 jest też poza zakresem. Jak byłoby lepiej to zapisać?

Bo nie zdefiniowano.

Jeżeli deklaracja zmiennej jest w bloku {}, to ona żyje tylko w tym bloku (for-a też to dotyczy).

Biorąc przykład:

               case 4:

                       for (int i = 0; i < 100; i++)
                       {
                               cout << tab[i] << " "; //tu i istnieje i można z tej zmiennej korzystać
                       }
                       //tu i już nie istnieje i użycie jej spowoduje błąd kompilacji
                       cout << endl;
                       cout << "Zrobione!";
                       break;

 

Żeby nie wychodzić poza zakres, to trzeba dać dobry warunek w pętli, czyli nie i<=100, a i<100.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

czyli w pierwszym wystarczy zmienić warunek w pętli z i<=100, na i<100?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tak.

Jak nie wiesz czemu, to polecam zrobić krótki test:

for(int i=0;i<=10;++i) cout<<i<<endline;

A potem zrobić to samo ale z warunkiem <

 

Do tego warto pamiętać, że w C/C++ tablice indeksuje się od 0. Czyli dla 100-elementowej tablicy ostatni element jest pod indeksem 99.

Może się to wydawać nielogiczne, ale ma to uzasadnienie, bo tablica jest w zasadzie wskaźnikiem, a indeks to offset.

Taki mały przykładzik:

#include <stdio.h>

int main()
{
char tab[20]="Ala ma kota";
char *c="Ala ma kota";
printf("%c\n",c[4]);
printf("%c\n",tab[4]);

printf("%s\n",c+4);
printf("%s\n",tab+4);
}

 

Warto pamiętać o tych właściwościach tablicy zwłaszcza jak się używa jej jako argumentu funkcji. Można się przejechać jak nie pamięta się, że to wskaźnik i operacje na argumencie tablicowym wewnątrz funkcji mają wpływ na zewnątrz funkcji.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
' date='27 Listopad 2015 - 16:59' timestamp='1448639955' post='13762325']

[...]

Może się to wydawać nielogiczne, ale ma to uzasadnienie, bo tablica jest w zasadzie wskaźnikiem, a indeks to offset.

[...]

 

Warto pamiętać o tych właściwościach tablicy zwłaszcza jak się używa jej jako argumentu funkcji. Można się przejechać jak nie pamięta się, że to wskaźnik i operacje na argumencie tablicowym wewnątrz funkcji mają wpływ na zewnątrz funkcji.

Może uściśilć warto, bo taki skrót myslowy może namieszac niektórym w głowie i zrobią sobie krzywdę. Nazwa tablicy konwertuje sie na wskaźnik na pierwszy jej element (nie nie jest wskaźnikiem, bo na przykład tab++ zrobić Tobie nie wolno). I do funkcji przekazujemy wskaźnik, a nie tablicę (zazwyczaj, na upartego można przekazać tablicę, ale to nie będzie takie proste).

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

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

×
×
  • Dodaj nową pozycję...