[ Rato iks de @ 12.01.2011. 17:21 ] @
E ovako imam problem sa postavkom nekih zadataka i razmisljanja oko resenja i kako doci do njega.Tako vjezbajuci dodjem do ovakvih zadataka.
1. Napisati program koji dati niz karaktera razbija na dva niza karaktera date duzine.
Ja sam to ovako uradio ali program neradi kako treba.
Code:
#include <iostream>
using namespace std;

int main()
{
    char niz[100], niz1[100], niz2[100];
    int i,d,d1,d2;
    d=d1=d2=0; //duzine nizova
    
    for (i=0; niz[i] != '\0'; i++)
    {
        cin>>niz[i];
        d++;
        }
        
    if (d%2==0) //ako je duzina niza parna, htio sam da napravim dva niza jednakih duzina (recimo duzina je 8 ja pravim dva niza po 4)
    {
              d1=d/2;
              for (i=0; niz[i] != '\0'; i++)
              {
                  niz1[i] = niz[i];
                  cout << niz1[i] << endl;
                  niz2[i] = niz[i+d1];
                  cout << niz2[i] << endl;
                  }
                  }
                  
    else
    {
        d--;
        d1=d/2;
        for (i=0; niz[i] != '\0'; i++)
              {
                  niz1[i] = niz[i];
                  cout << niz1[i] << endl;
                  niz2[i] = niz[i+d1];
                  cout << niz2[i] << endl;
                  }
                  } 
                  
cin>>i;
return 0;                               
}

Ovaj sam otkucao u C++ ali vjezbam uporedo i C.Jedan zadatak u C drugi u C++.Nisam htio da pravim dvije teme.

2. Napisati program koji ispituje da li su dva niza karaktera jednaki i da li su jendaki na prvih n mjesta. (nekoristiti datoteku string)
Code:
#include <stdio.h>

int Provjera (char niz1[100], char niz2[100], int n, int d1, int d2)  
{
     int i;
     d1=d2=0;
     if (d1 == d2)
     {
            printf("Da jednakih su duzina.\n");
            return 1;
            }
     else
     {
         printf("Nisu jednakih duzina.\n");
         return 1;
         }
         
    for (i=n; niz1[i] != '\0' && niz2[i] != '\0'; i++)
    {
        if (niz1[i] == niz2[i])
        {
                    printf("Da jednaki su na prvih %d", n);
                    printf("mjesta.\n");
                    return 0;
                    }
                    }
    if (n>d1 || n>d2)
    {
             printf ("Broj nije dobar u odnosu na duzinu nizova.\n");
             return 0;
             }
             
}


int main()
{
    char prvi[100], drugi[100];
    int n;
    
    printf("Unesite prvi niz karaktera: ");
    scanf ("%s", &prvi);
    printf("Sada drugi: ");
    scanf ("%s", &drugi);
    printf("Unesite vrjednost za n: ");
    scanf ("%d", &n);
    int i, d1,d2;
    d1=d2=0;
     
     for (i=0; prvi[i] != '\0'; i++)
     {
         d1++;
         }
         
    for (i=0; drugi[i] != '\0'; i++)
    {
        d2++;
        }
    Provjera  (prvi, drugi, n, d1, d2);
    
scanf("%d", &n);
return 0;
}



HVALA
[ MasterOfDisaster @ 12.01.2011. 19:18 ] @
Evo uradeh ti prvi:
Code:

#include <iostream>

using namespace std;

int main()
{
    char niz[100], niz1[100], niz2[100];
    int i,d,d1,d2;
    d=d1=d2=0; //duzine nizova

    cout << "Unesi Niz:" << endl;

    while(1)
    {
      cin >> niz[d];
      if (niz[d] == '0')
          break;
        d++;
    }

    d1 = d / 2;
    d2 = d1;
    d1--;

    for( i=0; i<=d1; i++)
      {
        niz1[i] = niz[i];
        cout << "I: " << niz1[i] << endl;
        niz2[i] = niz[i + d2];
        cout << "II: " << niz2[i] << endl;
      }

    if (d%2!=0)
      {
         niz2[d2] = niz[d-1];
         cout << "II: " << niz2[d2] << endl;
      }

    system("PAUSE");                               
    return 0;
}


Imao si mnogo gresaka i to banalnih, jedna od njih:
Code:

for (i=0; niz[i] != '\0'; i++)
  {
    niz1[i] = niz[i];
    cout << niz1[i] << endl;
    niz2[i] = niz[i+d1];
    cout << niz2[i] << endl;
  }

Ogranicio si petlju na broj karaktera sto je najpogresnije sto si mogao da uradis, zar ti se ne cini da je 'niz1' potpuno jednak 'niz'-u.
For petlja treba da ti ide za pola manje od broja karaktera kako bi mogao da podelis niz na ovaj nacin.

Pozdrav, idem da gledam Sojica, aj pa posle cu i drugi zadatak da pogledam :)
[ Rato iks de @ 12.01.2011. 19:45 ] @
E sad kad vidim kod smjesno mi je sta sam uradio.
Nesto sam mislio da kao svaki element dodajem drugom.

"I bre Cirko, gluvacu jedan!"

Hvala
[ MasterOfDisaster @ 12.01.2011. 21:42 ] @
A evo ga i drugi:
Code:

#include <stdio.h>
#include <stdlib.h>

void Provjera (char niz1[100], char niz2[100], int n, int d1, int d2)  
{
  int i, j;

  if (d1 == d2)
      printf("Da jednakih su duzina.\n");
  else
      printf("Nisu jednakih duzina.\n");

  for (i=0; i<=n; i++)
      if (niz1[i] != niz2[i])
        j++;

  if (j>0)
    printf("Da jednaki su na prvih %d mjesta.\n", n);

  if (n>d1 || n>d2)
      printf ("Broj nije dobar u odnosu na duzinu nizova.\n");

}

int main()
{
    char prvi[100], drugi[100];
    int n, i, d1, d2;

    printf("Unesite prvi niz karaktera: ");
    scanf ("%s", &prvi);

    printf("Sada drugi: ");
    scanf ("%s", &drugi);

    printf("Unesite vrjednost za n: ");
    scanf ("%d", &n);

    d1=d2=0;

    for (i=0; prvi[i] != '\0'; i++)
      d1++;

    for (i=0; drugi[i] != '\0'; i++)
      d2++;

    Provjera(prvi, drugi, n , d1, d2);

    system("PAUSE");
    return 0;
}


Da obrazlozimo tvoje greske, da ne ispadne sam ti samo resio domaci ako si domaci radio.

Da bih pauzirao program ja i vecina stavljamo:
Code:

system("PAUSE"); ili getch();


Onda na pocetak f-je si stavio ovo:
Code:

d1=d2=0;

Sto je opet pogresno, zar ti nije logicno da ce ti uvek onda biti d1 = d2?

Ovde isto imas fatalnih gresaka, ti si za donju granicu postavio n, zar petlja ne treba da ide do n a ne od n?
Onda ti pitas da li je niz1 == niz2, sto znaci da ce se sve izmedju sto nije jednako jedno sa drugim da prodje a tvoje poruke
se zaustaviti nece ako se nesto jednako pojavi pozadi tih nejednakih karaktera...sto ti daje los rezultat. Osim toga dobices
'n' poruka zato sto si printf stavio unutar for petlje.
Code:

for (i=n; niz1[i] != '\0' && niz2[i] != '\0'; i++)
  {
     if (niz1[i] == niz2[i])
       {
         printf("Da jednaki su na prvih %d", n);
         printf("mjesta.\n");
         return 0;
       }
  }


A da i zasto si svugde vracao jedinice i nule?
To mi nije bilo jasno sta si pokusavao, pa sam zadatak uradio void f-jom jer sam video da ovo tvoje vracanje 0 i 1 nema nikakve f-je u programu...

btw Sojic kralj

Pozdrav :)
[ Rato iks de @ 12.01.2011. 22:46 ] @
Razumijem sad.Najgori problem koji mi prestavlja je pristup zadatku.Nekad ga toliko zakomplikujem a znam da je rjesenje jednostavno.
Mada to ce vremenom da se popravi kroz vjezbanje,kako sto jednostavnije doci do konacnog programa.
[ enaB @ 12.01.2011. 22:54 ] @
Ja bih dodao još nešto, bar što se drugog zadatka tiče :) (što ne znači da u prvom ne bih baš ništa :) )


Zašto ograničavati ili zauzimati veći broj elemenata niza u funkciji Provjera(), mogu samo da se napišu prazne zagrade [] u definiciji i dobiće onoliko prostora pri pozivu koliko je velik niz koji se prosleđuje.

Code:
void Provjera (char niz1[], char niz2[], int n, int d1, int d2)


U zadatku se traži provera prvih n mesta, a to je od 0 do n-1 ukljucujuci n-1 ali ne i n pošto ide od 0 :)
Sama provera može da se napiše i bez promenljive j

Code:


void Provjera (char niz1[], char niz2[], int n)
{
  int i, d1, d2;

  for (d1=0; niz1[d1] != '\0'; d1++);
  for (d2=0; niz2[d2] != '\0'; d2++);

  if (d1 == d2)
      printf("Da jednakih su duzina.\n");
  else
      printf("Nisu jednakih duzina.\n");

  if (n>d1 || n>d2) {
     printf ("Broj nije dobar u odnosu na duzinu nizova.\n");
     return;
  }

  for (i=0; i<n; i++)
     if (niz1[i] != niz2[i])
        break;

  if (i==n)
     printf("Da jednaki su na prvih %d mjesta.\n", n);

}

-------------------

Iz main() može da se izbaci promenljiva i, a d1 i d2 prebace u proveru :)

Code:
int main()
{
    char prvi[100], drugi[100];
    int n;

    printf("Unesite prvi niz karaktera: ");
    scanf ("%s", prvi);

    printf("Sada drugi: ");
    scanf ("%s", drugi);

    printf("Unesite vrjednost za n: ");
    scanf ("%d", &n);

    Provjera(prvi, drugi, n);

    system("PAUSE");
    return 0;
}


-------------

Umesto nestandardne funkcije getch() može se koristiti getchar() koja jeste :)


Pozdrav


[Ovu poruku je menjao enaB dana 13.01.2011. u 00:18 GMT+1]
[ MasterOfDisaster @ 13.01.2011. 12:15 ] @
hahaha ovo sam ja izostavio 'ar' kod getchar()-a, nzm sta mi je bilo...

Da, slazem se sa tvojim ispravkama, ustvari to nisu ispravke vec neke minimizacije koda, kako i ja isto resavam svoje
zadatke ali vecinu stvari sam namerno ostavio tako kako jesu jer ako je domaci... a ako nije, preporucio bi ti Rato da procitas nesto
od teorije jer ce ti dosta pomoci...

Najvise su i meni upale u oci ove dve for petlje koje su bile van f-je i to mi je bilo cudno i rekoh mozda ljudi rade
tako u skoli, da ne krivimo coveka i tako ih ostavih :P

btw ovo sa n-1 sam ja napravio glupu gresku...

Pozdrav
[ Rato iks de @ 13.01.2011. 16:35 ] @
E vidi recimo ovaj zadatak.Kaze,napisati novi niz koji se sastoji samo od elemenata koji se nalaze u prvom nizu.
Program radi perfektno.
Code:
#include <iostream>
using namespace std;

int main()
{
    char niz1[100], niz2[100], noviniz[100];
    int i,j,d1,d2,brojelem =0, k=0;
    
    d1=d2=0;
    
    cout<<"Prvi niz: ";
    cin>>niz1;
    cout<<"Drugi niz: ";
    cin>>niz2;
    
    for (i=0; niz1[i] != '\0'; i++)
      d1++;

    for (i=0; niz2[i] != '\0'; i++)
      d2++;
      
    for (i=0; i<d1; i++)
    {
        for (j=0; j<d2; j++)
             if (niz1[i] == niz2[j])
                 break;
       if (j == d2)
           brojelem++;
           }
           
    for (i=0; i<d1; i++)
    {
        for (j=0; j<d2; j++)
             if (niz1[i] == niz2[j])
                 break;
       if (j == d2)
           noviniz[k++] = niz1[i];
           }
           
    for (i=0; i<brojelem; i++)
    {
        cout<< noviniz[i] << endl;
        }
        
system("PAUSE");
return 0;
}

Bilo mi je dovoljno samo malo da pogledam onaj tvoj i shvatio sam kako cu ostale zadatke uraditi.Znam ja sta sam radio ali to je to sto sam isao pogresnim putem do resenja.
E to meni fali, a to se moze samo kroz vjezbu shvatiti.
Ma ja u Gimnaziji nemam nikako programiranje:D:D
[ MasterOfDisaster @ 13.01.2011. 17:59 ] @
mhm super, napredujes :)

Vidim da nisi bas shvatio zasto ovde nema vitlicastih zagradi:

for (i=0; niz1 != '\0'; i++)
d1++;

Vitlicaste zagrade ili blok stavljas kad imas vise od jedne komande u nekoj petlji, msm da je to najprostije.

Pozdrav
[ Rato iks de @ 13.01.2011. 18:46 ] @
Vidis to nisam nigdje procitao.E te neke sitnice nekad znaju da mi odvedu kod u bag.
HVALA
[ enaB @ 13.01.2011. 20:32 ] @
Ovo sve

Code:
 for (i=0; i<d1; i++)
    {
        for (j=0; j<d2; j++)
             if (niz1[i] == niz2[j])
                 break;
       if (j == d2)
           brojelem++;
           }


može da se izbaci, pošto druga radi sve što i ova, samo umesto brojelem koristi k koje predstavlja broj elemenata novog niza.

Ili se koristi k posle u ispisu elemenata, ili se zameni sa brojelem
Code:
   for(i=0; i<d1; i++) {
      for(j=0; j<d2; j++)
          if(niz1[i]==niz2[j])
              break;
      if(j==d2)
          noviniz[brojelem++]=niz1[i];
    }




pozdrav
[ Sarcom @ 01.02.2011. 19:03 ] @
Pozdrav,
ako moze mala pomoc oko ovog zadatka?
Omogućiti unos niza 7 velikih slova engleske abecede pomoću funkcije: void unos (char [ ], int);
Definirati funkciju char posljednji (char [ ], int); koja će vratiti onaj član niza (slovo) koji se u abecednom poretku pojavljuje posljednji.
Definirati funkciju: char prvi (char [ ], int); koja će vratiti onaj član niza (slovo) koji se u abecednom poretku pojavljuje prvi.
Ja sam uradio nesto,ne radi ,a nemam ideju kako dalje.


Code:
void unos(char[],int);
char posljednji(char[],int);
char prvi(char[],int);
void main()
{
    const int slovo=7;
    char niz[slovo];
    cout<<"unesite 7 slova engleske abecede"<<endl;
    unos(niz,slovo);
    cout<<"posljednje slovo od unesenih u abecedi je:"<<endl;
    posljednji(niz,slovo);
    cout<<"prvo slovo od unesenih u abecedi je:"<<endl;
    prvi(niz,slovo);
}
void unos(char niz[],int slovo)

    
    for(int i=0;i<slovo;i++)
    {
        if(!(niz[i]>='a'&& niz[i]<='z'))
        cin>>niz[i];
        
        
    }
}
char posljednji(char niz[],int slovo)
{
    int last='A';
    for(int i=0;i<slovo;i++)
    {
        if(niz[i]>last)
            last=niz[i];
    }
    return last;
}
char prvi(char niz[],int slovo)
{
    int first='Z';
    for(int i=0;i<slovo;i++)
    {
        if(niz[i]<first)
            first=niz[i];
    }
    return first;
}



[Ovu poruku je menjao Mihajlo Cvetanović dana 02.02.2011. u 00:27 GMT+1]
[ Mihajlo Cvetanović @ 01.02.2011. 23:33 ] @
U funkciji unos nema logike da prvo ispituješ vrednost neke promenljive (u ovom slučaju element niza), a da tek onda inicijalizuješ tu promenljivu. Možda si hteo nešto u stilu cin << temp, pa ako je temp zadovoljavajući onda niz[ i]=temp. Ali moraš da vodiš računa da indeks onda smeš da povećaš samo kad iskoristiš taj temp.

Uzgred, ja bih svaku promeljivu koja se ovde zove slovo nazvao duzina. Tako je jasnije.