Provera zadatka

1

Provera zadatka

offline
  • Pridružio: 31 Dec 2015
  • Poruke: 1300

Pozdrav! Napisao sam program koji broji koliko ima clanova podniza istih brojeva. Najbolje da objasnim primerom. Imamo niz 1 1 1 2 3 3 3 3 3 4 5. Najduzi podniz istih brojeva je taj gde su trojke, odnosno ima ih 5. To bi bilo resenje zadatka. Evo mog koda.

  1. #include<stdio.h>
  2. main()
  3. {
  4.    int i,n,br=0,pom=0;
  5.    printf("Unesi broj elemenata niza: ");
  6.    scanf("%i",&n);
  7.    int a[20];
  8.    for(i=0;i<n;i++)
  9.    {
  10.       printf("Unesi element niza: ");
  11.       scanf("%i",&a[i]);
  12.    }
  13.    for(i=0;i<n;i++)
  14.    {
  15.       if(a[i]==a[i+1])
  16.       br++;
  17.       else
  18.       {
  19.          if(br>pom)
  20.          {
  21.             pom=br;
  22.             br=0;
  23.          }
  24.       }
  25.    }
  26.    printf("%i",pom+1);
  27.    scanf("%i");
  28. }


Zeleo bih da nadjete kontra primer. Odnosno neki niz koji moj program ne moze dobro da obradi (ako ima, naravno).

Hvala!



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14825
  • Gde živiš: Niš

Evo nekih brzih zapažanja:
- Korisnik unese broj manji od 1 kao n => rezultat koji dobija je nevalidan. Glupost, znam, ali što pre počneš da vodiš računa o tome, to bolje. Smile
- Granični slučaj ti nije dobar. Ako je n = 7, petlja ide do 6 i u poslednjoj iteraciji imaš proveru a[6] == a[7], a a[7] nije element tvog niza.



offline
  • Pridružio: 31 Dec 2015
  • Poruke: 1300

Za granice onda treba da umesto

  1. for(i=0;i<n;i++)
bude
  1. for(i=0;i<n-1;i++)
, a za ovo prvo mi nije bas jasno. Milis da ako korisnik unese n=-3 na primer, nece biti validan rezultat. Pa to onda resim samo tako sto napisem poruku da n treba biti vece od 0?

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

Tako je. Very Happy

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

Da budem đavolji advokat; na početku main() funkcije nisi definisao tip koji funkcija treba da vraća (int). Jeste da će kompajler ovo automatski uraditi, ali nikako nije dobra praksa Smile

Takođe:



Što se rešava* u par linija koda:

  1. printf("Unesi element niza: ");
  2. while (scanf("%d", &a[i]) != 1) {
  3.     printf("Molimo unesite validan broj.\nUnesi element niza: ");
  4.     scanf("%*s");
  5. }



Takođe, zbog čega ovo na kraju:

  1. scanf("%i");


? Zbog toga na kraju dobijaš segmentation fault.

* ali ne u potpunosti. Kod je i dalje podložan integer overflow-u. Ostavljam ti da sam malo više istražiš o ovom problemu i vidiš kako možeš da unaprediš kod sa bezbednosnog aspekta Smile

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

Naravno, ima tu mnogo prostora za finese i generalno diskusiju. No, problem je više algoritamski rekao bih, i sa tog aspekta pristup mu je manje više dobar. Smile

offline
  • Pridružio: 31 Dec 2015
  • Poruke: 1300

Ako unesem da je n=10, odnosno broj clanova niza je 10. I ukucam niz 1 3 2 3 1 1 1 1 1 1, program mi izbaci resenje 1. To nije tacno. Trebalo bi 6 da bude. Zasto je to tako?

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

Debug-er u ruke pa otkrij sam. Smile

offline
  • Pridružio: 15 Maj 2009
  • Poruke: 963

Samo treba da stavis breakpoint, otvoris Watches prozor i klikces na Step Over (Next Line).

CodeBlocks
Visual Studio

offline
  • Milos
  • Pridružio: 05 Dec 2010
  • Poruke: 716
  • Gde živiš: Beograd

U delu gde pise:

  1. if(br>pom)
  2.          {
  3.         pom=br;
  4.         br=0;
  5.          }

trebalo bi br=0 da bude van if-a jer to treba da se resetuje i ako nije veci od pom.
  1. if(br>pom)
  2. pom=br;
  3. br=0;

Ko je trenutno na forumu
 

Ukupno su 888 korisnika na forumu :: 51 registrovanih, 4 sakrivenih i 833 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: bavar357, Bivan, bojan313, bpop, Bubi, BUDDAR70, C-Gun, Carl Gustaf, cyprus, elenemste, ElvisP, Faki-Valjevo, FileFinder, ginjica, jackreacher011011, Jezekijel, Kalem, kolle.the.kid, kovinacc, lukisa, MarkoD, markolopin, mir, mrav pesadinac, Mskok, Najax, Natuzzi, operniki, Orc, Parker, Petar25, Pilence, Plavi1, powSrb, Primus17, procesor, Pururin, R_038, SamostalniReferent, Sarmat, semper_fidelis, sickmouse, Sir Budimir, sony771, sslay, Tribal, tritonus, yrraf, Zeljo980, zlaya011, Zorge