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

0 głosów
61 wizyt
pytanie zadane 22 czerwca 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 przez tangarr VIP (136,600 p.)
wybrane 22 czerwca 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 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 przez tangarr VIP (136,600 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 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 57 wizyt
0 głosów
0 odpowiedzi 67 wizyt
pytanie zadane 25 sierpnia 2019 w C# przez Moras Obywatel (1,620 p.)
–1 głos
1 odpowiedź 235 wizyt
Porady nie od parady
Publikując kody źródłowe korzystaj ze specjalnego bloczku koloryzującego składnię (przycisk z napisem code w edytorze). Nie zapomnij o ustawieniu odpowiedniego języka z rozwijanego menu oraz czytelnym formatowaniu kodu.Przycisk code

85,082 zapytań

133,883 odpowiedzi

296,819 komentarzy

56,216 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...