[Schematy blokowe][C] Pierwszość liczby

exevan
Użytkownik
Użytkownik
Posty: 29
Rejestracja: 25 lut 2014, o 21:16
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 6 razy

[Schematy blokowe][C] Pierwszość liczby

Post autor: exevan »

Witam chciałbym się poradzić informatyków. Nie wiem czy dobrze namalowałem ten schemat blokowy. Oto on.


Oraz do niego program:

Kod: Zaznacz cały

#include <stdlib.h>
#include <stdio.h>

int main()
{
    int n,i=1,j=0;

    printf("Podaj jakas liczbe: ");
    scanf("%d",&n); 
    
    for(i=1;i<=n;i++)
    {
        if(n%i==0)
        {
            j++;
        }
    }
    
    if(j>2) printf("Liczba %d nie jest liczba pierwsza",n);
    else printf("Liczba %d jest liczba pierwsza",n);
    system("pause");
    return(0);
}
Ostatnio zmieniony 13 lis 2014, o 13:13 przez Afish, łącznie zmieniany 1 raz.
Powód: Staraj się lepiej dobierać nazwy tematów, tak by wskazywały o czym jest treść zadania.
a4karo
Użytkownik
Użytkownik
Posty: 22203
Rejestracja: 15 maja 2011, o 20:55
Płeć: Mężczyzna
Lokalizacja: Bydgoszcz
Podziękował: 38 razy
Pomógł: 3753 razy

[Schematy blokowe][C] Pierwszość liczby

Post autor: a4karo »

1. Nie wiadomo którą scieżką iśc po n%i=0
2. jak sie zachowa algorytm gdy na wejsciu nie pojawi sie liczba naturalna? ERROR?, zaokrągli?


3. Po co ciągnąć obliczenia jak znajdziesz trzeci dzielnik?

i oczywiście można to zrobić szybciej, bo na pewno wiesz, że 1 i n są dzielnikami, więc po co je sprawdzać. A innych dzielników szuka się miedzy 2 i sqrt(n)
athame
Użytkownik
Użytkownik
Posty: 576
Rejestracja: 2 lut 2012, o 21:42
Płeć: Mężczyzna
Lokalizacja: Radom
Podziękował: 1 raz
Pomógł: 64 razy

[Schematy blokowe][C] Pierwszość liczby

Post autor: athame »

Po pierwsze w schematach blokowych zwyczajowo używa się kodu w stylu PASCAL-a, a nie C, nawet jeśli sam program pisany jest w C. Po drugie najpierw przypisujesz wartość do \(\displaystyle{ i}\), którą i tak potem ustalasz w pętli. Po trzecie możesz darować sobie sprawdzanie czy liczba całkowita dzielona przez 1 da wynik całkowity. To samo ze sprawdzaniem czy całkowity będzie wynik dzielenia liczby przez nią samą. Zwyczajowo każde wyjście z instrukcji warunkowej powinno być oznaczone TAK lub NIE (YES or NO), ewentualnie w skrócie T, N (Y, N) lub tylko jedno, ale tak by całość schematu była spójna.
exevan
Użytkownik
Użytkownik
Posty: 29
Rejestracja: 25 lut 2014, o 21:16
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 6 razy

[Schematy blokowe][C] Pierwszość liczby

Post autor: exevan »

a4karo pisze:1. Nie wiadomo którą scieżką iśc po n%i=0
2. jak sie zachowa algorytm gdy na wejsciu nie pojawi sie liczba naturalna? ERROR?, zaokrągli?


3. Po co ciągnąć obliczenia jak znajdziesz trzeci dzielnik?

i oczywiście można to zrobić szybciej, bo na pewno wiesz, że 1 i n są dzielnikami, więc po co je sprawdzać. A innych dzielników szuka się miedzy 2 i sqrt(n)
1. Nie oznaczyłem tam. Po n%i=0 na prawo jest na TAK, a na lewo NIE. Jeśli tak to zwiększa j i jest to liczba dzielników która potem jest sprawdzana jeśli sprawdzi wszystkie kombinacje. No wiadomo jeśli ma więcej niż 2 to ma więcej dzielników i nie jest to liczba pierwsza.
2. Czyli dodać do programu sprawdzanie czy liczba jest naturalna?

3. W sumie racja tylko jak wstawie jeszcze jeden blok warunkowy, który sprawdza czy j ma już 3 dzielniki, to się zrobi bałagan, a zaoszczędziło by to tylko jednej operacji.
a4karo
Użytkownik
Użytkownik
Posty: 22203
Rejestracja: 15 maja 2011, o 20:55
Płeć: Mężczyzna
Lokalizacja: Bydgoszcz
Podziękował: 38 razy
Pomógł: 3753 razy

[Schematy blokowe][C] Pierwszość liczby

Post autor: a4karo »

ALe możesz szukac dzielników od 3 krokiem 2 i konczyć na sqrt(n) i przerwać gdy znajdziesz choć jeden, to kończysz. (1 i 2 warto rozwazyc osobno)

Schematow blokowych nie pisze się po to, żeby ładnie wyglądały, tylko po to żeby napisac efektywny program

Sadzisz, że zaoszczedzi jednej operacji: weż n=24. Twoj algoytm wykona 24 pętle, Ze sprawdzaniem zrobi dla 1,2,3 i juz stanie.

W mojej propozycji sprawdzi 3 i się skończy.

Widzisz róznicę?
exevan
Użytkownik
Użytkownik
Posty: 29
Rejestracja: 25 lut 2014, o 21:16
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 6 razy

[Schematy blokowe][C] Pierwszość liczby

Post autor: exevan »

Kod: Zaznacz cały

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

int main()
{
	int n,i;
	system("cls");
	printf("Podaj jakas liczbe: ");
	scanf("%d",&n);
	if(n<2) {
		printf("Liczba %d nie jest liczba pierwsza",n);
	}
	else {
		for(i=2;i<=sqrt(n);i++) {
			if(n%i==0) {
				printf("Liczba %d nie jest liczba pierwsza",n);
				break;
			}
			else {
				printf("Liczba %d jest liczba pierwsza",n);
				break;
			}
		}
	}
	system("pause");
	return(0);
}

Czy to już jest lepiej napisane? Oczywiście program ten mi działa, ale tylko od liczby 4 w zwyż :/ Też nie wiedziałem jak zapisać na schemacie blokowym instrukcje break. Normalnie za głowę się łapie.. Takie proste (niby) zadanie, a jednak potrafi narobić problemów. Pisałem wg twoich wskazówek
a4karo
Użytkownik
Użytkownik
Posty: 22203
Rejestracja: 15 maja 2011, o 20:55
Płeć: Mężczyzna
Lokalizacja: Bydgoszcz
Podziękował: 38 razy
Pomógł: 3753 razy

[Schematy blokowe][C] Pierwszość liczby

Post autor: a4karo »

Ten schemat juz calkiem do kitu. SPrawdzi dla i=2 i się skonczy.

Co zwróci dla n=2,3?
exevan
Użytkownik
Użytkownik
Posty: 29
Rejestracja: 25 lut 2014, o 21:16
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 6 razy

[Schematy blokowe][C] Pierwszość liczby

Post autor: exevan »

Kod: Zaznacz cały

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

int main()
{
	int n,i;
	system("cls");
	printf("Podaj jakas liczbe: ");
	scanf("%d",&n);
	if(n<2) {
		printf("Liczba %d nie jest liczba pierwsza",n);
	}
	else {
		for(i=2;i<=sqrt(n);i++) {
			if(n%i==0) {
				printf("Liczba %d nie jest liczba pierwsza",n);
				system("pause");
				return 0;
			}
		}
		printf("Liczba %d jest liczba pierwsza",n);
	}
	system("pause");
	return(0);
}


no teraz działa pięknie i są wykorzystane twoje wskazówki od 2 do sqrt(n)
a4karo
Użytkownik
Użytkownik
Posty: 22203
Rejestracja: 15 maja 2011, o 20:55
Płeć: Mężczyzna
Lokalizacja: Bydgoszcz
Podziękował: 38 razy
Pomógł: 3753 razy

[Schematy blokowe][C] Pierwszość liczby

Post autor: a4karo »

A jakbyś zacząl od 3 i dodawal po 2 to byś miał jeszcze mniej operacji
ODPOWIEDZ