Zadanie z Algorytmiki. Mam rozwiązać problem: z 25 monet znaleźć 1 monetę lżejszą od innych. Trzeba zastosować zasadę podziału monet czyli: 1. 8, 8, 9 2. 9,9,7 To zadanie trzeba wykonać w programie SBWIN 32 Pro na schematach blokowych. Można to zadanie napisać też w dev c++ , w języku C. Jeśli nie w programie to proszę chociaż pomóc jakie bloczki zastosować.
//funkacja porownanieWag // porownuje sumy wag monet z dwoch fragmentow tablicy tab //funkacja porownanieWag przyjmuje argumenty: // od_1 - numer pierwszej monety w tablicy z grupy 1 // ile_1 - licznosc grupy 1 // od_2 - numer pierwszej monety w tablicy z grupy 2 // ile_2 - licznosc grupy 2 //funkacja porownanieWag zwraca: // 1 - druga grupa monet jest lzejsza // -1 - pierwsza grupa monet jest lzejsza // 0 - rownowaga int porownanieWag(int od_1, int ile_1, int od_2, int ile_2) { int i; float suma = 0; for (i = od_1; i < od_1 + ile_1; i++) suma = suma + tab[i]; for (i = od_2; i < od_2 + ile_2; i++) suma = suma - tab[i]; if (suma > 0) return 1; if (suma < 0) return -1; return 0; }
void komentujRoznice(int roznica) { if (roznica < 0) printf("Najlzejsza jest w pierwszej grupie.\n"); else if (roznica > 0) printf("Najlzejsza jest w drugiej grupie.\n"); else /* (roznica == 0) */ printf("Najlzejsza jest w trzeciej grupie.\n"); }
void szukajW (int pocz, int ile) { printf ("Szukam wsrod %d monet. (monety od %d do %d).\n", ile, pocz, pocz+ile-1);
if (ile == 1) printf ("Koniec algorytmu: najlżejsza jest moneta %d.\n", pocz); else if (ile == 3) { printf ("Stosuję podział 1-1-1.\n"); int roznica = porownanieWag(pocz, 1, pocz + 1, 1); komentujRoznice(roznica); if (roznica > 0) szukajW(pocz+1, 1); else if (roznica < 0) szukajW(pocz, 1); else /* roznica == 0*/ szukajW(pocz+2, 1); } else if (ile == 7) { printf ("Stosuję podział 3-3-1.\n"); int roznica = porownanieWag(pocz, 3, pocz+3, 3); komentujRoznice(roznica); if (roznica > 0) szukajW(pocz+3, 3); else if (roznica < 0) szukajW(pocz, 3); else /* roznica == 0*/ szukajW(pocz+6, 1); } else if (ile == 9) { printf ("Stosuję podział 3-3-3.\n"); int roznica = porownanieWag(pocz, 3, pocz+3, 3); komentujRoznice(roznica); if (roznica > 0) szukajW(pocz+3, 3); else if (roznica < 0) szukajW(pocz, 3); else /* roznica == 0*/ szukajW(pocz+6, 3); } else if (ile == 25) { printf ("Stosuję podział 9-9-7.\n"); int roznica = porownanieWag(pocz, 9, pocz+9, 9); komentujRoznice(roznica); if (roznica > 0) szukajW(pocz+9, 9); else if (roznica < 0) szukajW(pocz, 9); else /* roznica == 0*/ szukajW(pocz+18, 7); } else { printf ("Niezdefiniowany podzial %d.\n", ile); return; } }
int main() { srand(time(NULL)); //inicjalizacja wag int i; for(i = 0; i < LICZBA_MONET; i++) tab[i] = 5.21; //obnizenie wagi pewnej monety int pewna_moneta = rand()%LICZBA_MONET; tab[pewna_moneta] = 5.11; //algorytm szukajW(0,LICZBA_MONET); //sprawdzenie poprawnosci wyniku printf("Sprawdzenie: wylosowano monete %d.\n", pewna_moneta);
return 0; }
/* przykladowy wynik:
Szukam wsrod 25 monet. (monety od 0 do 24). Stosuję podział 9-9-7. Najlzejsza jest w drugiej grupie. Szukam wsrod 9 monet. (monety od 9 do 17). Stosuję podział 3-3-3. Najlzejsza jest w trzeciej grupie. Szukam wsrod 3 monet. (monety od 15 do 17). Stosuję podział 1-1-1. Najlzejsza jest w drugiej grupie. Szukam wsrod 1 monet. (monety od 16 do 16). Koniec algorytmu: najlżejsza jest moneta 16. Sprawdzenie: wylosowano monete 16.
#include <stdio.h>
#include "time.h"
#define LICZBA_MONET 25
float tab[LICZBA_MONET]; //wagi monet, w gramach
//funkacja porownanieWag
// porownuje sumy wag monet z dwoch fragmentow tablicy tab
//funkacja porownanieWag przyjmuje argumenty:
// od_1 - numer pierwszej monety w tablicy z grupy 1
// ile_1 - licznosc grupy 1
// od_2 - numer pierwszej monety w tablicy z grupy 2
// ile_2 - licznosc grupy 2
//funkacja porownanieWag zwraca:
// 1 - druga grupa monet jest lzejsza
// -1 - pierwsza grupa monet jest lzejsza
// 0 - rownowaga
int porownanieWag(int od_1, int ile_1, int od_2, int ile_2)
{
int i;
float suma = 0;
for (i = od_1; i < od_1 + ile_1; i++) suma = suma + tab[i];
for (i = od_2; i < od_2 + ile_2; i++) suma = suma - tab[i];
if (suma > 0) return 1;
if (suma < 0) return -1;
return 0;
}
void komentujRoznice(int roznica)
{
if (roznica < 0) printf("Najlzejsza jest w pierwszej grupie.\n");
else
if (roznica > 0) printf("Najlzejsza jest w drugiej grupie.\n");
else
/* (roznica == 0) */ printf("Najlzejsza jest w trzeciej grupie.\n");
}
void szukajW (int pocz, int ile)
{
printf ("Szukam wsrod %d monet. (monety od %d do %d).\n", ile, pocz, pocz+ile-1);
if (ile == 1) printf ("Koniec algorytmu: najlżejsza jest moneta %d.\n", pocz);
else
if (ile == 3)
{
printf ("Stosuję podział 1-1-1.\n");
int roznica = porownanieWag(pocz, 1, pocz + 1, 1);
komentujRoznice(roznica);
if (roznica > 0) szukajW(pocz+1, 1);
else if (roznica < 0) szukajW(pocz, 1);
else /* roznica == 0*/ szukajW(pocz+2, 1);
}
else
if (ile == 7)
{
printf ("Stosuję podział 3-3-1.\n");
int roznica = porownanieWag(pocz, 3, pocz+3, 3);
komentujRoznice(roznica);
if (roznica > 0) szukajW(pocz+3, 3);
else if (roznica < 0) szukajW(pocz, 3);
else /* roznica == 0*/ szukajW(pocz+6, 1);
}
else
if (ile == 9)
{
printf ("Stosuję podział 3-3-3.\n");
int roznica = porownanieWag(pocz, 3, pocz+3, 3);
komentujRoznice(roznica);
if (roznica > 0) szukajW(pocz+3, 3);
else if (roznica < 0) szukajW(pocz, 3);
else /* roznica == 0*/ szukajW(pocz+6, 3);
}
else
if (ile == 25)
{
printf ("Stosuję podział 9-9-7.\n");
int roznica = porownanieWag(pocz, 9, pocz+9, 9);
komentujRoznice(roznica);
if (roznica > 0) szukajW(pocz+9, 9);
else if (roznica < 0) szukajW(pocz, 9);
else /* roznica == 0*/ szukajW(pocz+18, 7);
}
else
{
printf ("Niezdefiniowany podzial %d.\n", ile);
return;
}
}
int main()
{
srand(time(NULL));
//inicjalizacja wag
int i;
for(i = 0; i < LICZBA_MONET; i++) tab[i] = 5.21;
//obnizenie wagi pewnej monety
int pewna_moneta = rand()%LICZBA_MONET;
tab[pewna_moneta] = 5.11;
//algorytm
szukajW(0,LICZBA_MONET);
//sprawdzenie poprawnosci wyniku
printf("Sprawdzenie: wylosowano monete %d.\n", pewna_moneta);
return 0;
}
/*
przykladowy wynik:
Szukam wsrod 25 monet. (monety od 0 do 24).
Stosuję podział 9-9-7.
Najlzejsza jest w drugiej grupie.
Szukam wsrod 9 monet. (monety od 9 do 17).
Stosuję podział 3-3-3.
Najlzejsza jest w trzeciej grupie.
Szukam wsrod 3 monet. (monety od 15 do 17).
Stosuję podział 1-1-1.
Najlzejsza jest w drugiej grupie.
Szukam wsrod 1 monet. (monety od 16 do 16).
Koniec algorytmu: najlżejsza jest moneta 16.
Sprawdzenie: wylosowano monete 16.
*/