Problem pri resavanju zadatka iz programiranja

3

Problem pri resavanju zadatka iz programiranja

offline
  • Programer
  • Pridružio: 23 Maj 2012
  • Poruke: 4425

#include <stdio.h> #include <stdlib.h> #include <time.h> time_t sekunde(int a[3]) {     struct tm tmdate = {0};     tmdate.tm_year = atoi(&a[2]) - 1900;     tmdate.tm_mon = atoi(&a[1]) - 1;     tmdate.tm_mday = atoi(&a[0]);     time_t t = mktime( &tmdate );     return t; } int uporedi(const void *a, const void *b) {     if( *(int*)a == *(int*)b )     {         return 0;     }     return *(int*)a < *(int*)b ? -1 : 1; } int * unesi(int v) {     static int t[20];     int a[3], i,j;     for(i=0;i<v;i++)     {         for(j=0;j<3;j++)         {             scanf("%i",&a[j]);         }         t[i] = sekunde(&a);     }     qsort(t, v, sizeof(int), uporedi);     return t; } int main() {     int n, i, max;     max = 1;     printf("Unesi broj statusa: ");     scanf("%i",&n);     int* a = unesi(n);     for (i=0; i<n-1;i++)     {         if (a[i+1] > a[i] + 86400)         {             max = 0;         }         max++;     }     printf("Max broj vezanih statusa: %i", max);     return 0; }

Radi sa ovim primera koje sam probao iz prvog posta Smile

Ima još dosta stvari koje treba ispraviti, ali nemam baš sad vremena da idem u detalje, ovo je verzija koja radi sa minimalnim ispravkama.



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Milos Stojanovic
  • Nezaposlen
  • Pridružio: 31 Dec 2015
  • Poruke: 722
  • Gde živiš: Srbija / Zajecar

Eto mene opet, ali sa malo drugacijim problemom Very Happy. Pravio sam program koji sluzi za konvertovanje binarnih brojeva u dekadne. Evo ga program:

IZ BINARNIH U DEKADNE
#include<stdio.h> #include<math.h> main() {    int i , x = 0, step = 0;    long n;    printf("Unesi binarni broj: ");    scanf("%i",&n);    while(n != 0)    {       i = n % 10;       x = x + i * pow(2,step);       step++;       n = n / 10;    }    printf("Dekadni broj je %i",x);    scanf("%i"); }

Imam problem to sto ako unesem binarni broj kao long ili int tip promenljive sa puno cifara (racunar to vidi kao veliki broj), na kraju ne dobijam dobar rezultat u dekadnom izdanju broja. Na primer, ako unesem binarni broj 1111111111 (deset jedinica) dobijem rezultat 1023 sto je dobro, ali ako unesem broj 11111111111 (jedanaest jedinica) dobijem rezultat -3809. Kako to da sredim?

Pravio sam program za konvertovanje dekadnih u binarne i to sam radio tako sto mi je rezultat kao binarni broj zapravo niz brojeva (nula i jedinica). To radi i sa velikim brojeva. Verovatno bih mogao da napravim unos binarnog broja kao niz brojeva, ali onda ne znam kako da prekinem niz, a da ne ukucavam neki drugi broj ili da vec nisam na pocetku definisao koliko ce binarni broj da ima cifara.

Hvala!



offline
  • Programer
  • Pridružio: 23 Maj 2012
  • Poruke: 4425

Možeš da ucitaš ceo broj sa ulaza kao string, odradiš split i to ubaciš u linked listu (ili neku drugu dinamički rastuću strukturu).

offline
  • Milos Stojanovic
  • Nezaposlen
  • Pridružio: 31 Dec 2015
  • Poruke: 722
  • Gde živiš: Srbija / Zajecar

Sad sam bas gledao sta je split i nije mi bas jasno. Sta on tacno radi? Jel on odvaja elemente stringa izmedju zadatih karaktera?

offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 13993
  • Gde živiš: Niš

Napisano: 16 Apr 2018 18:23

Ne treba ti lančana lista, tako samo komplikuješ bespotrebno. Možeš da obrađuješ string počev od poslednjeg elementa.

Takođe, gledaj da izbaciš pow i deljenje, pošto su to skupe operacije u odnosu na shift operator koji je ovde dovoljan da ti završi ceo posao. On je tipa 100 puta brži od deljenja. Very Happy Mada, ako je pow implementiran kako treba, trebalo bi da interno koristi shift kada radi sa osnovom koja je stepen dvojke.

Dopuna: 16 Apr 2018 18:51

Generalno, za ovaj problem su ti potrebne samo dve operacije - plus i shift:
#include <stdio.h> #include <string.h> #define MAX_LEN 32 using namespace std; int main() {     char line[MAX_LEN];     int i, len, result = 0;     long factor = 1;         printf("Unesi binarni broj: ");     if (fgets(line, MAX_LEN, stdin) != NULL)     {         len = strlen(line);         for(i = len - 2; i >= 0; i--)         {             if((char)line[i] == '1')                 result += factor;                         factor = factor << 1;         }     }     printf("Dekadni broj je %i", result);     return 0; }

Dopuna: 16 Apr 2018 18:55

E da, proveri samo ovo oko strlen, pošto se ne sećam tačno kako tačno računa dužinu, tj. da li uključuje u dužinu '\n' ili jok.

offline
  • Milos Stojanovic
  • Nezaposlen
  • Pridružio: 31 Dec 2015
  • Poruke: 722
  • Gde živiš: Srbija / Zajecar

Pregledao sam tvoj program i malo googlao, ali imam neka pitanja.

1. Cemu sluzi using namespace? Vidim da se osim u 6. liniji koda vise ne pominje ni namespace ni std.
2. Zasto je promenjiva factor jednaka 1 kada je definisana?
3. Funkcija fgets() mi nije bas jasna. Prvi argument je ime stringa, drugi max duzina stringa, ali mi ovaj treci argument nije jasan.
4. Zasto je u for ciklusu i = len - 2? Zar ne bi trebalo da bude i = len - 1, posto strlen ne racuna '\0' u duzinu stringa.
5. Da li shift operator sluzi samo da pomeri sa jednog elementa stringa na drugi?

Hvala!

offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 13993
  • Gde živiš: Niš

1. Namespace je zaostao iz C++ šablona. Ovde je to suvišno, slobodno ignoriši.
2. Zato što tako treba. Tu promenljivu treba da posmatraš kao jedan bit koji samo 'šetaš' u zavisnosti od težine.
3. Treći argument je pokazivač na tok (stream) iz koga se čita string. U ovom slučaju je to standardni ulaz (stdin - odnosno unos sa tastature).
4. Zato što težine bitova u binarnom zapisu takođe kreću od 0. Binarni broj 110 jednak je dekadnom 1*2^2 + 1*2^1 + 0*2^0 = 6. Dakle, prilikom inicijalizacije i na n - 2, to 2 je da bi se najpre anulirao zero based indeks (što vredi za pomeraj 1), kao i da bi se anulirala zero based težina u binarnom zapisu (što takođe vredi 1).
5. Ne. Shift uopšte ne radi sa stringom u ovom slučaju. Shift pomera sadržaj jedne promenljive ulevo ili udesno za broj mesta koji se navodi kao desni operand. Shift ulevo za jednu poziciju ekvivalentan je množenju sa dva (npr. 0100 postaje 1000), a shift udesno deljenju sa dva.

offline
  • Milos Stojanovic
  • Nezaposlen
  • Pridružio: 31 Dec 2015
  • Poruke: 722
  • Gde živiš: Srbija / Zajecar

Jel mozes molim te da mi objasnis kako radi program? Ne ide mi uopste.

offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 13993
  • Gde živiš: Niš

Čita 'bit' po bit iz ulaznog stringa i ako je tekući bit jednak 1 dodaje 2^težina-bita na izlazni rezultat.

Probaj da u dibageru prođeš kroz kod iteraciju po iteraciju i shvatićeš već.

Ko je trenutno na forumu
 

Ukupno su 491 korisnika na forumu :: 30 registrovanih, 3 sakrivenih i 458 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 1567 - dana 15 Jul 2016 20:18

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: Apok, caesar2, darionis, Dicus, Dimitrise93, Drug pukovnik, geo.dule, igorkozar83, indja, komkom, Levi, Mile Stjepanovic, nsakan, ostoja2, ozzy, play4fun, proka89, radoznao2, ray ban11, rebalza, sasakrajina, Serbian Vampire, sevenino, stug, Suva planina, Toni, Vazduhoplovac, virked, VJ, W123