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

Tablica która się powtarza do czasu...

Object Storage Arubacloud
–1 głos
414 wizyt
pytanie zadane 13 stycznia 2019 w C i C++ przez Magmardo Początkujący (310 p.)
edycja 14 stycznia 2019 przez Magmardo

Cześć, 

mam do napisania program w C++, gdzie muszę stworzyć tablicę z 10 indeksami i kiedy kolejna linia jest pusta - to kończy wczytywanie danych i wyświetla z każdej średnią liczb. Udało mi się zrobić schemat tablicy, lecz zrobiłem ją w pętli for, więc na razie jest jedna i za bardzo nie wiem jak ją przerobić na while/do while. Myślę, że mnie w miarę zrozumieliście. :D

float tablica[10]; float suma=0, srednia;
int main()
{
    for(int i=0; i<10; i++)
    {
        cout<<endl<<"Podaj "<<i+1<<" liczbe: ";
        cin>>tablica[i];
        suma += tablica[i];

    }
    srednia = suma / 10;
    cout<<endl<<"srednia= "<<srednia<<endl;

 

komentarz 13 stycznia 2019 przez mokrowski Mędrzec (155,460 p.)
Jeśli dodałeś tag C, otrzymasz inną odpowiedź gdybyś podał C++. To w jakim w końcu języku piszesz? Tag: C a kod C++...

5 odpowiedzi

+1 głos
odpowiedź 13 stycznia 2019 przez mkornas Użytkownik (640 p.)
Przerobienie na pętlę while/do while jest bardzo proste. Warunek zawsze zostaje taki sam. Trzeba tylko zadeklarować int i = 0; przed pętlą i na końcu pętli zwiększać ją i o 1.

Warto jednak zauważyć, że w tym zadaniu nie potrzebujesz tablicy. Poza wczytaniem do niej danych i od razu dodaniem ich do sumy z niej nie korzystasz. Równie dobrze mogłaby być tam jedna zmienna.
komentarz 13 stycznia 2019 przez Magmardo Początkujący (310 p.)
Dzięki za szybką odpowiedź. A jeżeli chciałbym użyć pętli do while to czy warunkiem kończącym może być tablica=null? Czy to zadziała w ogóle?
komentarz 13 stycznia 2019 przez mkornas Użytkownik (640 p.)
Nie, taki warunek nie ma kompletnie sensu. Znaczy kompilator prawdopodobnie to przyjmie (jeśli chodzi o warunek to dwa znaki równości) bo technicznie rzecz biorąc tablica jest takim ukrytym wskaźnikiem, ale jeżeli wczytasz jej wszystkie elementy to nie zmieni się to na null
+1 głos
odpowiedź 13 stycznia 2019 przez niezalogowany

wydaje mi się że brakuje warunku przerwania pętli np

if(tablica [i]==0) break;
komentarz 14 stycznia 2019 przez Magmardo Początkujący (310 p.)
Tylko, że przerywanie pętli następuje po tym jak nic nie wpiszemy, czyli damy enter, bo jak dam 0 to wlicza też w średnią. Nie wiem czemu ale kiedy dam w kodzie zamiast zera, nullptr to nie chce się skompilować.
komentarz 14 stycznia 2019 przez niezalogowany

a czemu by miało się nullptr skompilować, wydaje mi się nullptr używa się do zerowania wskaźników;

mi taki kod działa ale denerwuje mnie przechodzenie do nowej linii już kiedyś szukałem rozwiązania, ale nie pamiętam czy znalazłem rozwianie dlatego zawsze wolałem getline

#include <iostream>

using namespace std;

float tablica[10]; float suma=0, srednia;
int main()
{
    char znak;
    int i=0;
    for(; i<10; i++)
    {
        cout<<endl<<"Podaj "<<i+1<<" liczbe: ";
        cin>>tablica[i];
        suma += tablica[i];
        if(tablica[i]==0) break;

    }
    if(i==0) srednia = suma;
    else srednia = suma / i;
    cout<<endl<<"srednia= "<<srednia<<endl;
    for (int i =0;i<10;i++)
        cout<<tablica[i]<<endl;
    return 0;
}

 

0 głosów
odpowiedź 14 stycznia 2019 przez Magmardo Początkujący (310 p.)

Przebrnąłem teraz trochę ale trafiłem na kolejny problem, podczas gdy zatrzymam wczytywanie liczb, to program dobrze liczy średnią, lecz kiedy dojdę do końca to wychodzą jakieś dziwne wyniki.

float tablica[10]; float suma, srednia;
int main()
{
    for(int i=0; i<10; i++)
    {
        cout<<endl<<"Podaj "<<i+1<<" liczbe: ";
        cin>>tablica[i];
        suma=suma+tablica[i];
        srednia = suma/i;
        if(tablica[i]==0) break;
    }
    cout<<endl<<"srednia= "<<srednia<<endl;

 

komentarz 14 stycznia 2019 przez DragonCoder Nałogowiec (36,500 p.)
edycja 14 stycznia 2019 przez DragonCoder

Bo dzielisz pewnie przez 9, a nie 10 czyli tyle ile masz elementow tablicy.

Rozwiazanie:

srednia = suma / i + 1;
srednia = suma / dlugosc_tablicy;

 

0 głosów
odpowiedź 15 stycznia 2019 przez Magmardo Początkujący (310 p.)
Linia wykonuje się dobrze, tylko, że musi być ich tyle ile użytkownik będzie chciał a na końcu z każdej ma się wyświetlać średnia, a z której wychodzi wynik na minusie ma omijać, teraz pytanie - czy mogę użyć drugiej tablicy do przechowywania danych, czy wystarczy odpowiednia pętla?
komentarz 15 stycznia 2019 przez DragonCoder Nałogowiec (36,500 p.)
Nie zrozumialem o co Ci chodzi. Chcesz uzyc tablicy, ktora bedzie miala tyle elemntow, ile chce uzytkownik? I o co chodzi z ta druga tablica?
komentarz 15 stycznia 2019 przez Magmardo Początkujący (310 p.)
Najlepiej będzie jak podam treść zadania:

Dane wczytywane są w formie linii zawierających liczby całkowite. Ilość liczb w linii może wahać się od 1 do 10 (nie jest z góry określona ale zakłada się, że po ostatniej liczbie w linii nie ma już żadnych znaków). Linia pusta kończy wczytywanie danych. Należy wyświetlić zawartość linii danych uporządkowaną w/g średniej wartości liczb w linii z pominięciem tych linii, dla których średnia ma wartość ujemną. Sposób sortowania - dowolny.
komentarz 15 stycznia 2019 przez DragonCoder Nałogowiec (36,500 p.)
edycja 15 stycznia 2019 przez DragonCoder

Dwudemencjonalna tablica lub vector i 2x petla powinny starczyc.

int myarray[][];

Przy czym musisz pozniej zapytac uzytkownika o rozmiar tej tablicy i ilosc znakow.

Bynajmiej ja bym tak to zrobil, nie wiem czy inni zrobili by tak samo.

komentarz 15 stycznia 2019 przez Magmardo Początkujący (310 p.)
edycja 15 stycznia 2019 przez Magmardo
"Dwudemencjonalna tablica" - masz na myśli dwuwymiarową, tak?

A ten kod który podałeś, to pyta użytkownika o rozmiar  i ilość tablicy? Jeśli tak, to będzie coś w stylu macierzy? Bo szczerze powiedziawszy, nie wiem co miał na myśli autor pisząc "linie", myślałem, że chodzi o całą tablicę.
komentarz 15 stycznia 2019 przez DragonCoder Nałogowiec (36,500 p.)
Ja rozumiem to tak, uzytkownik wpisuje 1. jednej lini 10 ocen, w 2. linii kolejne 10 ocen i tak dalej, az nie wpisze pustej linii, wtedy sie konczy.

2 wymiarowa = 2 demencjonalna (2D), jak kto woli.

Ten kod, ktory ja podalem, nic nie robi, definiuje tablice o nie zdefiniwanym rozmiarze, wiec musisz sam jej rozmiar przypisac. Ale nie wiesz ile linii poda uzytkownik, wiec lepszy bylby std::vector
komentarz 15 stycznia 2019 przez Magmardo Początkujący (310 p.)
Niestety z vectorami nie miałem jeszcze do czynienia, załóżmy, że jest to tablica[10][10], jakiej pętli powinienem użyć aby kolejne linie się wyświetlały do uzupełnienia, aniżeli jak teraz tylko jedna?
komentarz 15 stycznia 2019 przez DragonCoder Nałogowiec (36,500 p.)
edycja 15 stycznia 2019 przez DragonCoder

Potrzebujesz petli, ktora powtorzy sie 10 razy dla linii i 2. petli dla wpisywania oceny. Ale tutaj jest juz z wektorami.

#include <iostream>
#include <vector>
#include <algorithm>


int main ()
{
	std::vector < std::vector <int> > nazwaVectora; // 2D Vector
	std::vector <int> drugaDemencja;

	while (warunek_dopoki_nie_wpisano_nowej_linii)
	{
		while (warunek_kiedy_ma_dodawac_oceny_albo_ile_w_jednej_linii)//powtarzaj, dopoki i < 10 lub o
		{
			std::cin>>zmienna_czytajaca_oceny;
			drugaDemencja.push_back (zmienna_czytajaca_oceny);
			i ++; //iterujesz i
		}
		nazwaVectora.push_back (drugaDemencja);
	}
	return 0;
}

Tu jest taki przyklad z wektorami na szybko robiony, bo jakby to moglo wygladac, moze byc zle, nie mam jak skompilowac teraz

komentarz 16 stycznia 2019 przez niezalogowany
edycja 17 stycznia 2019

@Magmardo, może coś takiego

#include <iostream>
#include <sstream>

using namespace std;

float tablica[10]; float suma=0, srednia, liczba;
string linia,cell;
stringstream strumien;
int main()
{
    char znak;
    int i=0,j=0;
   while (getline(cin,linia) && j<10)
   {
        if(linia=="") break;
        strumien.clear();
        strumien.str(linia);
       // cout<<"wiersz numer="<<j+1<< "dane="<<strumien.str()<<endl;
        i=0;suma=0;
        while(getline(strumien,cell,' '))
        {
        i++;
        /// cout<<endl<<"Podaj "<<i+1<<" liczbe: ";
        ///cin>>liczba;

        liczba=atof(cell.c_str());
        suma += liczba;
        }
         srednia = suma / i;
         if (srednia<0)
         {
             srednia =0;
             cout << "wczytaj nowy wiersz:"<<endl;
             continue;
         }
        cout<<"\t srednia= "<<srednia<<endl;
        tablica[j]=srednia;
   j++;
   }


    for (int i =0;i<j;i++)
        cout<<tablica[i]<<endl;
    return 0;
}

 

0 głosów
odpowiedź 17 stycznia 2019 przez Magmardo Początkujący (310 p.)
edycja 17 stycznia 2019 przez Magmardo

Trochę przebrnąłem przez zadanie z Waszą pomocą, lecz teraz pojawił się kolejny problem, otóż pętla powinna wykonywać się do 10-tej wpisanej liczby, wówczas ona działa do tego czasu dopóki nie wciśniemy 0, np do 50-tej, no chyba, że zrobię tak, że 50 liczb wpiszę i pokaże średnią z każdej 10 liczb - czyli 5 wyników, jakieś pomysły? :/

#include <iostream>

using namespace std;

float tablica[10][10]; float suma=0, srednia;
int main()
{
	int j=0;
    int i=0;
    while(i<10)
    {

        while (j<10)
        {
            cout<<endl<<"Podaj "<<i+1<<" liczbe: ";
            cin>>tablica[i][j];
            suma=suma+tablica[i][j];
            if(tablica[i][j]==0) break;
            i++;
    }
        if(i==0) srednia = suma;
        else srednia = suma / i;
        cout<<endl<<"srednia="<<srednia<<endl;





    }
    return 0;
}

 

komentarz 18 stycznia 2019 przez niezalogowany
linia 12 j=0 // zerowanie licznika;

linia 19 j++ zamiast i++;

linia 21 if(j=0) zamiat i;

linia 22  else srednia = suma / j;

linia 24 i++;

Podobne pytania

0 głosów
3 odpowiedzi 6,241 wizyt
0 głosów
1 odpowiedź 180 wizyt
pytanie zadane 1 grudnia 2016 w PHP przez wanderer Gaduła (3,710 p.)
0 głosów
1 odpowiedź 450 wizyt
pytanie zadane 25 grudnia 2016 w C# przez matilogias Obywatel (1,550 p.)

92,615 zapytań

141,465 odpowiedzi

319,779 komentarzy

61,997 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...