C++ problem z flagą logiczna.

0

Witam, mam takie zadanie do zrobiena
Wypełnić tablicę statyczną (rozmiar np 10) liczbami losowymi z zakresu <0,100>. Znaleźć najmniejszą spośród liczb podzielnych przez 8. Jeżeli nie było takich liczb wydrukować odpowiedni komunikat.
Ulepiłem coś takiego

#include <iostream>
#include <time.h>

using namespace std;
const int k=10;


//podzelna przez 8.
bool podzelna(int n)

{
	if (n%8==0)
	{
		if (n == 0)
			return false;
		return true;
	}
	else
	{
		
		return false;
	}
}

int main()
{
	setlocale(LC_ALL, "polish");
	srand(time(NULL));
	int tab[k];
	int min = 0;

	for (int i = 0; i < k; i++)
	{
		min = 100;
		tab[i] = rand() % 101;

		cout << tab[i] << endl;

		for (int i = 1; i < k; i++)
		{
			if (podzelna(tab[i]))
			{
				if (min > tab[i])
				{
					min = tab[i];
				}
			}


		}

	}
	if (min == 100)
	{
		cout << "\nbrak liczb podzielnych przez 8";
	}
	else
	{
		cout << "\nNajmniejszą wczytaną liczbą podzielną przez 8 jest: " << min << endl;
	}

ale niestety nie jest poprawne brakuje zmiennej logicznej ktora bedzie działała jako mechanizm kontroli błędów.

4

A powiedz może, co dokładnie nie działa?

Btw, 0 jest podzielne przez 8.

0

No, a dlaczego masz pętlę w pętli?

0
Maria Ulitzka napisał(a):

No, a dlaczego masz pętlę w pętli?

Nie rozumiem? w którym miejscu ?

0

Linie 31 i 38

0

OK znalazłem gdzie jest błąd. Czy to rozwiązanie jest poprawne ?

#include <iostream>
#include <time.h>

using namespace std;
const int k=10;


//podzelna przez 8.
bool podzelna(int n)

{
	if (n%8==0)
	{
		if (n == 0)
			return false;
		return true;
	}
	else
	{	
		return false;
	}
}

int main()
{
	setlocale(LC_ALL, "polish");
	srand(time(NULL));
	int tab[k];
	int min = 0;
	bool znaleziono = false;

	for (int i = 0; i < k; i++)
	{
		min = 100;
		tab[i] = rand() % 101;

		cout << tab[i] << endl;

		

	}
	for (int i = 1; i < k; i++)
	{
		if (podzelna(tab[i]))
		{
			if (min > tab[i])
			{
				min = tab[i];
				znaleziono = true;
			}
		}


	}
	if (znaleziono == false)
	{
		cout << "\nbrak liczb podzielnych przez 8";
	}
	else
	{
		cout << "\nNajmniejszą wczytaną liczbą podzielną przez 8 jest: " << min << endl;
	}
}
1

Tak, idea jest OK.

Pisze się to inaczej - sam zobacz jak to się fajnie czyta: jeśli nie znaleziono:

if ( ! znaleziono ) 
2

w linii 39 masz int i = 1, więc jak pierwsza będzie podzielna przez 8 a reszta nie to program wyświetli, że brak wyników. Ekstra wizualne poprawki to zamiast:

const int k = 10;

dałbym np.

constexpr int tab_size = 10;
1

@jvoytech akurat ta porada jest po części szkodliwa moim zdaniem. Taka konwencja nazewnicza wskazuje na to, że TAB_SIZE jest zdefiniowane za pomocą #define https://google.github.io/styleguide/cppguide.html#Macro_Names oraz https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Res-ALL_CAPS Akurat taka praktyka jest bardzo częsta i jak widzisz zalecana. Moim zdaniem zmyli dużo osób, więc lepiej tego unikać.

0
Mr.YaHooo napisał(a):

@jvoytech akurat ta porada jest po części szkodliwa moim zdaniem. Taka konwencja nazewnicza wskazuje na to, że TAB_SIZE jest zdefiniowane za pomocą #define https://google.github.io/styleguide/cppguide.html#Macro_Names oraz https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Res-ALL_CAPS Akurat taka praktyka jest bardzo częsta i jak widzisz zalecana. Moim zdaniem zmyli dużo osób, więc lepiej tego unikać.

Dzięki za linki. Po dłuższym zastanowieniu muszę przyznać Ci rację. Chyba za bardzo polubiłem ten Javowy styl nazywania stałych, że wszędzie go próbuje wciskać. Chociaż ten "niepoprawny styl" wizualnie jest według mnie lepszy, od razu widać że mamy do czynienia ze stałą.

0

@jvoytech akurat to się wywodzi jeszcze z czystego C gdzie takich define'ów było masę. Sam zaczynałem od tego języka, potem poszedłem w C++ i tak mi już zostało ;) Z drugiej strony taka sygnalizacja stałej może być godna uwagi. Nie mniej jednak jeśli się nie programuje w notatniku a sensownym IDE, to takie dodatkowe informacje nie są już tak ważne. IDE potrafi szybko podpowiedzieć deklarację danej rzeczy. Dlatego między innymi odeszło się od tzw. notacji węgierskiej która czasami bywa uciążliwa.

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