Pojawiające się w programie liczby nie wiadomo skąd ..

0

Witam,

Napisałem kilka dni temu program, który po wprowadzeniu 10 liczb z przedziału od 0 do 100 sprawdza liczby, czy są parzyste czy też nie i na końcu zwraca liczby nieparzyste większe od 30 w odwrotnej kolejności dodatkowo oddzielając je znakiem "-". Tutaj właśnie pojawia się wspomniany w temacie błąd otóż
jak zwracany jest wynik program dodaje ciąg liczb nie wiadomo skąd wziętych i miesza je z liczbami pierwszymi przy zwracaniu wyniku, nie wiem czemu tak jest bo nie widzę gdzie to by mogło się wkraść do programu, dlatego proszę o pomoc, chce wiedzieć czemu tak się dzieje i jak temu zaradzić.

Mam jeszcze jedno pytanie dotyczące tego jak mogę po sprawdzeniu liczb pod kątem parzystych i nieparzystych, zaznaczyć liczby parzyste, ja w swoim programie wszystkie ustawiłem na wartość 999 i wypisywałem wszystkie oprócz tych z wartością 999 ale wydaje mi się ,że jest to dość nie efektowne rozwiązanie.

Pozdrawiam

#include <iostream>
#include <conio.h>
#include <cstdlib>
using namespace std;

int main()
{
	// Zmienne
	int dane[10]; // tablica z wprowadzonymi danymi
	int wynik[10];
	
	for(int a=0;a<10;a++) // Wprowadzanie danych
	{
		cout << "Podaj " << a+1 << " liczbe: ";
		cin >> dane[a];
	}
	
	cout<<"---------------------------------------------------------------"<<endl;
	
	for(int b=0;b<10;b++) // Sprawdzanie danych
	{
		if(dane[b]>0 && dane[b]<=100)
		{
			cout<<"Liczba "<<dane[b]<<" jest poprawna"<<endl;
		} 
		else 
		{
			cout<<"Liczba "<<dane[b]<<" jest niepoprawna"<<endl;	
		}
	}
	
	cout<<"---------------------------------------------------------------"<<endl;

	for(int c=0;c<10;c++)
	{
		if(dane[c]%2==0)
		{
			cout<<"Liczba "<<dane[c]<<" jest parzysta"<<endl;
			dane[c]=999;
		}
		else
		{
			cout<<"Liczba "<<dane[c]<<" jest nieparzysta"<<endl;
		}
	}
	
	cout<<"---------------------------------------------------------------"<<endl;

	for(int d=10;d>0;d--) // Zwrocenie wynikow
	{
		if(dane[d]!=999 && dane[d]>30)
		{
			cout<<dane[d]<<" - ";
		}
	}
	
	cout<<"\n---------------------------------------------------------------"<<endl;
	
	// Zakonczenie programu
	system("PAUSE");
	return 0;
} 
1

Nie wiem jak twój kompilator, ale mi code::blocks wyrzucił 2 ostrzeżenia:
nieużywana zmienna (a ściślej tablica) wynik,
oraz ryzyko wyjścia "poza tablicę" w linijce 51 czyli tej if(dane[d]!=999 && dane[d]>30). Przyczyna jednak jest linijkę wyżej (nie licząc {) czyli tutaj for(int d=10;d>0;d--). indeksy tablicy są od zera, więc 10-cio elementowa ma je od 0 do 9 a nie od 1 do 10 jak ty chcesz. W miejscu 10 są "śmieci" (np fragment kodu programu albo pozostałość po innym) i pewnie stąd te liczby "nie wiadomo skąd". To tak na szybko, spróbuję go poprawić i w razie czego editnę.

edit: po wykonaniu poprawki w forze na for(int d=9;d>=0;d--) wydaje się działać poprawnie. Aczkolwiek usunął by też tablicę wynik, szkoda pamięci.

0

jeżeli musisz zrobić to na tablicach to proponuje zrobić to tak najpierw zainicjować wynik samymi zerami
int wynik = {}; //bedziesz miec na wszystkich indeksach wartosc 0
następnie wpisywać do tablicy wynik liczby parzyste i wyświetlasz po prostu liczby większe od 30 (sprawdzasz na tablicy wynik)

jeżeli nie musisz robić tego na tablicach użyj vectora i tam dodawaj parzyste większe od 30 i wyświetl vector

0

Tak rzeczywiście problem był w zakresie tablicy, śmieszny błąd a ja się zastanawiałem skąd się to bierze, następnym razem będę uważniej sprawdzał kod. Dziękuje sig za szybką pomoc.

Pozdrawiam

5

Dlaczego, ach dlaczego STL jest tak potwornie ignorowany?

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

int main(int argc, char** argv)
{
    std::vector<int> input;
    std::copy(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(), std::back_inserter(input));
    std::copy_if(input.crbegin(), input.crend(), std::ostream_iterator<int>(std::cout, "-"),
            [](int i) { return i > 30 && i % 2 == 1; });
    std::cout << std::endl;
}

Edit Była mała skarga/uwaga, że się nie kompiluje (cóż, Dev-C++ raczej tego nie łyknie), więc jeszcze w wersji dla C++03 (jak dla mnie brakuje tu już tej finezji poprzedniego rozwiązania :P):

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
 
bool pred_remove(int i)
{
    return !(i > 30 && i % 2 == 1);
}
 
int main(int argc, char** argv)
{
    std::vector<int> input;
    std::copy(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(), std::back_inserter(input));
    std::vector<int>::iterator new_end = std::remove_if(input.begin(), input.end(), &pred_remove);
    std::reverse(input.begin(), new_end);
    std::copy(input.begin(), new_end, std::ostream_iterator<int>(std::cout, "-"));
    std::cout << std::endl;
}
2
rincewind napisał(a):

std::copy(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(), std::back_inserter(input));
std::vector<int>::iterator new_end = std::remove_if(input.begin(), input.end(), &pred_remove);
std::reverse(input.begin(), new_end);
std::copy(input.begin(), new_end, std::ostream_iterator<int>(std::cout, "-"));

    std::remove_copy_if(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(), std::back_inserter(input), &pred_remove);
    std::copy(input.rbegin(), input.rend(), std::ostream_iterator<int>(std::cout, "-"));

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