[ fausto77 @ 16.10.2012. 10:31 ] @
Zadatak glasi:
Napisati program kojim se ucitava niz cijelih brojeva, sa najvise 30 clanova, i koji vrsi obrtanje redosljeda elemenata vektora,tj. zamjenjuje mjesta prvom i posljednjem clanu, drugom i pretposlednjem itd..Program napisati tako da vrsi zamjenu elemenata datog niza bez koriscenja pomocnih nizova.
Primjer:Ukoliko smo unijeli niz X=1,32,41,6,71,13, onda bi nakon izvrsenja programa redosljed trebao biti X=13,71,6,41,32,1.

Ima li neko ideju kako bi se ovo moglo uraditi? Pocetnik sam tako da je svaka pomoc dobrodosla :)
[ plague @ 16.10.2012. 10:50 ] @
Dokle si stigao, sta ti tacno nije jasno?

Hajde da podelimo na segmente:
- Znas li da definises niz i dodelis mu vrednosti (verovatno se u zadatku misli unosom)?
- Znas li da zamenis vrednosti dvema promenljivima?
- Znas li da prolazis kroz niz koristeci for/while petlju?
[ fausto77 @ 16.10.2012. 11:06 ] @
Evo sta sam ja uradio:
Code (c):

#include <stdio.h>
#include <stdlib.h>
#define max 30

int main()
{
int Niz[max],i,N;
printf("Unesi duzinu niza: ");
scanf("%d",&N);
printf("Unesi clanove niza: ");
for(i=0;i<N;i++){
scanf("%d",&Niz[i]);
}
}
 

Tu sam stao, nemam ideju kako bi uradio obrtanje redosled clanova.

EDIT: X Files : Molim Vas da zbog preglednosti i pravilnog tumačenja, kod upisujete između tag-ova predviđenih za kod: [code] ... [/code]
EDIT: Shadowed : Molim Vas da zbog preglednosti i pravilnog tumačenja, kod upisujete između tag-ova predviđenih sa oznakom za jezik ukoliko je jedan od podrzanih :)

[Ovu poruku je menjao Shadowed dana 28.10.2012. u 21:26 GMT+1]
[ plague @ 16.10.2012. 11:49 ] @
Ovaj zadatak je previse trivijalan i zbog toga ne zelim da ti ga resim jer ovako nesto moras znati.

Za pocetak posle tog koda napisi kod koji bi prolazio kroz niz i ispisivao clanove, pa cemo modifikovati. U isto vreme razmisli kako bi zamenio vrednosti dvema promenljivima koriscenjem privremene promenljive:
Code (c):
int a = 5;
int b = 10;
int temp;

// ako uradimo a = b dobijamo:
// a = 10, b =10 (gubimo 5 zauvek)
// koristi temp da sacuvas vrednost "a" pre promene, a posle za vracanje
 
[ X Files @ 16.10.2012. 12:27 ] @
@fausto77
plague je u pravu, ovaj zadatak je lak. Ako ti je cilj sticanje znanja, kroz ovaj zadatak samstalno možeš dosta shvatiti o nizovima, granicama nizova, petljama, zameni elemenata...

Nešto slično je već rešavano ovde, može ti poslužiti kao uzor:
http://www.elitesecurity.org/t...-Rec-obrnutim-redosledom-slova
... kako da posmatraš PRVI i POSLEDNJI element, zatim DRUGI i PRETPOSLEDNJI, i tako redom, dok se ta dva elementa za zamenu ne susretnu, kada više nije neophodna zamena.

[ Boyka @ 28.10.2012. 19:21 ] @
C# code
Code (csharp):

int[] niz = new int[] { 1,4,5,6,7,8,9 };
int i = 0;
int bla = niz.Length;
while (i < niz.Length)
{
      bla--;
      i++;
      textBox1.Text += niz[bla].ToString();
}
 


Dok je promenjiva 'i' manja od duzine niza(u ovom slucaju 7 je duzina niza) varijablu 'i' povecaj za jedan dok ne dodje do 7 i varijablu 'bla' smanjuj za jedan dok ne dodje do 0, znaci sta ona radi, radi ovo

i 0,1,2,3,4,5,6,7
bla 7,6,5,4,3,2,1,0

tako da sada u tekstboks ubacuje obrnutim redosledom brojeve, znaci niz[7] = 9, niz[6] = 8; ... dok ne dodje do prvog elementa niz[0]=1;

ajde sada ti uradi svoj primer u c, da vidimo na cemu si?

Ili recimo program gde kada napises nesto u
prvom textbox-u na klik dugmeta dogadjaj on to prebaci u textbox2 obrnuto

[Ovu poruku je menjao Boyka dana 28.10.2012. u 20:45 GMT+1]
[ Shadowed @ 28.10.2012. 22:39 ] @
Niti mu treba u C#-u, niti mu treba ispis (mada, moze i to) vec obrtanje redosleda elemnata u nizu, nemas unos podataka, niti je tvoj primer dobar cak i za to sto si hteo njime (radi ali nije dobar kao primer) a sto nije ono sto se trazi.
[ Boyka @ 29.10.2012. 20:39 ] @
Citat:
Shadowed: Niti mu treba u C#-u, niti mu treba ispis (mada, moze i to) vec obrtanje redosleda elemnata u nizu, nemas unos podataka, niti je tvoj primer dobar cak i za to sto si hteo njime (radi ali nije dobar kao primer) a sto nije ono sto se trazi.


Namerno nisam u C-u pisao jer necu sve da mu na tanjiru ostavim, a ne znam ga lol prvi mi dan danas...
Verovatno mislis rekurzivno, ovako:
Prvi mi je dan C-a pa evo da vidim koliko znam:
Code (c):

#include "stdafx.h"
#include "stdio.h"

int Rekurzija(int);
int main()
{
     int niz[] = {1,2,3,4,5,6};
     int duzina = sizeof(niz)/sizeof(int);
     printf("%s",niz[Rekurzija(duzina)]);
     getchar();
}

int Rekurzija(int niz)
{
     while(niz!=0)
          return Rekurzija(niz-1);
}
 


Ali ako ne zna onako kako sam ja naveo, onda ne znam kako ce znati rekurzivno...
[ Shadowed @ 29.10.2012. 23:48 ] @
Taj program ne radi ni to sto si hteo a kamoli ono sto je trebalo.
[ Nedeljko @ 30.10.2012. 15:17 ] @
Boyka, u jezicima sa pravilom jasne dodele kao što su C# i Java, onakav kod rekurzivne funkcije ne bi mogao ni da se kompajlira, a u C/C++ vraća nedefinisan rezultat (zateknut sadržaj nekog mesta u memoriji).

[Ovu poruku je menjao Nedeljko dana 30.10.2012. u 17:34 GMT+1]
[ Boyka @ 30.10.2012. 16:37 ] @
Bice da mi je dibager crk'o.
Znam kako sam u C# definisao rekurziju, ali mi ovde to nije radilo, a ovako radi sto mi je bilo cudno,
juce je radilo, evo sad dosao da vidim sta 'lupate' kad' ono stvarno error na nekoj memoriskoj adresi... Jesam li trebao mozda koristiti pointer, pa da definisem neki prostor u memoriji koji je slobodan? Sad cu da vidim da li ce da radi kao u C#-u...
[ Boyka @ 31.10.2012. 17:34 ] @
Ljudi ja ne znam ovo u C da uradim, ipak sam tek 3 dan na njemu, evo u C# preko rekurzije ispisuje obrnuto, ali mislim da mi za C trebaju pokazivaci koje nemam pojma da iskoristim, sada molim nekog od iskusnijih da mi samo kaze gde je greska kod C koda, posto ne znam da li je u pitanju dibager ili moja greska?

Evo C# koda, C kod je ispod C# koda:
Code (csharp):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Rekurzija_Vezba_01
{
    class Program
    {
        static void Main(string[] args)
        {
            vrati:
            int opseg;
            Console.Write("Unesite opseg niza: ");
            opseg = int.Parse(Console.ReadLine());
            int[] niz = new int[opseg];
            if (opseg < 30)
            {
                for (int i = 0; i < opseg; ++i)
                {
                    Console.Write("Unesite {0} broj: ", i);
                    niz[i] = int.Parse(Console.ReadLine());
                }
                Obrni(niz.Length - 1, niz);
            }
            else
            {
                Console.WriteLine("Opseg niza je ogranicen na 30!!! Pokusajte ponovo DA/NE?");
                string granica = Console.ReadLine();
                if (granica.ToUpper() == "DA")
                {
                    goto vrati;
                }
                else
                {
                    return;
                }
            }
            Console.ReadKey();
        }
        static public void Obrni(int niz, int[] niz1)
        {
            if (niz < 0)
            {
                return;
            }
            else
            {
                Console.WriteLine();
                Console.WriteLine("{0}", niz1[niz--].ToString());
                Obrni(niz,niz1);
            }
           
        }
    }
}

 


Ovo je C kod, meni visual studio prikazuje 5 errora gde je svih 5 vezano za string "granica", ali i bez toga dobijem error, ajde kome nije problem da ovaj kod od C#-a prevede u C pa bas da vidim, mnogo mi se svidja jezik C...
Code (c):

#include "stdafx.h"
#include "stdio.h"
#include "string.h"
   
void Obrni(int niz[], int duzina)
{
     if(duzina<0)
     {
          return;
     }
     else
     {
          printf("%s",niz[duzina--]);
          Obrni(niz,duzina);
     }
}

int main()
{
     vrati:
     int opseg=0;
     string granica="";
     printf("Unesite opseg niza: ");
     scanf_s("%i",&opseg);
     int niz[] = {opseg}; //kada stavim opseg u okviru [] taga dobijam error
     if(opseg<30)
     {
     for(int i=0;i<opseg;i++)
     {
          printf("Unesite %i broj: ",i);
          niz[i] = scanf_s("%i",&niz[i]);
     }
     int duzina = sizeof(niz)/sizeof(int);
     Obrni(niz,duzina-1);
     }
     else
     {
          printf("Ispocetka DA/NE?");
          scanf_s("%s", &granica);
          if(granica=="DA")
          {
               goto vrati;
          }
          else
          {
               return 0;
          }
     }
     getchar();
     return 0;
}
 

[ kosta90s @ 31.10.2012. 18:45 ] @
pogresno si definisao string.
U C-u se string definise kao niz karaktera tj

zameni string granica = "" sa char granica[]="";
[ Boyka @ 31.10.2012. 19:01 ] @
Citat:
kosta90s: pogresno si definisao string.
U C-u se string definise kao niz karaktera tj

zameni string granica = "" sa char granica[]="";


Aha, znaci u C je nemoguce koristiti string nego sve kao niz?

e pazi sad error kada sam izmenio, problem je verovatno u ovim mojim nizovima, jer ovo ovako nema sanse da bi u C#-u radilo...
"Unhandled exception at 0x52e913af (msvcr100d.dll) in Rekurzija Vezba 01 C.exe: 0xC0000005: Access violation reading location 0x00000001."

Code (c):

#include "stdafx.h"
#include "stdio.h"
   
void Obrni(int niz[], int duzina)
{
     if(duzina<0)
     {
          return;
     }
     else
     {
          printf("%s",niz[duzina--]);
          Obrni(niz,duzina);
     }
}

int main()
{
     vrati:
     int opseg=0;
     printf("Unesite opseg niza: ");
     scanf_s("%i",&opseg);
     int niz[] = {opseg}; //kada stavim opseg u okviru [] taga dobijam error
     if(opseg<30)
     {
     for(int i=0;i<opseg;i++)
     {
          printf("Unesite %i broj: ",i);
          niz[i] = scanf_s("%i",&niz[i]);
     }
     int duzina = sizeof(niz)/sizeof(int);
     Obrni(niz,duzina-1);
     }
     else
     {
          char granica[]="";
          printf("Ispocetka DA/NE?");
          scanf_s("%c", &granica);
          if(granica=="DA")
          {
               goto vrati;
          }
          else
          {
               goto vrati;
          }
     }
     getchar();
     return 0;
}
 


Zasto kada ovako definisem niz int niz[opseg] = ""; daje error?

[Ovu poruku je menjao Boyka dana 31.10.2012. u 20:12 GMT+1]
[ djoka_l @ 31.10.2012. 19:17 ] @
U ovoj liniji koda
Code (c):

     int niz[] = {opseg}; //kada stavim opseg u okviru [] taga dobijam error
 

deklarisao si pokazivač na int pod imenom "niz", statički si alocirao memoriju za jednu vrednost int i dodelio si joj vrednost opseg.
To je isto kao da si napisao:

Code (c):

     int *niz = opseg;
 


U tvom slučaju, tvoj niz je u stvari niz od samo jednog elementa, tj. postoji samo niz[0] koji ima vrednost varijable opseg.
[ Boyka @ 31.10.2012. 19:26 ] @
Citat:
djoka_l: U ovoj liniji koda
Code (c):

     int niz[] = {opseg}; //kada stavim opseg u okviru [] taga dobijam error
 

deklarisao si pokazivač na int pod imenom "niz", statički si alocirao memoriju za jednu vrednost int i dodelio si joj vrednost opseg.
To je isto kao da si napisao:

Code (c):

     int *niz = opseg;
 


U tvom slučaju, tvoj niz je u stvari niz od samo jednog elementa, tj. postoji samo niz[0] koji ima vrednost varijable opseg.


Svestan sam ja toga, ali kako mogu da oganicim niz na unetu vrednost iz opsega, recimo u C#-u je to islo ovako:

int[] niz = new int[opseg]; ?

Kada stavim ovaj kod int *niz = opseg; dobijem error

error C2440: 'initializing' : cannot convert from 'int' to '*int..
Znam da ne moze da pretvori pointer u int, kako se konvertuju pokazivaci?
[ djoka_l @ 31.10.2012. 19:31 ] @
Ako ti treba da dinamički alociraš memoriju za niz koristi se poziv funkcije malloc, kao u sledećem primeru http://www.codingunit.com/c-tu...-the-functions-malloc-and-free

Nije potrebno da naučiš C, samo ti guraj C#. Nama pravim programerima, to daje priliku da razlikujemo prave muškarce od žderača pita http://www.pbm.com/~lindahl/real.programmers.html
[ Boyka @ 31.10.2012. 19:50 ] @
Citat:
djoka_l: Ako ti treba da dinamički alociraš memoriju za niz koristi se poziv funkcije malloc, kao u sledećem primeru http://www.codingunit.com/c-tu...-the-functions-malloc-and-free

Nije potrebno da naučiš C, samo ti guraj C#. Nama pravim programerima, to daje priliku da razlikujemo prave muškarce od žderača pita http://www.pbm.com/~lindahl/real.programmers.html


Definitivno moram posebno nizove da ucim, dosta su drugaciji nego u C#...

C sam krenuo da ucim samo da bih se priblizio "limu", a i nekako ima dusu, u svemu volim taj "old school", razmisljao sam da krenem i sa Asemblerom, ali nekako je uvrnut, kao kompajler se spustam sa "visih" jezika na "nize", retko ali je*iga, tek mi sada nekako sve ono sto u C#-u nisam znao dolazi u glavu, jer znam sta mi "iza ledja" radi, i da se ne lazemo barem ono koliko sam do sad' video C/C++ programeri su cast izuzecima i bez ljutnje, nekako sposobniji u odnosu na .NET i Java programere...
[ kosta90s @ 31.10.2012. 20:01 ] @
Pazi ovako, posto niz nije veliki i maksimalne duzine 30 elemenata, onda mozes da staticki alociras memoriju za 30 elemenata.
Ako ti treba manji niz ti mozes da ne prikazujes citav niz vec samo jedan njegov deo.

Resio sam ti ovaj zadatak u C (MS VS 6.0). Ovo je jedno od resenja. Ako ne znas koliko ce biti niz dugacak, onda moras da koristis f-ju malloc. Sa njom treba biti oprezan.

Code (c):

#include <stdio.h>
void zamena(int &x, int &y){

     int temp = x;
     x = y;
     y = temp;
}


int main(void){


     int niz[30];
     int opseg;
     char opet = 'D';
     int izlaz = 0;


     while(opet=='D' || opet=='d' )
     {
          izlaz = 0;
          printf("Unesite opseg (opseg<=30):");
          scanf("%d", &opseg);

          if (opseg <31 && opseg > 0)
          {
               for(int i =0; i <opseg; i++)
               {
                    printf("Unesi element br.  %d  =", i);
                    scanf("%d", &niz[i]);
               }

               if(opseg %2 ==0)
               {
                    for(int i=0; i <= (opseg/2); i++)
                    {
                         zamena(niz[i], niz[opseg-i-1]);
                    }
               }
               else
               {
                    for(int i=0; i <= ((opseg-1)/2); i++)
                    {
                         zamena(niz[i], niz[opseg-i-1]);
                    }
               }

               for(i =0; i<opseg; i++)
               {
                    printf("%d", niz[i]);
               }
               printf("\n");
          }
          else
          {
               printf ("\nGreska u definisanju opsega\n");
          }
          while (izlaz ==0){
               printf("Pokreni ponovo?(D/N)");
               scanf("%c", &opet);
               if(opet == 'D' ||opet == 'd' ||opet == 'N' ||opet == 'n' ){
                    izlaz =1;
               }
          }
     }
     return 0;
}

 


[Ovu poruku je menjao kosta90s dana 31.10.2012. u 21:27 GMT+1]
[ Boyka @ 31.10.2012. 20:13 ] @
Citat:
kosta90s: Pazi ovako, posto niz nije veliki i maksimalne duzine 30 elemenata, onda mozes da staticki alociras memoriju na 30 elemenata.
Ako ti treba manji niz ti mozes da ne prikazujes citav niz vec samo jedan njegov deo.

Resio sam ti ovaj zadatak u C (MS VS 6.0). Ovo je jedno od resenja. Ako ne znas koliko ce biti niz dugacak, onda moras da koristis f-ju malloc. Sa njom treba biti oprezan.

Code (c):

#include <stdio.h>
void zamena(int &x, int &y){

int temp = x;
x = y;
y = temp;
}


int main(void){


int niz[30];
int opseg;
char opet = 'D';
int izlaz = 0;


while(opet=='D' || opet=='d' )
{
izlaz = 0;
printf("Unesite opseg (opseg<=30):");
scanf("%d", &opseg);

if (opseg <31 && opseg > 0)
{
for(int i =0; i <opseg; i++)
{
printf("Unesi element br.  %d  =", i);
scanf("%d", &niz[i]);
}

if(opseg %2 ==0)
{
for(int i=0; i <= (opseg/2); i++)
{
zamena(niz[i], niz[opseg-i-1]);
}
}
else
{
for(int i=0; i <= ((opseg-1)/2); i++)
{
zamena(niz[i], niz[opseg-i-1]);
}
}

for(i =0; i<opseg; i++)
{
printf("%d", niz[i]);
}
printf("\n");
}
else
{
printf ("\nGreska u definisanju opsega\n");
}
while (izlaz ==0){
printf("Pokreni ponovo?(D/N)");
scanf("%c", &opet);
if(opet == 'D' ||opet == 'd' ||opet == 'N' ||opet == 'n' ){
izlaz =1;
}
}
}
return 0;
}

 


E je l' ti nije problem da ovaj C# kod sto cu citirati dole(naravno ako znas C#), ispises samo u C jeziku, da bih ja uporedio kod jedan sa drugim?

Inace da se razumemo da ja nisam postavio temu, samo pokusavam nauciti C.

Citat:
Boyka:
Code (csharp):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Rekurzija_Vezba_01
{
    class Program
    {
        static void Main(string[] args)
        {
            vrati:
            int opseg;
            Console.Write("Unesite opseg niza: ");
            opseg = int.Parse(Console.ReadLine());
            int[] niz = new int[opseg];
            if (opseg < 30)
            {
                for (int i = 0; i < opseg; ++i)
                {
                    Console.Write("Unesite {0} broj: ", i);
                    niz[i] = int.Parse(Console.ReadLine());
                }
                Obrni(niz.Length - 1, niz);
            }
            else
            {
                Console.WriteLine("Opseg niza je ogranicen na 30!!! Pokusajte ponovo DA/NE?");
                string granica = Console.ReadLine();
                if (granica.ToUpper() == "DA")
                {
                    goto vrati;
                }
                else
                {
                    return;
                }
            }
            Console.ReadKey();
        }
        static public void Obrni(int niz, int[] niz1)
        {
            if (niz < 0)
            {
                return;
            }
            else
            {
                Console.WriteLine();
                Console.WriteLine("{0}", niz1[niz--].ToString());
                Obrni(niz,niz1);
            }
           
        }
    }
}
 

[ betrayer992 @ 04.11.2012. 20:31 ] @
Radio sam nesto slicno skoro, ovo je cini mi se najjednostavniji nacin. Poz.


Code:

#include <stdio.h>

int main()
{
    int X[30],T,i,N;
    printf("Unesi broj clanova niza:");
    scanf("%d",&N);
    printf("Unesi elemente");
    for(i=0;i<N;i++)
    scanf("%d",&X[i]);
    for(i=0;i<(N/2);i++){
        T=X[i];
       X[i]=X[N-i-1];
       X[N-i-1]=T;
    }
       printf("Obrnuti niz je: \n");
       for(i=0;i<N;i++)
       printf("%d \n",X[i]);
}
[ Nedeljko @ 04.11.2012. 21:06 ] @
Ne vredi, nisi ga obrnuo. Samo si ispisao elemente u obrnutom redosledu.
[ betrayer992 @ 04.11.2012. 21:11 ] @
Citat:
Zadatak glasi:
Napisati program kojim se ucitava niz cijelih brojeva, sa najvise 30 clanova, i koji vrsi obrtanje redosljeda elemenata vektora,tj. zamjenjuje mjesta prvom i posljednjem clanu, drugom i pretposlednjem itd..Program napisati tako da vrsi zamjenu elemenata datog niza bez koriscenja pomocnih nizova.
Primjer:Ukoliko smo unijeli niz X=1,32,41,6,71,13, onda bi nakon izvrsenja programa redosljed trebao biti X=13,71,6,41,32,1.


To je upravo ono sto ovaj program radi!? Ili sam propustio sustinu? :S
[ Burgos @ 04.11.2012. 22:45 ] @
Nisi promašio suštinu, verovatno je Nedeljko nešto prevideo - niz je zaista obrnut u memoriji.
[ Nedeljko @ 05.11.2012. 06:41 ] @
Sad vidim da sam bio ćorav. Dobro je , a može i ovako

Code (cpp):

void obrni(double x[], int size)
{
    for (int i = 0, j = size - 1; i < j; ++i, --j) {
        double t = x[i];

        x[i] = x[j];
        x[j] = t;
    }
}

No, školski bi bilo ovako:
Code (cpp):

void obrni(double x[], int size)
{
    int i = 0; j = size - 1;

    while (i < j) {
        double t = x[i];

        x[i] = x[j];
        x[j] = t;
        ++i;
        --j;
    }
}

ili ovako
Code (cpp):

void obrni(double x[], int size)
{
    int middle = size >> 1;

    for (int i = 0; i < middle; ++i, --j) {
        double t = x[i];
        int j = size - 1 - i;

        x[i] = x[j];
        x[j] = t;
    }
}