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

zadanie z tablicami i liczbami pseudolosowymi .

VPS Starter Arubacloud
0 głosów
629 wizyt
pytanie zadane 17 kwietnia 2016 w C i C++ przez veryhotshark Obywatel (1,620 p.)

witam mam za zadanie napisać program w który wylosuje 999 liczb całkowitych z zakresu 4 do 10 włącznie , potem wypisze te wartości na ekran a potem je zsumuje i poda wynik . wszystkie operacje mają zostać zrealizowane poprzez funkcje a tablica ma być zadeklarowana w mainie . funkcje to :

1.wypelnienie tablicy

2.sumowanie wszystkich liczb w tablicy

3. wypiszanie na ekran

narazie utknąłem na 1 punkcie . 2 i 3 mogę zrobić sam czy ktoś wie jaki jest problem ?

#include <iostream>
#include <cstdlib>
#include <time.h>

using namespace std;

void wypelnij(int tab[999])
{
   for (int i=0 ; i < 1000 ; i++)
   {
      tab[i] = (rand()%6)+4;
      cout << tab[i]<<" | ";
   }
}

int main()
{
    srand( time (NULL));
    int liczby[999];
    wypelnij(liczby[999]);


    return 0;
}

 

3 odpowiedzi

+2 głosów
odpowiedź 17 kwietnia 2016 przez tomasz13nocon Początkujący (300 p.)

Pętla

for (int i=0 ; i < 1000 ; i++)

wykona się 1000 razy, podczas gdy tablica ma tylko 999 elementów. W efekcie w ostatniej iteracji program próbuje dostać się do elementu tab[999], jednak ostatnim elementem jest tab[998]. Indeksy tablic zaczynają się od 0, nie od 1.

komentarz 17 kwietnia 2016 przez veryhotshark Obywatel (1,620 p.)
wciąż sie nie da pisze takie coś

|error: invalid conversion from 'int' to 'int*' [-fpermissive]|
komentarz 17 kwietnia 2016 przez tomasz13nocon Początkujący (300 p.)

Ach tak, nie zauważyłem jeszcze jednego błędu. Kiedy wywołujesz funkcję w 20 linijce:

wypelnij(liczby[999]);

 przekazujesz jako parametr 999 element tablicy "liczby". Żeby odnieść się do całej tablicy należy napisać samą jej nazwę, tj.:

wypelnij(liczby);

 

+2 głosów
odpowiedź 17 kwietnia 2016 przez Patrycjerz Mędrzec (192,320 p.)
  1. Tak, jak napisał tomasz13nocon, wychodzisz w pętli poza zakres tablicy tab.
  2. Losujesz liczby z zakresu od 4 do 9, nie od 4 do 10 - zastosuj zapis:
    rand() % 7 + 4;
    
  3. Do funkcji wypelnij przesyłasz pojedynczy element tablicy, a nie całą tablicę - użyj jedynie jej nazwy, czyli:
    wypelnij(liczby);
  4. Funkcja time może być zbyt mało dokładna, przy tak szybkich obliczeniach - lepiej zastosuj dokładniejszy czasomierz z nowego standardu: http://www.cplusplus.com/reference/chrono/high_resolution_clock/now/.

komentarz 17 kwietnia 2016 przez veryhotshark Obywatel (1,620 p.)

napisałem juz program  i dziękuje za odpowiedz :) . Działa ale czy wie pan może jak napisać trzecią funkcje która pokazuje sume bo  narazie  w 1 funkcji mam wypelninie tablicy jakimis liczbami i wypiszanie ich na ekran w drugiej mam zsumowanie i w mainie wywoluje i wypisuje na ekran a czy mozna napisac 3 funkcje ktora by brała jakoś tą sume z 2 funkcji jako argument? 

#include <iostream>
#include <cstdlib>
#include <time.h>

using namespace std;

void wypelnij(int *tab)
{
   for (int i=0 ; i < 999 ; i++)
   {
      tab[i] = (rand()%7)+4;
      cout << tab[i]<<" | ";
   }
}

int zsumuj(int *tab,int sum)
{

   for (int i=0 ; i < 999 ; i++)
   {
      sum +=tab[i];
   }
   return sum;
}


int main()
{
    srand( time (NULL));
    int liczby[999];
    int suma=0;
    wypelnij(liczby);

    cout<<"\nsuma= "<<zsumuj(liczby,suma);


    return 0;
}

 

komentarz 17 kwietnia 2016 przez tomasz13nocon Początkujący (300 p.)

Nie jestem pewien czy zrozumiałem pytanie.

"czy mozna napisac 3 funkcje ktora by brała jakoś tą sume z 2 funkcji jako argument? "

Wystarczy przypisać zwróconą wartość do zmiennej i przesłać tą zmienną do funkcji:

int suma = zsumuj(liczby);
trzeciaFunkcja(suma);

Również w powyższym kodzie niepotrzebnie przesyłasz do funkcji zsumuj drugi argument. Można zmienną sum stworzyć wewnątrz tej funkcji i ją po prostu zwrócić.

komentarz 18 kwietnia 2016 przez veryhotshark Obywatel (1,620 p.)
Wiem :) ale takie jest zadanie 3 funkcji tez bym nie robił bo to redundancja ale skoro zadanie tak każe :) i dziękuję za pomoc
+1 głos
odpowiedź 17 kwietnia 2016 przez niezalogowany
edycja 17 kwietnia 2016
#include <iostream>
#include <cstdlib>
#include <time.h>
 
using namespace std;
 
void wypelnij(int *tab)
{
   for (int i=0 ; i < 1000 ; i++)
   {
   	 srand( time (NULL));
      tab[i] = (rand()%6)+4;
      cout << tab[i]<<" | ";
   }
}
 
int main()
{
    srand( time (NULL));
    int liczby[999];
    wypelnij(liczby);
 
 
    return 0;
}

Jak wysyłasz tablicę do funkcji to możesz podać po prostu jej nazwe, bez numeru elementu

komentarz 17 kwietnia 2016 przez veryhotshark Obywatel (1,620 p.)
witam a gdyby zamiast * postawił znak ampersandu to co by było?

i dziękuje za odpowiedz program działa :)
komentarz 17 kwietnia 2016 przez niezalogowany

   [Error] invalid types 'int[int]' for array subscript

będą problemy z działaniami bloku instrukcji w środku dlatego lepiej korzystaj z takiego posyłania do funkcji. Jesli jesteś ciekaw to są też inne sposoby ale to już musisz popatrzeć w internecie choć ten myślę, że najbardziej taki standardowy, bynajmniej ja zawsze z niego korzystam. A co do pomocy, to nie ma za co, służę pomocą ;)

komentarz 17 kwietnia 2016 przez veryhotshark Obywatel (1,620 p.)

oraz napisałem juz program i działa ale czy wie pan może jak napisać trzecią funkcje która pokazuje sume bo  narazie  w 1 funkcji mam wypelninie tablicy jakimis liczbami i wypiszanie ich na ekran w drugiej mam zsumowanie i w mainie wywoluje i wypisuje na ekran a czy mozna napisac 3 funkcje ktora by brała jakoś tą sume z 2 funkcji jako argument? 

#include <iostream>
#include <cstdlib>
#include <time.h>

using namespace std;

void wypelnij(int *tab)
{
   for (int i=0 ; i < 999 ; i++)
   {
      tab[i] = (rand()%7)+4;
      cout << tab[i]<<" | ";
   }
}

int zsumuj(int *tab,int sum)
{

   for (int i=0 ; i < 999 ; i++)
   {
      sum +=tab[i];
   }
   return sum;
}


int main()
{
    srand( time (NULL));
    int liczby[999];
    int suma=0;
    wypelnij(liczby);

    cout<<"\nsuma= "<<zsumuj(liczby,suma);


    return 0;
}

 

komentarz 17 kwietnia 2016 przez Patrycjerz Mędrzec (192,320 p.)
edycja 17 kwietnia 2016 przez Patrycjerz

@Prosmat Przecież przesyłając tablicę zawsze przesyłasz jej adres, czyli zawsze pracujesz na oryginalnych danych.

@veryhotshark Chodzi o referencję? Tutaj nie ma ona sensu, ponieważ operujesz na adresach, a nie zwykłych wartościach.

komentarz 17 kwietnia 2016 przez niezalogowany

@Patrycjesz W sumie także prawda to korzystając z okazji:  poprzez

 wypelnij(liczby[999]);

wysyła tylko 1 element do funkcji, mam rację?

komentarz 17 kwietnia 2016 przez Patrycjerz Mędrzec (192,320 p.)

Tak, ponieważ takowy zapis jest równoważny z:

wypelnij(*(liczby + 999));

Oczywiście nie istnieje indeks tablicy liczby o wartości 999, ale to już szczegół...

komentarz 17 kwietnia 2016 przez niezalogowany

Tak, mam tego śwaidomość, chciałem się upewnić gdyż na cpp0x widnieje coś takiego:

void sposob_1( int tablica[ 123 ] );

i dodanie typu wysyłanej tablicy przy przesyłaniu argumentów wyśle nam już całą tablice?

komentarz 17 kwietnia 2016 przez Patrycjerz Mędrzec (192,320 p.)
Przecież podane przez ciebie wywołanie funkcji jest niepoprawne - jest to chyba bardziej jej deklaracja.

Podobne pytania

+1 głos
2 odpowiedzi 167 wizyt
pytanie zadane 23 czerwca 2020 w C i C++ przez dominik195k Obywatel (1,030 p.)
0 głosów
2 odpowiedzi 1,886 wizyt
pytanie zadane 26 maja 2020 w C i C++ przez saju13013 Nowicjusz (230 p.)
0 głosów
1 odpowiedź 1,958 wizyt

93,020 zapytań

141,982 odpowiedzi

321,283 komentarzy

62,366 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...