Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pomoc oko zadatka ; Molim vaaaaaaaas

[es] :: C/C++ programiranje :: Pomoc oko zadatka ; Molim vaaaaaaaas

[ Pregleda: 2140 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

zokio
Balkan

Član broj: 27826
Poruke: 43
*.scst.hr.

Sajt: student.oss.unist.hr/~zs9..


Profil

icon Pomoc oko zadatka ; Molim vaaaaaaaas19.09.2005. u 00:51 - pre 226 meseci
Zadatak glasi : --> Napisati funkciju koja sortira polje rečenica po broju znakova.

E sad ja sam napisao i main i tu koja sortira, u main-u se nalazi polke pokazivaca u koji se stringovi pohranjuju, ali problem se javlja kada zelim sortirati stringove, ne znam kako bih onaj pokazivac(argument) iz funkcije "sort" povezao sa ovim poljem pokazivaca u kojima se string nalazi, pa da funkcija odradi svoj dio posla, tj. sortiranje

Evo mog pokusaja, pa ako itko vidi bilo kakvu gresku jos osim navedene neka javi jer se je....m sa tim zadatkom vec dugo, a znam ako ovaj dio neshvatim, od daljnjeg programiranja nista;

No dobro evo mog coda :
Code:

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

void sort(char *str, int br);

main(){
int i=0,j,x=0;
char *str[10];
char buffer[80];

printf("****Upisite string****");
printf("\n");
while(i<3)
{
gets(buffer);

*(str+i)=(char*)malloc (strlen(buffer)+1);
strcpy(*(str+i),buffer);
i++;
x=0;
}


printf("\n");
j=0;
while(j<3){
sort(&str[j],*str[10])
    printf("%s\n",str[j]));
j++;}

free(buffer);

}



void sort(char *str, int br)
{
char temp[80];
int i,j;

for(i=0;i<(br-1);i++){

    for(j=1;j<br;j++){

if strcmp(str[i],str[j])<0)
        {

            strcpy(temp,str[i]);
            strcpy(str[i],str[j]);
            strcat(str[j],temp);

            }



                    }


                        }

}



A evo i greski koje mi compiler javlja:
--------------------Configuration: lab16 - Win32 Debug--------------------
Compiling...
lab16.c
H:\Programiranje\lab16\lab16.c(2 : warning C4047: 'function' : 'char *' differs in levels of indirection from 'char ** '
H:\Programiranje\lab16\lab16.c(2 : warning C4024: 'sort' : different types for formal and actual parameter 1
H:\Programiranje\lab16\lab16.c(29) : error C2059: syntax error : ')'
H:\Programiranje\lab16\lab16.c(47) : error C2061: syntax error : identifier 'strcmp'
H:\Programiranje\lab16\lab16.c(51) : warning C4047: 'function' : 'char *' differs in levels of indirection from 'char '
H:\Programiranje\lab16\lab16.c(51) : warning C4024: 'strcpy' : different types for formal and actual parameter 1
H:\Programiranje\lab16\lab16.c(51) : warning C4047: 'function' : 'const char *' differs in levels of indirection from 'char '
H:\Programiranje\lab16\lab16.c(51) : warning C4024: 'strcpy' : different types for formal and actual parameter 2
H:\Programiranje\lab16\lab16.c(52) : warning C4047: 'function' : 'char *' differs in levels of indirection from 'char '
H:\Programiranje\lab16\lab16.c(52) : warning C4024: 'strcat' : different types for formal and actual parameter 1
H:\Programiranje\lab16\lab16.c(63) : error C2059: syntax error : '}'
Error executing cl.exe.

lab16.obj - 3 error(s), 8 warning(s)


Poslije spavanja treba odmorit ! ! !
 
Odgovor na temu

danio
Danijel K
nema sanse
Varsava, Poljska

Član broj: 67203
Poruke: 50
*.acn.waw.pl.



Profil

icon Re: Pomoc oko zadatka ; Molim vaaaaaaaas19.09.2005. u 02:16 - pre 226 meseci
Ja bi to napravio manje vise ovako:
Code:

#include <cstdlib>
#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
#include <vector>

using namespace std;

class MyString
{
    public:
        string str;
        MyString(string str)
        {
            this->str=str;
        }
};

bool operator< (MyString first, MyString second)
{
    return (first.str.size())<(second.str.size());
}

int main(int argc, char *argv[])
{
    cout<<"Upisi rjeci (ctrl-z za kraj):"<<endl;
    
    string str;
    vector<MyString> rjeci;
    while(true)
    {
        cin>>str;
        if(cin.eof()) break;
        rjeci.push_back((MyString)str);
    }
    
    sort(rjeci.begin(),rjeci.end());
    
    cout<<"Sortirano:"<<endl;
    for(int i=0; i<rjeci.size(); i++)
        cout<<rjeci[i].str<<endl;


    system("PAUSE");
    return EXIT_SUCCESS;
}
 
Odgovor na temu

danio
Danijel K
nema sanse
Varsava, Poljska

Član broj: 67203
Poruke: 50
*.acn.waw.pl.



Profil

icon Re: Pomoc oko zadatka ; Molim vaaaaaaaas19.09.2005. u 02:38 - pre 226 meseci
Evo ti i tvoj kod, malo popravljen:
Code:

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

void sort(char **str, int br);

int main()
{
    int i=0,j;
    char *str[10];
    char buffer[80];

    printf("****Upisite string****");
    printf("\n");
    while(i<3)
    {
        gets(buffer);
        /*str[i]=(char*)malloc(strlen(buffer)+1);
        strcpy(str[i],buffer);*/
        str[i]=strdup(buffer);
        i++;
    }
    
    sort(str,3);

    printf("\n");
    j=0;
    while(j<3)
    {
        printf("%s\n",str[j]);
        free(str[j]);//ovo je jako vazno!
        j++;
    }
    
    system("PAUSE");

    return 0;
}

void sort(char **str, int br)
{
    char temp[80];
    int i,j;

    for(i=0;i<(br-1);i++)
    {
        for(j=i+1;j<br;j++)
        {
            if(strlen(str[i])>strlen(str[j]))//u zadatku pise po duljin stringova
            {
                strcpy(temp,str[i]);
                strcpy(str[i],str[j]);
                strcpy(str[j],temp);
            }
        }
    }
}
 
Odgovor na temu

MukeTiJa
Petar Stipanović
Hrvace

Član broj: 39477
Poruke: 18
*.scst.hr.

Sajt: www.pmfst.hr/~pero


Profil

icon Re: Pomoc oko zadatka ; Molim vaaaaaaaas19.09.2005. u 02:55 - pre 226 meseci
Do problema dolzi prilikom pozivanja i definiranja funkcije sort: void sort(char *str, int br);

Funkciji sort trebas predati samo polje stringova koje trebas sortirati pa bi njena deklaracija izgledala ovako: void Sortiraj (char);,
a polje joj predajes na taj nacin da samo napises ime polja kako argument prilikom pozivanja funkcije unurar main-a: Sortiraj(linija);.

Prilikom definiranja funkcije void sort(char *str, int br){....} stavio si da ti polje *str[10] pohrani u string *str, dakle zaboravio si napisati *str[10] jer se radi o polju stringova.

Bolje bi bilo koristiti strlen koja racuna duljinu stringa umjeso strcmp.

Pokazivač str je ime niza i sadrži adresu prvog el. niza, prvi element niza je pokazivač koji sadrži adresu prvog stringa, drugi element niza je pokazivač koji sadrži adresu drugog stringa. Tako u biti kada vrsis sortiranje stringova (rečenica) trebas samo promijeniti adresu pokazivačima u polju tako da pokazuju od dulje do krace recenice bez premjestanja stringova po polju. Ako pokazivac str[0] pokazuje na kracu recenicu od str[1] tada pokazivacima treba zamijeniti vrijednosti, tj. adrese stringova na koje pokazuju tako da str[0] pokazuje na recenicu na koju je pokazivao str[1] i obrnuto.

Dakle, kod koji radi, tj. sortira polje rečenica (stringova) po broju znakova, izgledao bi ovako:

Code:

#include <stdio.h>
#include <string.h>

main(){
  void Sortiraj (char);
  char *linija[3], buffer[35];
  int i;

  for(i=0; i<3; i++){
    gets(buffer);
    linija[i]=(char*)malloc(strlen(buffer)+1);
    strcpy(linija[i],buffer);
    free(buffer);
  }

  Sortiraj(linija);

  for(i=0; i<3; i++){
   printf("\n%s", linija[i]);
  }
}

void Sortiraj (char *linija[3]){
  int i,j;
  char *temp;

  for(i=0; i<2; i++)
    for(j=i+1; j<3; j++)
      if(strlen(linija[i])<strlen(linija[j])){
        temp=linija[i];
        linija[i]=linija[j];
        linija[j]=temp;
      }
}

STUDOM Admin
 
Odgovor na temu

zokio
Balkan

Član broj: 27826
Poruke: 43
*.scst.hr.

Sajt: student.oss.unist.hr/~zs9..


Profil

icon Re: Pomoc oko zadatka ; Molim vaaaaaaaas19.09.2005. u 10:56 - pre 226 meseci
Momci HVALA vam najljepsa na svemu, tebe bi Danio jos upitao , probao sam tvoj code i naravno radi ali mi nije jasno ono gdje koristis pokazivac na pokazivac, zasto to, jel to neko kao dvodimenzionalno polje ili ???


Uglavnom funkcija koju si koristio "strdup" je super nisam prije znao za nju....

E da i skoro zaboravih, onaj SYSTEM("PAUSE"); cemu to sluzi??

Eto jos jednom HVALA svima na trudu i pomoći ! ! !




[Ovu poruku je menjao zokio dana 19.09.2005. u 11:58 GMT+1]

[Ovu poruku je menjao zokio dana 19.09.2005. u 11:58 GMT+1]
Poslije spavanja treba odmorit ! ! !
 
Odgovor na temu

danio
Danijel K
nema sanse
Varsava, Poljska

Član broj: 67203
Poruke: 50
*.acn.waw.pl.



Profil

icon Re: Pomoc oko zadatka ; Molim vaaaaaaaas19.09.2005. u 12:48 - pre 226 meseci
Nema na cemu!

-char** moras koristiti zato sto saljes tablicu ekemenata tipa char*
Na pocetku maina definiras tablicu char* str[10];, to je isto ko kad bi defeinirao char** str=(char**)malloc(10*sizeof(char*)); samo sto je na stacku. char* koristis da pohranis string (iliti tablicu znakova), a char** koristis da pohranis tablicu stringova. I to je sve...

-funkcija system je za izvrsavanje naredbi u shellu. Mozes naprimjer upisati system("iexplore"); i otvorit ce ti se explorer. Naredba PAUSE u DOSu ispisuje "Press any key to continue..." i ceka na input. system("pause"); koristi se zato da ti se program odmah ne zgasi cim ga upalis...

 
Odgovor na temu

danio
Danijel K
nema sanse
Varsava, Poljska

Član broj: 67203
Poruke: 50
*.acn.waw.pl.



Profil

icon Re: Pomoc oko zadatka ; Molim vaaaaaaaas19.09.2005. u 13:10 - pre 226 meseci
Samo bi ti htio preporuciti da ako mozes koristis standardne funkcije kao: qsort

U tvome programu bi to funkcioniralo ovako:
Code:

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

int compare(const void* a, const void* b)
{
    return strlen(*(char**)a)-strlen(*(char**)b);
}

int main()
{
    int i=0,j;
    char *str[10];
    char buffer[80];

    printf("****Upisite string****");
    printf("\n");
    while(i<3)
    {
        gets(buffer);
        /*str[i]=(char*)malloc(strlen(buffer)+1);
        strcpy(str[i],buffer);*/
        str[i]=strdup(buffer);
        i++;
    }
    
    qsort(str,3,sizeof(char*),&compare);

    printf("\n");
    j=0;
    while(j<3)
    {
        printf("%s\n",str[j]);
        free(str[j]);//ovo je jako vazno!
        j++;
    }
    
    system("PAUSE");

    return 0;
}
 
Odgovor na temu

[es] :: C/C++ programiranje :: Pomoc oko zadatka ; Molim vaaaaaaaas

[ Pregleda: 2140 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.