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

Problem ze zrozumieniem działania programu c++

0 głosów
809 wizyt
pytanie zadane 13 lipca 2020 w C i C++ przez Verdatonix Nowicjusz (150 p.)
edycja 13 lipca 2020 przez Verdatonix

Witam

Ostatnio w internecie natknąłem się na taki kod:

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

using namespace std;


string q[] = {"I swear ","Well, ","Urgh ","Uhmm ","Ehh ","Hmmm ","Yeah ","Hey "};

string excuses[]={"it's not a bug it's a feature","it worked on my machine","i tested it and it worked","its production ready","your browser must be caching the old content","that error means it was successful","the client fucked it up","the systems crashed and the code got lost" ,"this code wont go into the final version","it's a compiler issue","it's only a  minor issue","this will take two weeks max","my code is flawless must be someone else's mistake","it worked a minute ago","that was not in the original specification","I was told to stop working on that when something important came up","You must have the wrong version","thats way beyond my paygrade","that's just an unlucky coincidence","i saw the new guy screw around with the systems","our servers must've been hacked","i wasnt given enough time","its the designers fault","it probably wont happen again","your expectations were unrealistic","everythings great on my end","thats not my code","its a hardware problem","its a firewall issue","its a character encoding issue","a third party api isnt responding","that was only supposed to be a placeholder","The third party documentation is wrong","that was just a temporary fix.","We outsourced that months ago."," that value is only wrong half of the time.","the person responsible for that does not work here anymore","That was literally a one in a million error","our servers couldn't handle the traffic the app was recieving","your machines processors must be too slow","your pc is too outdated","I haven't pushed the latest changes yet", "that is a known issue with the programming language","it would take too much time and resources to rebuild from scratch","this is historically grown","users will hardly notice that","I will fix it"};   
 void generate(){
   
   
   cout<<q[rand()%(sizeof(q)/sizeof(q[0]))] + excuses[rand()%(sizeof(excuses)/sizeof(excuses[0]))]<<".";  
}


int main() {
srand(time(0));

generate();

cout<<endl<<endl<<q[rand()%(sizeof(q)/sizeof(q[0]))] + excuses[rand()%(sizeof(excuses)/sizeof(excuses[0]))]<<".";  

    return 0;    
}

I nie rozumiem jak on działa. Czy mógłby ktoś wytłumaczyć krok po kroku zasadę działania tego programu.

Z góry dziękuję.

3 odpowiedzi

+2 głosów
odpowiedź 13 lipca 2020 przez tangarr Mędrzec (155,140 p.)
wybrane 13 lipca 2020 przez Verdatonix
 
Najlepsza

Rozumiem, że problematyczna jest linia

cout<<q[rand()%(sizeof(q)/sizeof(q[0]))] + excuses[rand()%(sizeof(excuses)/sizeof(excuses[0]))]<<".";

Dodajmy kilka zmiennych pomocniczych i rozbijmy ją na kilka kroków.

int rozmiar_tablicy_q = sizeof(q)/sizeof(q[0]);
int losowy_indeks_tablicy_q = rand() % rozmiar_tablicy_q;
string wylosowany_element_tablicy_q = q[losowy_indeks_tablicy_q];

int rozmiar_tablicy_excuses = sizeof(excuses)/sizeof(excuses[0]);
int losowy_indeks_tablicy_excueses = rand() % rozmiar_tablicy_excuses;
string wylosowany_element_tablicy_excuses = excuses[losowy_indeks_tablicy_excueses];

cout << wylosowany_element_tablicy_q + wylosowany_element_tablicy_excuses << ".";

Jeżeli ciągle czegoś nie rozumiesz, to przynajmniej możesz wskazać z którym krokiem masz problem.

komentarz 13 lipca 2020 przez Verdatonix Nowicjusz (150 p.)

To w takim razie co to znaczy:

sizeof(q) = ?
sizeof(q[0]) = ?

 

komentarz 13 lipca 2020 przez tangarr Mędrzec (155,140 p.)

sizeof zwraca rozmiar (w bajtach) przekazanego typu (lub obiektu).
sizeof(q) zwraca rozmiar całej tablicy q.
q[0] jest pierwszym elementem tablicy q.
sizeof(q[0]) jest równoznaczne z zapisem sizeof(string), zwraca rozmiar zmiennej string.

int tablica[] = { 4, 76, 1, 65, 4, 3 };

int rozmiar_tablicy = sizeof(tablica);
int rozmiar_elementu = sizeof(tablica[0]);
int ilosc_elementow = rozmiar_tablicy/rozmiar_elementu;

cout << "rozmiar tablicy (w bajtach): " << rozmiar_tablicy << endl;
cout << "rozmiar elementu: " << rozmiar_elementu << endl;
cout << "ilość elementów w tablicy: " << ilosc_elementow << endl;

 

komentarz 13 lipca 2020 przez Verdatonix Nowicjusz (150 p.)
Dziękuję za wytłumaczenie.
+1 głos
odpowiedź 13 lipca 2020 przez Szfierzak Gaduła (3,750 p.)

Program nie jest długi, ale rozbij go na jeszcze mniejsze elementy;)

I tak od góry:

Tworzona są dwie tablice stringów. Później masz funkcję która wypisuje jakąś kombinację string z pierwszej tablicy + string z drugiej tablicy. Później main i najpierw wywołanie tej funkcji, i znowu wypisanie kombinacji string z pierwszej tablicy + string z drugiej tablicy. Całość jak rozumiem, miała na celu pokazanie działania generatora liczb pseudolosowych przy wybieraniu indeksu tablic. 

Jeżeli straszy Cię zapis typu: 

cout<<q[rand()%(sizeof(q)/sizeof(q[0]))] + excuses[rand()%(sizeof(excuses)/sizeof(excuses[0]))]<<".";  

To podziel go na mniejsze składowe, które rozumiesz. 

q[rand()%(sizeof(q)/sizeof(q[0]))] 
excuses[rand()%(sizeof(excuses)/sizeof(excuses[0]))]

Dwie powyższe linijki robią dokładnie to samo tylko na różnych tablicach. Masz funkcję rand() która losuje liczbę pseudolosową z przedziału 0-(sizeof(excuses)/sizeof(excuses[0])-1). A zapis sizeof(excuses)/sizeof(excuses[0]) to nic innego jak policzenie ile jest elementów tablicy, ponieważ dzielisz rozmiar całej tablicy przez rozmiar jednego elementu.

–2 głosów
odpowiedź 13 lipca 2020 przez reaktywny Nałogowiec (46,210 p.)
A chociaż go odpaliłeś? :)
komentarz 13 lipca 2020 przez Verdatonix Nowicjusz (150 p.)
No tak odpaliłem i dział. Ale nie rozumiem kodu.

Podobne pytania

0 głosów
0 odpowiedzi 140 wizyt
pytanie zadane 19 listopada 2018 w Mikrokontrolery przez Cixo Gaduła (4,070 p.)
+1 głos
2 odpowiedzi 2,787 wizyt
pytanie zadane 22 sierpnia 2016 w Sprzęt komputerowy przez Mavimix Dyskutant (8,490 p.)
0 głosów
2 odpowiedzi 18,411 wizyt
pytanie zadane 23 stycznia 2016 w C i C++ przez Kerp Nowicjusz (210 p.)

93,753 zapytań

142,713 odpowiedzi

323,356 komentarzy

63,347 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...