Liczby pierwsze z zakresu – return jeden dla liczby pierwszej, return 0 dla innych

0

Mój problem polega na tym, że jeśli liczby są pierwsze to return jest 1, natomiast dla innych jest to return 0. Zrobiłem to w taki sposób

#include <stdio.h>
#include <conio.h>
int czyPierwsza(int liczba)
{
int i, j, n, n2, p;
printf("Podaj zakres: ");
	scanf("%d" "%d", &n, &n2);
	for(i = n; i <= n2; ++i)
	{
		p = 1;
		for(j = 2; j < i; ++j)
			if(i % j == 0)
			{
				p = 0;
				break;
			}
			{
		if(p)
	return 1;
	else return 0;
		
		}
	}
	}
	int main(void)
{
	int suma;
	suma=czyPierwsza(1);
	printf("%d", suma);
}

Wiem, że ten printf czyta tylko 1, ale nie wiem jak mam zrobić to inaczej. Musi to być oznaczone jedynką i int main musi czytać funkcje czyPierwsza. Mógłby ktoś jakoś wyjaśnić jak to zrobić?

2

Nie rozumiem, o co pytasz…. printf niczego nie czyta, on wyświetla sformatowany tekst na ekran. Jeśli chcesz pobrać dane, to służy do tego scanf z rodziną.

A, za każdym razem, jak ktoś załącza w programie conio.h, to gdzieś na świecie umiera mały kotek. Dbajmy o kotki!

0

Na temat:

Nie rozumiem, w czym problem? Tj. nie rozumiem nawet, co chcesz zrobić?

Funckja czyPierwsza ma sprawdzać czy pojedyncza liczba jest pierwsza czy też czy wszystkie liczby z zakresu są pierwsze?

Podajesz tej funkcji pojedynczą liczbę jako argument, czyli tak jakbyś chciał robić to pierwsze. Ale funkcja ignoruje ten argument, sama prosi użytkownika o ZAKRES i sprawdza cały zakres.

Czym ma też być suma?

Poza tematem:

Po co dołączasz conio.h skoro z niego nie korzystasz?

0

Chcę, aby funkcja czyPierwsza sprawdziła te 2 liczby i następnie int main przywołał tę funkcje i wyświetlił liczby, które są pierwsze (dodatkowo liczby pierwsze mają mieć return 1) conio.h napisałem z nawyku, bo do tej pory prawie cały czas był używany jak miałem pisać coś innego.

Dla sprawdzenia 1 liczby czy jest pierwsza w tej funkcji i później wrzucenia tego do int maina dla zakresu całkowicie nie wiedziałbym jak mam to zrobić, więc zrobiłem tak...

0

Eh? Funkcja czyPierwsza musi sprawdzać cały zakres na raz ale musisz coś zwrócić dla każdej liczby z zakresu?

Coś tu zgrzyta, czy ty aby nie musisz zwrócić tablicy?

Czy mógłbyś dać pełną treść zadania?

EDIT: Przepraszam: nie zakres, ani nie jedną liczbę, ale 2 liczby? Naprawdę nic już nie rozumiem i jeszcze raz proszę o treść zadania :)

0

Napisz program, który wyświetla wszystkie liczby pierwsze w zadanym przedziale. Sprawdzanie, czy dana
liczba jest liczbą pierwszą zamknij w oddzielnej funkcji:
int czyPierwsza(int liczba)
Funkcja pobiera jeden parametr typu całkowitego (liczbę do sprawdzenia) i zwraca jedną liczbę całkowitą oznaczającą:

▪ wartość 1: to jest liczba pierwsza,
▪ wartość 0: to nie jest liczba pierwsza.

//Wiem, że funkcja jest źle, bo pobiera 2 liczby, ale nie wiem jak mam to zrobić dla 1 liczby, a później przekształcić to na zakres.

1
klonstoper napisał(a):

Chcę, aby funkcja czyPierwsza sprawdziła te 2 liczby […]

Które dwie liczby?

conio.h napisałem z nawyku, bo do tej pory prawie cały czas był używany jak miałem pisać coś innego.

Biedne kotki…

Dla sprawdzenia 1 liczby czy jest pierwsza w tej funkcji i później wrzucenia tego do int maina dla zakresu całkowicie nie wiedziałbym jak mam to zrobić, więc zrobiłem tak...

Jak chcesz sprawdzić więcej niż jedną liczbę, to wywołaj funkcję sprawdzającą więcej niż jeden raz, po kolei na każdej, którą chcesz sprawdzić.

(no, w „prawdziwym” programie by było pewnie jakieś spamiętywanie czy coś, ale to już wyższa szkoła jazdy na kucyku)

2

Ah. To funkcja czyPierwsza ma sprawdzać JEDNĄ liczbę, a nie cały zakres, tak jak to napisałeś.

Pętla przerabiająca zakres leci do maina. W mainie wywołujesz funkcję czyPierwsza osobno dla każdej liczby,

0

Przerobiłem to do takiej postaci, jednak dalej jest błędnie.

#include <stdio.h>
int czyPierwsza(int liczba)
{
int i, j, p;
	for(i = 2; i <= liczba; ++i)
	{
		p = 1;
		for(j = 2; j < i; ++j)
			if(i % j == 0)
			{
				p = 0;
				break;
			}
			{
		if(p)
	return 1;
	else return 0;
		}
	}
	}
	int main(void)
{
	int suma, liczba1, liczba2, suma2;
	printf("Podaj zakres: ");
	scanf("%d" "%d", &liczba1, &liczba2);
		suma=czyPierwsza(liczba1);
	suma2=czyPierwsza(liczba2);
	printf("%d" "%d", suma, suma2);
}
0

Dlaczego pętla przebiegająca po zakresie dalej jest w funkcji czyPierwsza?

Wybacz za pytanie, ale czy wiesz, jak działa pętla for?

0

Ano jest. Ty chcesz puścić pętlę po zadanym zakresie i zliczać wszystkie liczby pierwsze — czyli ustawić sobie zmienną suma na zero i potem do niej dodawać wartości funkcji czyPierwsza, bo tak się szczęśliwie składa, że zwraca ona 1 dla pierwszych.

0

Po prostu nie wiem jak mam przywołać funkcję, żeby policzyło najpierw dla liczby1, później dla liczby 2, a następnie wyświetliło część wspólną. Fora robiłem jedynie dla programów bez przywołania funkcji, gdzie warunek był od liczby 1 do liczby 2, a i robiło proste działanie typu potęgi w zakresie itp...

1

Spokojnie możesz wywoływać funkcję czyPierwsza wewnątrz fora który jest w mainine. Spokojnie możesz licznik pętli przekazać tej funkcji jako argument. Niech ta funkcja sprawdza TYLKO czy ta liczba, jaką otrzymała jako argument, jest pierwsza.

(for(int i = poczatek; i < koniec; i++) - tutaj i jest licznikiem pętli)

Do rozwiązania zadania krok 1: przerobić funkcję czyPierwsza by sprawdzała, czy podany jej argument jest liczbą pierwszą i TYLKO czy ten JEDEN argument jest liczbą pierwszą, bez oglądania się na jakiekolwiek inne liczby.

1

Widzisz, cały szkopuł w tym, że Ty nie chcesz mieć funkcji, która „wyświetla część wspólną”, cokolwiek przez to rozumiesz. Funkcja czyPierwsza ma mieć dokładnie jedno zadanie — ma sprawdzać, czy dana jej liczba jest pierwsza. Tylko to, nic mniej, nic więcej.

A reszta logiki ma być w funkcji głównej (main). To ta funkcja ma pobrać od użytkownika zakres i wywołać w pętli tę pierwszą, sprawdzającą po kolei liczby.

0

Poddaje się, zrobiłem coś takiego w funkcji main

	int suma, liczba1, liczba2, i;
	printf("Podaj zakres: ");
	scanf("%d" "%d", &liczba1, &liczba2);
	for (i=liczba1; i<=liczba2 ; i++)
		suma=czyPierwsza(i);	
	printf("%d", suma);

I teraz rozumiem to w ten sposób, funkcja for rozpoczyna poszukiwanie od liczby 1, dochodząc aż do ostatniej liczby. Po drodze przekazuje wszystkie liczby po kolei do funkcji czyPierwsza, wyświetla sume, czyli wynik (każdy argument po kolei)... Im dłużej to robię tym większe nerwy... ;x

2

Main wygląda OK, jeśli celem jest wypisanie liczby liczb pierwszych, oprócz jednego fragmentu:

suma=czyPierwsza(i)

Jak działa operator = w C?

Przecież teraz za każdym obrotem pętli nic nie dodajesz do sumy. Zamiast tego Ty zapisujesz do sumy 0 albo 1 w zależności czy i jest pierwsza czy nie, wyrzucając do śmieci wszystko, co w tej zmiennej było zapisane z poprzednich obrotów pętli.

Jak się dodaje do zmiennej w C?

1

Ponadto: Nie wiem, co tu w ogóle robi zmienna suma? Sprawdziłem jeszcze raz treść zadania: ty nie masz nic dodawać do siebie, tylko WYPISAĆ wszystkie liczby pierwsze z przedziału!

Napisz program, który wyświetla wszystkie liczby pierwsze w zadanym przedziale.

Czemu zatem, zamiast dodawać lub zapisywać cokolwiek do zmiennej suma, po prostu nie wypiszesz liczby przerabianej w danym obrocie pętli, jeśli jest pierwsza?

0

robiąc w ten sposób

czyPierwsza(i);	
	printf("%d", i);

Też będzie źle, naprawdę nie mam kompletnie pomysłu, mam do napisania 1 program z pętlą, a wszystkie przykłady, które miałem były banalne w porównaniu do tego.

0

Czemu nigdzie nie przyporządkowujesz rezultatu funkcji czypierwsza? Sam program jest prosty, musisz tylko prawidłowo korzystać z funkcji czypierwsza, czyli tak:

int ilosc = 0
for (i z zakresu od do)
{
	ilosc =ilosc +  czypierwsza(i)
}
0
klonstoper napisał(a):

robiąc w ten sposób

czyPierwsza(i);	
	printf("%d", i);

Też będzie źle, naprawdę nie mam kompletnie pomysłu, mam do napisania 1 program z pętlą, a wszystkie przykłady, które miałem były banalne w porównaniu do tego.

Podpowiedź: Jest taka przydatna instrukcja if.

Podpowiedź druga: Jeśli zapomniałeś o klamrach pod for-em, to nie zapominaj :)

0
  czyPierwsza(i);
	if(i=1)
	printf("%d", i);

rozumiem, że tak ma być? (jeśli i=1 to liczba jest pierwsza i wypisuje tę liczbę w printfie?)

1

Nie. No przyjrzyj się proszę temu, co piszesz — if(i=1). Jeszcze raz: i=1. Czyli „zmiennej i przypisz wartość 1”. Jaki to, Twoim zdaniem, ma związek z pierwszością?

2

Jak się wykorzystuje wartość zwracaną przez funkcję?

Jeśli dobrze napisałeś funkcję czyPierwsza, to:

if(czyPierwsza(5))
{
    printf("TAK\n");
}
else
{
    printf("NIE\n");
}

Powinno wypisać TAK

Natomiast

if(czyPierwsza(500))
{
    printf("TAK\n");
}
else
{
    printf("NIE\n");
}

Powinno wypisać NIE

Jeśli wciąż nie rozumiesz, jak się to obsługuje, to przeczytaj rozdz. w podręczniku nt korzystania ze zwróconych przez funkcję wartości

 czyPierwsza(i);
    if(i=1)
    printf("%d", i);

NIE NIE NIE NIE NIE

Nie myślisz. Wybacz.

i to nie jest to, co zwróciła funkcja czyPierwsza

i to jest TA LICZBA O KTÓREJ CHCEMY WIEDZIEĆ CZY JEST PIERWSZA a NIE informacja czy jest ona pierwsza

Co bodaj jeszcze gorsze:

if(i=1)

pojedyncze = to jest instrukcja PRZYPISANIA NIE PORÓWNANIA

Od tej chwili i będzie równe 1 a nie wiem, czy tego chcesz (i to mają być kolejne liczby z zakresu a 1 nie należy do zakresu)

Instrukcja porównania to PODWÓJNE ==

0

Dobra, ostatnie pytanie na dzisiaj, bo już i tak tego nie wymyślę, nie wiem może jutro na spokojnie się uda, ale przerasta mnie tak proste zadanie.
W funkcji czyPierwsza mam zwrócone 1 jak liczba jest pierwsza, 0 jak jest inna. W jaki sposób mogę to wykorzystać, skoro czyPierwsza(i) zmienia argumenty po kolei od liczby1 do liczby2, więc przyrównanie jej do 1 lub 0 nic nie da. Jaki inny mogę postawić warunek?

1

Ależ jak najbardziej da! Dowiesz się, czy każda jedna konkretna liczba jest pierwsza czy nie, na czym Ci właśnie zależy.

0

Zrobiłem dzisiaj to w ten sposób:

#include <stdio.h>
int czyPierwsza(int liczba)
{
int i, j, p;
scanf("%d", liczba);
	for(i = 2; i <= liczba; ++i)
	{
		p = 1;
		for(j = 2; j < i; ++j)
			if(i % j == 0)
			{
				p = 0;
				break;
			}
			{
		if(p)
	return 1;
	else return 0;
		}
	}
	}
	int main(void)
{
	int  liczba1, liczba2, i;
	printf("Podaj zakres: ");
	scanf("%d" "%d", &liczba1, &liczba2);
	for (i=liczba1; i<liczba2;i++)
	{
			if(czyPierwsza(i)==1)
		printf("\nLiczby pierwsze w zakresie od %d do %d: %d ", liczba1, liczba2, i);
		}
}

Jednak dalej jest źle. Rozumiem z tego, że if liczba jest pierwsza (załóżmy dla 7 return równa się 1 więc zgadza się z warunkiem) wyświetla ją w printf. Niestety cały weekend mi odpada, żeby jakoś z tym pokombinować, a niedługo muszę oddać...

0

Po co wczytujesz liczbę w czyPierwsza()? Wywal to i będzie działać dużo lepiej, bo nie na wczytanej tylko na tej co ją w parametrze dostanie. Dodatkowo jak okaże się nie pierwsza (brak reszty z dzielenia) to bym od razu return dał a nie break

0
int czyPierwsza(int liczba)
{
    int i;
    for (i = 2; i * i <= liczba; ++i) {
        if (liczba % i == 0)
              return 0;
    }
    return 1;
}

int main(void)
{
    int liczba1, liczba2, i;
    printf("Podaj zakres: ");
    scanf("%d %d", &liczba1, &liczba2);
    printf("\nLiczby pierwsze w zakresie od %d do %d:", liczba1, liczba2);
    for (i = liczba1; i < liczba2; i++) {
        if (czyPierwsza(i) == 1)
           printf(" %d", i);
    }
}

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