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

Object Storage Arubacloud
0 głosów
346 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 (154,860 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 (154,860 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 (41,050 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 67 wizyt
pytanie zadane 19 listopada 2018 w Mikrokontrolery przez Cixo Gaduła (4,070 p.)
+1 głos
2 odpowiedzi 2,373 wizyt
pytanie zadane 22 sierpnia 2016 w Sprzęt komputerowy przez Mavimix Dyskutant (8,390 p.)
0 głosów
2 odpowiedzi 16,815 wizyt
pytanie zadane 23 stycznia 2016 w C i C++ przez Kerp Nowicjusz (210 p.)

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!

...