Provera zadatka

1

Provera zadatka

offline
  • Milos Stojanovic
  • Programer u pokusaju
  • Pridružio: 31 Dec 2015
  • Poruke: 830
  • Gde živiš: Srbija / Zajecar

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.

#include<stdio.h> main() {    int i,n,br=0,pom=0;    printf("Unesi broj elemenata niza: ");    scanf("%i",&n);    int a[20];    for(i=0;i<n;i++)    {       printf("Unesi element niza: ");       scanf("%i",&a[i]);    }    for(i=0;i<n;i++)    {       if(a[i]==a[i+1])       br++;       else       {          if(br>pom)          {             pom=br;             br=0;          }       }    }    printf("%i",pom+1);    scanf("%i"); }

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: 14229
  • 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
  • Milos Stojanovic
  • Programer u pokusaju
  • Pridružio: 31 Dec 2015
  • Poruke: 830
  • Gde živiš: Srbija / Zajecar

Za granice onda treba da umesto for(i=0;i<n;i++) bude 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: 14229
  • Gde živiš: Niš

Tako je. Very Happy

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

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:
printf("Unesi element niza: "); while (scanf("%d", &a[i]) != 1) {     printf("Molimo unesite validan broj.\nUnesi element niza: ");     scanf("%*s"); }


Takođe, zbog čega ovo na kraju:

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: 14229
  • 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
  • Milos Stojanovic
  • Programer u pokusaju
  • Pridružio: 31 Dec 2015
  • Poruke: 830
  • Gde živiš: Srbija / Zajecar

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: 14229
  • 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:
if(br>pom)          {         pom=br;         br=0;          }
trebalo bi br=0 da bude van if-a jer to treba da se resetuje i ako nije veci od pom.
if(br>pom) pom=br; br=0;

Ko je trenutno na forumu
 

Ukupno su 783 korisnika na forumu :: 39 registrovanih, 5 sakrivenih i 739 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

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

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: 8u47, _commandos_, A.R.Chafee.Jr., Alojz Hauptman, BlackPhantom, Boris90, djboj, Dorcolac2, dovla p, Drug pukovnik, Faki-Valjevo, Filodendron, flash12, Georgius, Gerilac2, indja2, ivance95, Kaplar2, lacko2, Lieutenant, Marko Marković, Metanoja, Milan A. Nikolic, Miskohd, mladen.zovko, nemanja.tatic, nenad81, nuke92, Panonsky, powSrb, S-lash, sasakrajina, Shomy, Snorks, SsssssNOVI, vlad the impaler, vlvl, White Knight, wizzardone