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

Po wprowadzeniu tych samych danych program zwraca różne rezultaty.

Object Storage Arubacloud
0 głosów
149 wizyt
pytanie zadane 22 czerwca 2021 w C i C++ przez SAY10s Nowicjusz (170 p.)

Hej!

Robiąc zadanie domowe z 11 odcinka podstawowego kursu c++ napotkałem problem. Przy pierwszym teście (https://youtu.be/63QjKBcIySs?t=847) program za liczbę najbliżej średniej podaje albo 11, albo -33. Wynik wydaje się być losowy i zmienia się przy ponownym uruchomieniu kodu/uruchomieniu i kompilacji. 

Dla jasności powtórzę - te same dane, identyczny kod, raz działa, raz nie.

#include <iostream>
#include <conio.h>
#include <windows.h>

using namespace::std;

float all=0, x;
int y;

int main() 
{
	
	float *table_1;
	table_1 = new float [5];
	float *pointer = table_1;
	
	for (int i=0; i<5;)
	{
		cout << "Insert your " << ++i << " number: ";
		cin >> *pointer;
		all += *pointer;
		pointer++;
		system("cls");
	}
	pointer-=5;
	
	all = all/5;
	
	float *table_2;
	table_2 = new float [5];
	float *pointer2 = table_2;
	
	for (int i=0; i<5; i++)
		{
			if (*pointer<all)
			{
				*pointer2=all-*pointer;	
			}
			else if (*pointer>all)
			{
				*pointer2=*pointer-all;
			}
			else 
			{
				x=*pointer;
				break;	
			}
			pointer++;
		}
	
	pointer2-=5;
	x=*pointer2;
	
	for (int i=0; i<5; i++)
	{
		if (x>*pointer2)
		{
			x=*pointer2;
			y=i;
		}
			pointer2++;	
	}
	
	
	cout << "Srednia: " << all << endl << "Najblizsza: " << table_1[y];

	delete [] table_1;
	delete [] table_2;
	getch();
	return 0;
}

PS Wiem, że kod nie przechodzi następnych testów, tym zajmę się po rozwiązaniu pierwszego problemu ;)

1 odpowiedź

+1 głos
odpowiedź 22 czerwca 2021 przez tangarr Mędrzec (154,860 p.)
wybrane 22 czerwca 2021 przez SAY10s
 
Najlepsza
Podczas "wyszukiwania" wyniku operujesz na losowych (nieprzypisanych) danych w tablicy table_2.
Dlaczego stworzyłeś tą tablicę? Do czego jest ci ona potrzebna? Co więcej dlaczego zdecydowałeś się na użycie tablic dynamicznych oraz dlaczego na siłę próbujesz używać wskaźników zamiast indeksów tablicy?
komentarz 22 czerwca 2021 przez SAY10s Nowicjusz (170 p.)
table_2 stworzyłem do zapisu różnicy między każdą podaną liczbą, a ich średnią, żeby później móc je porównać bez zmian w table_1 (zawierającej podane przez użytkowniaka liczby)

A co do wskaźników i liczb dynamicznych - w kursie były w poprzednim odcinku, więc postanowiłem poćwiczyć :)

Mógłbyś wytłumaczyć mi dlaczego dane w table_2 są nieprzypisane? Na chłopski rozum wydaje mi się, że przypisuje je linia 37 i 41
komentarz 22 czerwca 2021 przez tangarr Mędrzec (154,860 p.)
Z powodu nieczytelnego kodu popełniłem pewien błąd. Nie zauważyłem, że tablica jest modyfikowana przez wskaźnik.
Problemem jest to, że tylko pierwszy element tablicy table_2 ma przypisaną wartość (poprzez wskaźnik pointer2, którego nigdy nie inkrementujesz).
Przez całą pętlę pointer2 wskazuje na ten sam element tablicy a po wyjściu z pętli przesuwasz go o 5 bajtów do tyłu. W wyniku czego w kolejnej pętli używasz danych z poza zakresu tablicy.
komentarz 22 czerwca 2021 przez SAY10s Nowicjusz (170 p.)
Faktycznie wszystko teraz działa i błąd wydaje mi się teraz oczywisty!

Dziękuję bardzo!

Podobne pytania

+1 głos
2 odpowiedzi 309 wizyt
pytanie zadane 11 kwietnia 2021 w Systemy operacyjne, programy przez Skrzypek Nowicjusz (130 p.)
0 głosów
0 odpowiedzi 148 wizyt
pytanie zadane 25 sierpnia 2019 w C# przez Moras Obywatel (1,620 p.)
–1 głos
1 odpowiedź 842 wizyt

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

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

...