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

VPS Starter Arubacloud
0 głosów
148 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,780 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,780 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 298 wizyt
pytanie zadane 11 kwietnia 2021 w Systemy operacyjne, programy przez Skrzypek Nowicjusz (130 p.)
0 głosów
0 odpowiedzi 143 wizyt
pytanie zadane 25 sierpnia 2019 w C# przez Moras Obywatel (1,620 p.)
–1 głos
1 odpowiedź 794 wizyt

92,453 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...