Provera zadatka

1

Provera zadatka

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

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: 14809
  • 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: 1191

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: 14809
  • Gde živiš: Niš

Tako je. Very Happy

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

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: 14809
  • 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: 1191

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: 14809
  • 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 1248 korisnika na forumu :: 57 registrovanih, 8 sakrivenih i 1183 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: A.R.Chafee.Jr., Acivi, adamantadv, amaterSRB, Andrija357, armor, ArmyBoss, Atomski čoban, bojankrstc, bokisha253, ccoogg123, comi_pfc, dane007, Dannyboy, darcaud, dekan.m, Dimitrije Paunovic, dragoljub11987, dule10savic, Georgius, Gosha101980, goxin, hooraay, hyla, JimmyNapoli, karevski, Levi, Marko Marković, mgolub, Mi lao shu, milenko crazy north, milimoj, moldway, Ne doznajem se u oružje, nebkv, ObelixSRB, operniki, Panter, panzerwaffe, pein, Rakenica, royst33, Shinobi, Sir Budimir, slonic_tonic, SR-3m, Srle993, suton, Tragač, Tvrtko I, VJ, vlad4, Vlada1389, Vlada78, VP6919, Wrangler, 1107