• 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 .

Object Storage Arubacloud
0 głosów
486 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 147 wizyt
pytanie zadane 23 czerwca 2020 w C i C++ przez dominik195k Obywatel (1,030 p.)
0 głosów
2 odpowiedzi 1,730 wizyt
pytanie zadane 26 maja 2020 w C i C++ przez saju13013 Nowicjusz (230 p.)
0 głosów
1 odpowiedź 1,837 wizyt

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,964 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!

...