Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C++]Zadanie z kursu "Od zera do gier kodera"

elektronik512 22 Sie 2009 20:36 6396 10
  • #1 22 Sie 2009 20:36
    elektronik512
    Poziom 9  

    Mam problem z zadaniem z kursu "Od zera do gier kodera".

    Napisz program, który pozwoli użytkownikowi na wprowadzenie dowolnej ilości
    liczb (ilość tą będzie podawał na początku) i obliczenie ich średniej arytmetycznej.
    Podawane liczby przechowuj w 100-elementowej tablicy (wykorzystasz zeń tylko
    część).
    (Trudne) Możesz też zrobić tak, by program nie pytał o ilość liczb, lecz prosił o
    kolejne aż do wpisania innych znaków.
    (Bardzo trudne) Czy można jakoś zapobiec marnotrawstwu pamięci,
    związanemu z tak dużą, lecz używaną tylko częściowo tablicą? Jak?

    Pierwszą część zadania wykonałem o to kod, ale mam problem z dalsza częścią ;/

    Code:
    #include <iostream>
    

    using namespace std;

    int tablica[100];

    int main()
    {
       int ilosc;
       cout<<"Podaj ilosc liczb: ";
       cin>>ilosc;
       for(int i=1;i<=ilosc;++i)
       {
          cin>>tablica[i];
          tablica[i]+=tablica[i-1];
       }
       float a=static_cast<float>(tablica[ilosc])/ilosc;
       cout<<a<<endl;
       system("pause");
       return 0;
    }

    0 10
  • #2 22 Sie 2009 20:51
    kuuczoo
    Poziom 26  

    Witam
    Druga część jest prosta. Po prostu czytaj to co wpisujesz do jakiegoś stringa a potem jeśli to liczba wpisuj do tablicy (funkcja zwracająca liczbę ze strainga sprawdza czy to liczba i zwraca w razie potrzeby odpowiednią wartość). Co do trzeciej wersji to trzeba użyć alokacji pamięci, ale już nie pamiętam czy nie będziesz musiał użyć 2 czy jednej tablicy (nie pamiętam czy przy realokacji zerowane są elementy tablicy, jeśli tak to potrzebny jest jakiś tymczasowy temp do kopiowania). Nie podaje ci dokładnych nazw funkcji bo z doświadczenia wiem że szukając tego samemu w helpach i innych pomocach człowiek uczy się najwięcej, a chyba tego chcesz.

    0
  • #3 22 Sie 2009 20:56
    elektronik512
    Poziom 9  

    mógł byś to jakoś zapisać chociaż początek bo nie za bardzo wiem o co ci chodzi z tym 2 pkt ;/

    0
  • #4 22 Sie 2009 21:23
    kulmar
    Poziom 25  

    Zastanów się po pierwsze, co to jest średnia arytmetyczna z liczb. Bo tak naprawdę, to niepotrzebna Ci żadna tablica.

    Pozdrawiam

    Mariusz

    0
  • #5 22 Sie 2009 21:58
    elektronik512
    Poziom 9  

    w zadaniu jest napisane, żeby użyć tablicy ...

    0
  • #6 22 Sie 2009 22:15
    kulmar
    Poziom 25  

    Tablicy polecają użyć w części pierwszej. A w części "trudne" i "bardzo trudne" pytają o rozwiązanie problemu.

    Pozdrawiam

    Mariusz

    0
  • #7 22 Sie 2009 22:20
    kuuczoo
    Poziom 26  

    No więc z tego co pamiętam to są funkcje np. "atoi", które zmieniają string na int. Jeśli string nie ma liczby to zwraca 0. Jak poszukasz wiadomości o tym w necie to znajdziesz i inne funkcje i opisy ich użycia

    0
  • #8 26 Sie 2009 23:34
    CDMaster
    Poziom 14  

    Koledzy mają rację. Pomyśl jak to zrobić bez tablicy. Dla podpowiedzi dodam tylko, żebyś sobie zapisał na kartce jak krok po kroku policzyłbyś średnią np. 5 liczb, a potem co by się zmieniło, gdyby tych liczb było 6:D Ja zawsze zaczynam rozwiązywać problem na kartce, a potem dopiero przenoszę wynik na kod i zawsze działa:D
    Pozdrawiam

    0
  • #9 28 Sie 2009 13:32
    ~Radek
    Poziom 1  

    Witam wszystkich,
    oto mój kod :

    Code:
    #include <iostream>
    
    using namespace std;
    int main()
    {
     int *wsk=new int[100];
      char q='n';
      int licz=0;
      int suma=0;
      while(1)
      {
        cin >> wsk[licz];
        suma+=wsk[licz];
        licz++;
        cout << "Czy chcesz zakonczyc ?[T/n]\n";
        cin >> q;
        if(q=='T' || q=='t') break;
      }
      int *wsk_2=new int[licz];
      for(int i=0;i<licz;i++)
      {
        wsk_2[i]=wsk[i];
      }
      delete []wsk;
        cout << "Sredia arytmetyczna tych liczb to: " << (suma/licz) << endl;
      return 0;
    }

    0
  • #10 28 Sie 2009 21:01
    Dr.Vee
    VIP Zasłużony dla elektroda

    Sorry ~Radek, ale nie pokazuj proszę tego kodu jako przykładu rozwiązania tego zadania.

    1) po co Ci w ogóle wsk_2?
    1a) przydzielasz pamięć na tablicę, a jej nie zwalniasz.
    2) czemu dynamiczna alokacja pamięci? Przecież rozmiar jest znany i zawsze równy 100.
    3) program się zapętli, jeśli wpiszesz CTRL-Z i enter (pod windowsem).
    4) średnią liczysz jako liczbę całkowitą, a przez to część ułamkowa jest obcinana.

    Pozdrawiam,
    Dr.Vee

    0
  • #11 16 Kwi 2010 22:20
    Mikon_603
    Poziom 10  

    Wiem, że trochę późno z tym rozwiązaniem wyskakuje, ale dopiero od kilku dni czytam ten kurs i udało mi się naskrobać coś takiego.

    Code:
    // Wpisywanie zmiennych do tablicy
    

    #include <iostream>
    #include <conio.h>
    #include <cstdlib>
    #include <string>

    void main()
    {
       std::cout << "      PROGRAM WPISUJACY ZMIENNE DO TABLICY      " << std::endl;
       std::cout << "------------------------------------------------" << std::endl;
       std::cout << std::endl;

       int aTablica[100];
            std::string cZnak = "#";   // Kończy wpisywanie po wpisaniu znaku #
       std::string sWpis;           // Zmienna przechowująca znaki wpisane z klawiatury
       int i = 0;                       // Licznik
       
       std::cout << std::endl;
       std::cout << " Wpisywanie zmiennych do tablicy " << std::endl;
       std::cout << " Wpisywanie mozna zakonczyc znakiem '#' " << std::endl;
       do
       {
          std::cout << " Zmienna[" << (i + 1) << "] = ";
          std::cin >> sWpis;
          aTablica[i++] = atoi(sWpis.c_str());
       }while ( sWpis != cZnak );

       std::cout << std::endl;
       std::cout << " Wypisanie danych z tablicy. " << std::endl;

       int j = 0;

            if ( i != 1 )
            {
               do
               {
                  std::cout << " Zmienna[" << j << "] = " << aTablica[j++] << std::endl;
               }while ( j != (i-1));
            }
            else
            {
                    std::cout << " Tablica jest pusta. ";
            }
       _getch();
    }



    Program działał jak powinien, czyli po wpisaniu znaku # kończył pobieranie znaków z klawiatury i wyświetlał całą tablicę na ekranie. Jeżeli widzicie jakieś nieprawidłowości w tym kodzie to proszę o weryfikację, bo dopiero się uczę i korzystam ze źródeł Internetowych, a z tymi róźnie bywa.

    edytowane 23:02
    Dodałem warunek if, gdyż przy braku jakiejkolwiek wpisanej danej program się wysypywał przy wypisywaniu liczb z tablicy na ekran.

    0