C++ problem z flagą logiczna.

C++ problem z flagą logiczna.
Wipeatlast
  • Rejestracja:prawie 5 lat
  • Ostatnio:prawie 5 lat
  • Postów:5
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

Kopiuj
#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.

AK
No to ją wprowadź. Jesli napisałeś ten kod, to go rozumiesz.
enedil
  • Rejestracja:prawie 12 lat
  • Ostatnio:6 dni
  • Postów:1027
4

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

Btw, 0 jest podzielne przez 8.

Maria Ulitzka
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 2 lata
  • Postów:11
0

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

Wipeatlast
  • Rejestracja:prawie 5 lat
  • Ostatnio:prawie 5 lat
  • Postów:5
0
Maria Ulitzka napisał(a):

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

Nie rozumiem? w którym miejscu ?

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:4 dni
  • Lokalizacja:Szczecin
0

Linie 31 i 38


Wipeatlast
  • Rejestracja:prawie 5 lat
  • Ostatnio:prawie 5 lat
  • Postów:5
0

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

Kopiuj
#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;
	}
}
AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 2 miesiące
  • Postów:3561
1

Tak, idea jest OK.

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

Kopiuj
if ( ! znaleziono ) 

Bo C to najlepszy język, każdy uczeń ci to powie
JV
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 miesiące
  • Postów:242
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:

Kopiuj
const int k = 10;

dałbym np.

Kopiuj
constexpr int tab_size = 10;
edytowany 1x, ostatnio: jvoytech
Wipeatlast
faktycznie przecież tablica zaczyna sie od 0
MY
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 godzin
  • Postów:1083
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ć.

edytowany 1x, ostatnio: Mr.YaHooo
JV
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 miesiące
  • Postów:242
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łą.

MY
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 godzin
  • Postów:1083
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.