• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Tablice dwuwymiarowe i pętla for.

VPS Starter Arubacloud
0 głosów
1,656 wizyt
pytanie zadane 9 października 2017 w C i C++ przez Kamil Początkujący (430 p.)
edycja 9 października 2017 przez Kamil
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <string>




using namespace std;
int main()
{
	int wynik = 0, wynik2 = 0, wynik3 = 0;
	const int liczbyM = 12;
	const int miesiac = 3;
	int dodatkoweM, dodatkoweM2, dodatkoweM3;


	const string miesiace[miesiac][liczbyM]
	{
	 { "styczen2015", "luty2015", "marzec2015", "kwiecien2015", "maj2015", "czerwiec2015", "lipiec2015", "sierpien2015", "wrzesien2015", "pazdziernik2015", "listopad2015", "grudzien2015" },
	  { "styczen2016", "luty2016", "marzec2016", "kwiecien2016", "maj2016", "czerwiec2016", "lipiec2016", "sierpien2016", "wrzesien2016", "pazdziernik2016", "listopad2016", "grudzien2016"},
		 {"styczen2017", "luty2017", "marzec2017", "kwiecien2017", "maj2017", "czerwiec2017", "lipiec2017", "sierpien2017", "wrzesien2017", "pazdziernik2017", "listopad2017", "grudzien2017"}
		 };


	for (int i = 0, k = 0; k<liczbyM; ++k)
	{
	cout<<"Podawaj kolejne liczby sprzedazy za miesiace: "<<miesiace[i][k]<<": ";
	cin>>dodatkoweM;
	}

	for(int i = 1, k = 0; k<liczbyM; ++k)
	{ 
	cout<<"Nastepny rok sprzedazy ksiazek za miesiace: "<<miesiace[i][k]<<": ";
	cin>>dodatkoweM2;
	}

	for(int i = 2, k = 0; k<liczbyM; ++k)
	{ 
	cout<<"Ostatni rok sprzedazy ksiazek za miesiace: "<<miesiace[i][k]<<": ";
	cin>>dodatkoweM3;
	}
	

	
	
	


	system("pause");
	return 0;
}

Czy da się zrobić tak, abym wpisywał dane najpierw do 2015, po skończeniu odrazu przechodze do stycznia2016 do grudnia, i znów od początku 2017 do końca w jednej pętli?

Bez używania jakichkolwiek innych operatorów.

Poprostu bym chciał bez przerywania pętli wpisywać ciągłość wpisywanych danych do miesięcy. 

Miesiące mają zostać.

3 odpowiedzi

+1 głos
odpowiedź 9 października 2017 przez m4sk1n Pasjonat (16,750 p.)
Może zagnieżdżenie tych pętli? Wtedy będziesz miał dwie pętle, niezależnie od liczby lat
0 głosów
odpowiedź 9 października 2017 przez Wiciorny Ekspert (269,120 p.)
typ_elementów_tablicy nazwa_tablicy [ ilość wierszy ][ ilość kolumn ];

Dlaczego nie skorzystasz z iterowania np najpierw dla wiersza pierwszego wykonianie 12 kolumn? Np.

W pętlach zagnieżdżonych :) z jakimś warunkiem który cię interesuje. 

 for(int i=0;i<4;i++)
    for(int j=0;j<5;j++)

     //jakis kod zależny od i np...
 // zależność od i mozesz zmniejszyc np dla i=1; po wykonaniu j, przejdz do wiersza i+1;

 

 

0 głosów
odpowiedź 9 października 2017 przez mokrowski Mędrzec (155,460 p.)

Dość niezgrabnie Ci to wyszło... Zerknij proszę tu: https://forum.pasja-informatyki.pl/291124/jak-to-zrobic-bez-rzutowania#a291171 odpowiadałem na bardzo podobne pytanie. Być może jednak nie wszystko zrozumiesz z samego kodu ale zalecenia podtrzymuję.

Nie bardzo rozumiem logikę tego kodu bo np. dane które wprowadzasz nie są nigdzie zapisywane. Jeśli upierasz się jednak przy pytaniu, można zauważyć że kolumny to modulo 12 a wiersze wynik dzielenia przez 12. Wtedy kod będzie wyglądał jakoś tak:

#include <iostream>
#include <cstdlib>
#include <string>

using namespace std;

int main()
{
    int wynik = 0, wynik2 = 0, wynik3 = 0;
    const int liczbyM = 12;
    const int miesiac = 3;
    int dodatkoweM;

    const string miesiace[miesiac][liczbyM] = 
    {
        { "styczen2015", "luty2015", "marzec2015", "kwiecien2015", "maj2015", "czerwiec2015", "lipiec2015", "sierpien2015", "wrzesien2015", "pazdziernik2015", "listopad2015", "grudzien2015" },
        { "styczen2016", "luty2016", "marzec2016", "kwiecien2016", "maj2016", "czerwiec2016", "lipiec2016", "sierpien2016", "wrzesien2016", "pazdziernik2016", "listopad2016", "grudzien2016"},
        {"styczen2017", "luty2017", "marzec2017", "kwiecien2017", "maj2017", "czerwiec2017", "lipiec2017", "sierpien2017", "wrzesien2017", "pazdziernik2017", "listopad2017", "grudzien2017"}
    };

    for(size_t i = 0; i < miesiac * liczbyM; ++i) {
        cout<<"Podawaj kolejne liczby sprzedazy za miesiace: "<<miesiace[i / liczbyM][i % liczbyM]<<": ";
        cin>>dodatkoweM;
    }
}

Do Twojego kodu można mieć jeszcze więcej uwag. Ale to już pozostawię....

komentarz 9 października 2017 przez Kamil Początkujący (430 p.)
To jestniekompletny kod, dawałem go tylko po to tutaj aby zapytać to co chciałem wiedzieć.  Super ze dajesz mi jakies wskazowki, ale moglys mi przyblizyc temat dlaczego tak a nie inaczej. Skoro coś jest głupie i działa to jednak nie jest głupie.

Narazie pisze tak aby działalo.
komentarz 9 października 2017 przez mokrowski Mędrzec (155,460 p.)
Nie użyłem pojęcia 'głupie' tylko 'niezgrabne'. A rozumiem przez to że operacje dzielenia całkowitoliczbowego oraz modulo w żadnym (albo niewielkim) stopniu odnoszą się do samego problemu. Potwierdziłeś zresztą że "Na razie piszesz tak aby działało". Jeśli napiszesz co chcesz osiągnąć, pomogę. Bo ten chwyt .... precyzyjnie.. traktuję jak "sztuczkę do niezgrabnego kodu" :-)
komentarz 9 października 2017 przez mokrowski Mędrzec (155,460 p.)

Piszę w następnym komentarzu aby nie umknęło ani się nie "zlepiło". 

Popraw mnie, ale myślę że chcesz gdzieś zapisywać dane wczytywane (czyli liczby sprzedaży). Jeśli nie znasz struktury std::vector, to zapewne użyjesz tablicy. Jeśli chodzi jednak o informacje wyświetlane (nazwy miesięcy oraz rok), to sensowne było by wydzielenie 2 oddzielnych struktur. Wtedy dzielenia i operacje modulo, miały by sens.

Zrobił bym to tak:

#include <iostream>

int main() {
    // constexpr bo to będzie stała, a size_t bo to typ "do indexów" a nie int! 
   // indeks nie bywa ujemny.... zbyt często :-)
    constexpr size_t ilosc_miesiecy = 12;
    constexpr size_t ilosc_lat = 3;
    constexpr size_t ilosc_danych = ilosc_miesiecy * ilosc_lat;

    // Definicje nazw miesięcy. Zbędny i ciężki obiekt std::string. Nie robisz na nim
    // operacji innych niż wyświetlanie. Podaję ilosc_miesiecy w [] jako wielkość by kompilator
    // ostrzegał mnie jeśli dam przez pomyłkę inną ilość miesięcy. Ciąg znaków jest typu 
    // const char *
    constexpr const char * nazwy_miesiecy[ilosc_miesiecy] = { 
        "styczeń", "luty", "marzec", "kwiecień", "maj", "czerwiec",
        "lipiec", "sierpień", "wrzesień", "październik", "listopad", "grudzień"
    };

    // Teraz lata...
    constexpr const char * nazwy_lat[ilosc_lat] = {
        "2015", "2016", "2017"
    };

    // Tablica na dane wprowadzane. unsigned bo raczej nie dopuszczasz sprzedaży ujemnej :-)
    unsigned ilosc_sprzedanych[ilosc_danych];

    // Wprowadzanie danych
    for(size_t index = 0; index < ilosc_danych; ++index) {
        std::cout << "Podawaj kolejne liczby sprzedazy za miesiac "
            << nazwy_miesiecy[index % ilosc_miesiecy]
            << " w roku " << nazwy_lat[index / ilosc_miesiecy] << ": ";
        // TODO: Warto sprawdzać poprawność wprowadzonych danych.
        std::cin >> ilosc_sprzedanych[index];
    }
}

 

Podobne pytania

0 głosów
3 odpowiedzi 21,649 wizyt
+1 głos
2 odpowiedzi 613 wizyt
pytanie zadane 27 lutego 2021 w JavaScript przez Darth Vader Początkujący (270 p.)
0 głosów
1 odpowiedź 430 wizyt
pytanie zadane 25 marca 2020 w C i C++ przez Ola_00 Nowicjusz (210 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...