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

Problemy z pierwszymi programami.

VPS Starter Arubacloud
0 głosów
215 wizyt
pytanie zadane 4 listopada 2015 w C i C++ przez Sebastian R Obywatel (1,110 p.)
edycja 4 listopada 2015 przez Sebastian R
Witam, bardzo mi miło przede wszystkim być na tym forum, nigdy nie myślałem, że zbiorę te siły, żeby cokolwiek programować, ale od pewnego czasu to robię i czerpię z tego dużą satysfakcję szczególnie, gdy rozwiąże jakiś problem albo po prostu jak poznaję coś nowego. 
Prosiłbym bym o pomoc, bo nie potrafię znaleźć błędu, szczegolnie mi chodzi o 2 wiariant zadania, program sortuje, ale zwraca jako pierwszą liczbę -855439905(coś takiego, chyba nie jest ważne jak dokładnie). 
// 1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <cstdio>
using namespace std;
					/*
					Napisz program, który za pomoc? polecenia cin wczyta 10 liczb ca?kowitych podanych z klawiatury.
					Nast?pnie za pomoc? polecenia cout wypisze na ekran te same liczby oddzielone spacj? z uwzgl?dnieniem
					poni?szych warunków:
Je?eli pierwsza podana liczba jest ujemna, to wczytane liczby nale?y wydrukowa? na ekranie w odwrotnej kolejno?ci.
Je?eli pierwsza podana liczba jest dodatnia lub jest zerem, to program wypisze wczytane liczby od najmniejszej do najwi?kszej.
Aby poprawnie wykona?y si? testy automatyczne, program powinien sk?ada? si? tylko z funkcji int main(). Niedozwolone jest tworzenie innych funkcji.
					
					
					*/

int main()
{
	int x[10];
	int pomocnicza;
	int p,z;
	int j = 0;

	for (int i=0; i < 10; i++)
	{
		cout << "Wpisz liczbe nr.: " << i+1 << ": ";
		cin >> x[i];
		getchar();
	}

	if (x[0] < 0)
	{
		for (int k = 9; k>=0; k--)
		{
			cout << x[k] << " ";
		}
		cout << endl;
	}

	if (x[0] >= 0)

	{
		while (j == 0)
		{
			z = 0;
			for (int r=0; r < 10; r++)			
												
			{
				
				if (x[r] > x[r + 1])		
				{	
					pomocnicza = x[r];		
					x[r] = x[r + 1];		
					x[r + 1]= pomocnicza;	
					z += 1;					
				}	
			}
			if  (z == 0)		
			{						
				j += 1;				
			}						
		}

	}
	if (j > 0)
	{
		for (int i = 0; i < 10; i++)
		{
			cout << x[i] << " ";
		}
	}







	system("pause");
	return 0;
}

 

2 odpowiedzi

+1 głos
odpowiedź 4 listopada 2015 przez furas Maniak (53,800 p.)
Zawsze możesz nawstawiać więcej `cout` i wypisywać zawartość zmiennych aby wyłapac gdzie i kiedy zaczyna się coś w nich niezgadzać. Jest to prymitywny ale często skuteczny sposób.

Podejrzewam, że problem stanowi `x[r + 1]` bo gdy `r` przyjmie wartośc `9` to wtedy odwołujesz się do elementu `x[10]` czyli poza tablicą.
komentarz 4 listopada 2015 przez Sebastian R Obywatel (1,110 p.)

Akurat tak robiłem, ale to przy wcześniejszych problemach ;) Myślę, że to może stanowić problem!

 

if (x[r] > x[r + 1])
{
if (r<9)
                {   
                      pomocnicza = x[r];
                      x[r] = x[r + 1];           
                      x[r + 1]= pomocnicza;   
                }

                    z += 1;     
}

 

komentarz 4 listopada 2015 przez Sebastian R Obywatel (1,110 p.)

Dziękuje za pomoc. Jednak poprzednia wersja była wadliwa, teraz poprawiony kawałek wygląda tak:

 

for (int r=0; r < 9; r++)			
												
			{
				
				if (x[r] > x[r + 1])
				{
						pomocnicza = x[r];
						x[r] = x[r + 1];
						x[r + 1] = pomocnicza;
					z += 1;
				}
			}
			if  (z == 0)		
			{						
				j += 1;				
			}				

 

komentarz 4 listopada 2015 przez furas Maniak (53,800 p.)

W tym kodzie masz w pierwszej linii porównanie z `x[10]`  :)

Cały warunek `if(r==9)` jest niepotrzeby bo tam się nic nie dzieje. Przypisanie do `pomocnicza` i tak nigdzie potem nie jest wykorzystane.

Równie dobrze mógłbyś sprawdzac `r<9` w `for` zamiast robić potem `if ( r < 9)`

for (int r=0; r < 9; r++)

---

EDIT: gdy to pisałem zdążyłeś sam poprawić `r<9` :)

komentarz 4 listopada 2015 przez furas Maniak (53,800 p.)

przy okazji:

zamiast `if (x[0] >= 0)` można użyć `else` bo w tym przypadku na to samo wyjdzie.

A wewnątrz `else` można umieścić wypisywanie posortowanego wyniku.

Można też pozbyć się zmiennej `j` i wykorzystać tylko `z`.

Jeśli zmiennej `z` zmienić nazwę na bardziej czytelną `posortowane` to sytuacja stanie się bardziej zrozumiała.

 

    else
 
    {
        posortowane = false; // aby weszlo do while

        while (posortowane == false)
        {
            posortowane = true; // wartosc domyslna przed każdym sortowaniem
            for (int i = 0; i < 9; i++)           
            {
                if (x[i] > x[i + 1])     
                {   
                    pomocnicza = x[i];      
                    x[i] = x[i + 1];        
                    x[i + 1] = pomocnicza;   
                    posortowane = false;
                }   
            }
        }
 
        for (int i = 0; i < 10; i++)
        {
            cout << x[i] << " ";
        }
    }

 

komentarz 4 listopada 2015 przez Sebastian R Obywatel (1,110 p.)
ale dziękuję za trafną uwagę ;)
0 głosów
odpowiedź 4 listopada 2015 przez achilles147 Dyskutant (9,580 p.)
Najlepszym sposobem na znajdowanie takiego typu błędów jest poprostu debugowanie programu. Im szybciej się człowiek z tym oswoi tym lepiej!
komentarz 4 listopada 2015 przez Sebastian R Obywatel (1,110 p.)
Własnie chodzi o to, że błędów nie pokazywało. Chyba, że myślę o tym o czym nie trzeba?
komentarz 4 listopada 2015 przez furas Maniak (53,800 p.)
Błędy to nie tylko komunikaty podczas kompilacji. Błędy to też złe zaprogramowanie zadania - tak, że program nie robi tego co od niego oczekiwaliśmy.

Podobne pytania

+1 głos
1 odpowiedź 118 wizyt
pytanie zadane 30 marca 2020 w Systemy operacyjne, programy przez Michalecekxd Użytkownik (830 p.)
+2 głosów
1 odpowiedź 332 wizyt
0 głosów
2 odpowiedzi 200 wizyt
pytanie zadane 23 lutego 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

92,455 zapytań

141,263 odpowiedzi

319,099 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!

...