Pole kwadratu

0

Witam wszystkich,
Program pyta o ilość zestawu danych, następnie wczytuje jeden bok kwadratu i na końcu ma wypisać wynik.
Z jakiegoś powodu ostatnia pętla wykonuje się jeden raz z nieprawidłowym wynikiem, mógłby coś wytłumaczyć gdzie jest błąd i jak dokładnie funkcjonuje poniższy program?

``
#include <iostream>
using namespace std;

int main() {

int testy;
cin>>testy;
int zestawy[testy];

for (int i=0; i<testy; i++)
cin >> zestawy[i];   

for (int j=0; j<testy; j++)
cout<<zestawy[j]*zestawy[j];

return 0;

}``

2

Wygląda, że wszystko działa prawidłowo, jakie dane Podajesz?

cin>>testy; // -> 3
int zestawy[testy];

for (int i=0; i<testy; i++)
	cin >> zestawy[i];   // -> 1, 2, 3

for (int j=0; j<testy; j++)
	cout<<zestawy[j]*zestawy[j] <<" "; // -> 1 4 9
3

Program wykonuje się prawidłowo, po prostu źle wypisujesz odpowiedzi.

cout<<zestawy[j]*zestawy[j];

Po wypisaniu odpowiedzi, nie dodajesz żadnej spacji ani znaku nowej linii, dlatego odpowiedzi "zlepiają się" w jedną dużą liczbę.

0

Wszystko jasne, macie rację :)

1

Wystarczy tyle, sprawdź.

#include <iostream>
using namespace std;

int main() 
{
	int testy,value;
	for(cin>>testy;(testy--)&&(cin>>value);cout<<value*value<<endl) {}
	return 0;
}
1
int testy;
cin>>testy;
int zestawy[testy];

Rozmiar tablicy musi być znany w czasie kompilacji. Musisz albo dynamicznie tworzyć tę tablicę, albo użyć std::vector.

0
_13th_Dragon napisał(a):

Wystarczy tyle, sprawdź.

#include <iostream>
using namespace std;

int main() 
{
	int testy,value;
	for(cin>>testy;(testy--)&&(cin>>value);cout<<value*value<<endl;) {}
	return 0;
}

Na jakiej tutaj zasadzie pętla będzie wiedziała, że ma zakończyć swoje działanie?

0
cos30 napisał(a):
_13th_Dragon napisał(a):

Na jakiej tutaj zasadzie pętla będzie wiedziała, że ma zakończyć swoje działanie?

Jak (testy--) przyjmie wartość 0 lub cin>>value nie będzie w stanie wczytać kolejnej wartości.

0

Fakt przyjęcia przez zmienną testy wartości 0 jest zaszyty w specyfikacji pętli for, czy chodzi tutaj o warunek logiczny- 0=false?
W klasycznym ujęciu zawsze pisałem drugi warunek np. i>0;

Spearhead napisał(a):
int testy;
cin>>testy;
int zestawy[testy];

Rozmiar tablicy musi być znany w czasie kompilacji. Musisz albo dynamicznie tworzyć tę tablicę, albo użyć std::vector.

Mówisz tutaj o dobrej praktyce?
Sposób w jaki programuje kompilator przyjmuje za poprawny do dalszych działań.

1

Mówisz tutaj o dobrej praktyce?

Mówię tu o standardzie. Weźmy ten kod

#include <iostream>

int main() {
    int size;
    std::cin >> size;
    int tab[size];
}

Próba kompilacji pod msvc eksploduje:

source_file.cpp(6): error C2131: expression did not evaluate to a constant
source_file.cpp(6): note: failure was caused by non-constant arguments or reference to a non-constant symbol
source_file.cpp(6): note: see usage of 'size'
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x64

Co ciekawe, jest to dozwolone w C99, ale już nie w C++.

Sposób w jaki programuje kompilator przyjmuje za poprawny do dalszych działań.

To nie Rust, kompilator cię tu nie chroni przed błędami. Popatrz na ten kod:

int main(int argc, char** argv) {
    delete(argv);
    delete(argv);
}

Kompilator kompiluje to spokojnie, a przy próbie uruchomienia program eksploduje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1