Pomoć pri zadatku iz c-a....

poruka: 17
|
čitano: 3.967
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
16 godina
neaktivan
offline
Pomoć pri zadatku iz c-a....

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

char* trim ( char *s )
{
    char *rez, zadnjiznak;
    int i,brojac=0,j;
    rez= ( char* ) malloc ( strlen ( s ) *sizeof ( char ) );
    for ( i=0; * ( s+i ) = ' '; i++ )
    {
        brojac++;
    }

    for ( i=brojac, j=0; * ( s+i ) !='\0'; i++,j++ )
    {
        * ( rez+j ) = * ( s+i );
        if ( * ( s+i ) =' ' )
        {
            if ( * ( s+i+1 ) = ' ' )
            {
                * ( rez+j+1 ) ='\0';
            }
        }
    }
    printf ( "%s",rez );
    return rez;
}



int main ()
{
    char *s, string[50];
    int i;
    printf ( "Unesi zeljenu recenicu:" );
    scanf ( "%s", string );
    trim ( string );

    return 0;
}


recite mi šta molim vas šta mi ne radi u zadatku... Cilj zadatka je učitati string i onda izbrisati praznine ispred i iza stringa takav string ispisati a da početni ostaje netaknut

 
0 0 hvala 0
17 godina
neaktivan
offline
RE: Pomoć pri zadatku iz c-a....

Evo moje rijesenje... nije najbolje, ali...

 

//trim f-cija iz src polja izbacuje vodece i slijedece praznine
//na nacin da src polje kopira u dest polje
//vraca broj iskopiranih znakova

 

int trim(char *src, char *dest)
{
    int i=0;
   
    //izbaci vodece praznine a to su ' ' space i '\t' tab na nacin
    //da uvecavas src pokazivac (src++) dok src ne pokazuje
    //na '\0' (to ti je ovaj *src - to mogu tako napisati
    //zato sto je nenula true) i (to ti je && operator) src pokazuje na
    //praznine - space ( *src==' ' ) ili tabulator ( *src=='\t' )
    while(*src && (*src==' ' || *src=='\t'))
        src++;

    //zatim, kad sam nasao prvu neprazninu. znaci ne space i ne tab
    //iskopiraj sve znakove iz src polja u dest polje ( dest[i++]=*(src++) )
    //prilikom kopiranja uvecaji i++ za jedan i src++ pokazivac da pokazuje
    //na slijedeci znak
    //ne kopiraj '\0' null terminator-nema potrebe, gubitak vremena
    //njega cemo postaviti u slijedecem koraku
    while(*src)
        dest[i++]=*(src++);

    //oznaci kraj dest polja
    //pronadji krajnju desnu neprazninu (dest[i]==' ' || dest[i]=='\t')
    //ali pazi da ne izadjes iz granica dest polja s lijeve strane i>=0
    //kako pretrazujem s desna na lijevo, indeks smanjujem za 1

    //znaci i--

    //ovaj prvi --i jer smo u predhodnom koraku imali dest[i++] pa nam je i pobjegao jedno mjesto desno - sada ga vratim

    //for petlja zavrsava sa ; znaci, nista se ne izvrsava u for petlju, nemam sto!
    for(--i; i>=0 && (dest[i]==' ' || dest[i]=='\t'); i--);

    //kada sam nasao krajnju desnu neprazninu, onda na slijedece mjesto stavi
    //'\0' null terminator - tj. nulu

    //uoci, ne prepisujem sve byteove sa '\0' nema potrebe, samo bezvezna kopiranja po memoriji!!!
    dest[++i]='\0';

    //vrati koliko sam znakova iskopirao
    return i;
}

pozdrav

Poruka je uređivana zadnji put sri 8.4.2009 0:05 (harti).
17 godina
protjeran
offline
RE: Pomoć pri zadatku iz c-a....

Evo moje rješenje

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

char* trim ( char *s ){
    int strLng = strlen(s);
    int strStart=0;
    int strEnd=0;

    while( *(s + strStart) == ' ' )
        strStart++;

    while( *(s + strLng-strEnd -1 ) == ' ' )
        strEnd++;

    strLng = strLng - strStart - strEnd;
    char* rez= ( char* ) malloc (strLng * sizeof ( char )+1);
    int i=0;
    for (i=0;i<strLng;i++)    {
        *(rez+i) = *(s + strStart + i);
    }
    *(rez+i)='\0';
    printf ( "%s\n",rez );
    return rez;
}

int _tmain(int argc, _TCHAR* argv[])
{
    char  stringx[50];
    printf ( "Unesi zeljenu recenicu:\n" );
    gets(stringx);
    char *rez = trim (stringx );
    free(rez);

    system("PAUSE");
    return 0;
}

Programko http://programko.bloger.hr
16 godina
neaktivan
offline
Pomoć pri zadatku iz c-a....

E Harti fala al tvoje baš ne kužin neke stvari.

Programko fala puno sve san razumia i kontan dobra ideja nisan se sitia toga da iden unazad od maksimalne veličine stringa tako eliminirajuć iza praznine:D POZ

 
0 0 hvala 0
17 godina
neaktivan
offline
RE: Pomoć pri zadatku iz c-a....

Evo, stavio komentare, nadam se da je jasnije!

 

Inace pozivanje malloc() unutar neke funkcije, a pozivanje free() negdje tko zna gdje nije bas najpametnije rijesenje. Zaboravit ces free, program ce se izvrsiti tko zna kojim redosljedom i preskocit ce free() poziv i imat ces memory leak, a to ti je za poluditi pronaci i izdebuggirati !!!

 

Napravis slijedece:

 

1. alociras memoriju za izlazno rijesenje (bilo malloc() bilo da si napisao char buff[50] )

2. pozoves f-ciju trim() i kao parametar joj proslijedis alociranu memoriju

3. radis sa trimom sto god hoces

4. u istoj f-ciji u kojoj si pozvao malloc(), par redova nize pozoves free()

 

pogledaj kako su izvedene ostale string f-cije u c-u, evo sto kaze npr. man strcpy

 

       #include <string.h>

       char *strcpy(char *dest, const char *src);

       char *strncpy(char *dest, const char *src, size_t n);

 

Manual jos kaze:

 

A simple implementation of strncpy() might be:

 

           char*
           strncpy(char *dest, const char *src, size_t n){
               size_t i;

               for (i = 0 ; i < n && src[i] != '\0' ; i++)
                   dest[i] = src[i];
               for ( ; i < n ; i++)
                   dest[i] = '\0';

               return dest;
           }

UOCI: proslijedjuje se pokazivac na memoriju u koju se vrsi kopiranje i on se onda vraca sa return-om. Nista se ne alocira unutar same f-cije... to bi bila katastrofa, jer da strncpy nesto alocira, kako da ja kao krajni korisnik, koji ne poznam implementaciju, znam da moram pozvati free() na ono sto mi vrati???

 

 

Poruka je uređivana zadnji put sri 8.4.2009 0:19 (harti).
16 godina
neaktivan
offline
Pomoć pri zadatku iz c-a....

Fala na pojašnjenju :D Pozdrav

 
0 0 hvala 0
16 godina
neaktivan
offline
Pomoć pri zadatku iz c-a....

e sta je to uopce za koj to prog ....Auto cad ili

Ivan
Moj PC  
0 0 hvala 0
16 godina
offline
RE: Pomoć pri zadatku iz c-a....
ivan_1995 kaže...

e sta je to uopce za koj to prog ....Auto cad ili

 A mislim stvarno ono, AutoCAD lol.... je ti znaš čemu služi CAD?
17 godina
neaktivan
offline
RE: Pomoć pri zadatku iz c-a....
ivan_1995 kaže...

e sta je to uopce za koj to prog ....Auto cad ili

 hehe Viče
Lupi i ostade živ..
There's too many self-Indulgent wieners in this city with too much bloody money! Are you a web developer? Are you, punk??
16 godina
neaktivan
offline
RE: Pomoć pri zadatku iz c-a....
ivan_1995 kaže...

e sta je to uopce za koj to prog ....Auto cad ili

 to ti je više za programiranje programa koji će rečenicu         "         Danas         ima g*****        ljudi       puno" pretvoriti u rečenicu "Danas ima g***** ljudi puno".    Tj. pobrisati će razmake.
16 godina
neaktivan
offline
Pomoć pri zadatku iz c-a....

ha ha ha ... da autocad ideš... nevjerojatno koje gluposti ode valjaju... ja mislia da ja ne znan niš o programiranju... btw... autocad je program... c je programski jezik... nisi puno fula. Samo ono...

 
0 0 hvala 0
15 godina
neaktivan
offline
Pomoć pri zadatku iz c-a....

Evo da ne otvaram novu temu:Vježbam zadatke za kontrolni i imam problem sa jednim koji glasi ovako: Učitati dva broja(x,y).U funkciji izračunati aritm.sredinu brojeva od broje x do broja y.

E sad,ne znam gdje mi je greška u kodu,ali stalno mi izbacuje da je arsr 2,a znam da sam taj zadatak točno riješio prije.Unaprijed hvala.

 

#include<stdio.h>
#include<iostream>

int f(int x,int y){
                   int z=0,n=0,i;
                   float w;
                   for(i=x;i<y;i++){z=z+i;
                                    n++;  }
                   w=(float)z/n;                
                   return w;                
}

main(){
      
       int a,b;
       float arsr;
       printf("\n ucitajte dva broja");
       scanf("%d %d",&a,&b);
       arsr=f(a,b);
       printf("\n arsr je %.2f",arsr);
       system("PAUSE");
       }

alrighty then
 
0 0 hvala 0
17 godina
offline
Pomoć pri zadatku iz c-a....

Meni normalno radi...

The candle flame gutters. Its little pool of light trembles. Darkness gathers. The demons begin to stir.
 
0 0 hvala 1
15 godina
neaktivan
offline
Pomoć pri zadatku iz c-a....

Znači sve je u redu?Možda je neki bug kod mene.

alrighty then
 
0 0 hvala 0
17 godina
offline
Pomoć pri zadatku iz c-a....

Valjda...

 

Usput, ja sam to kompajlao kao C++ kod u MinGWu (jedina razlika je što sam dodao main()u int kao povratni tip, jer C++ nema "defaultnog inta").

The candle flame gutters. Its little pool of light trembles. Darkness gathers. The demons begin to stir.
 
0 0 hvala 1
16 godina
neaktivan
offline
RE: Pomoć pri zadatku iz c-a....
dncrmt kaže...

Evo da ne otvaram novu temu:Vježbam zadatke za kontrolni i imam problem sa jednim koji glasi ovako: Učitati dva broja(x,y).U funkciji izračunati aritm.sredinu brojeva od broje x do broja y.

(x+y)/2 ?

 

float f(int x, int y){
    return (x + y) / 2.0;
}

Poruka je uređivana zadnji put ned 7.2.2010 18:09 (Tom69).
16 godina
neaktivan
offline
RE: Pomoć pri zadatku iz c-a....

Zašto ti funkcija ima povratnu vrijednost int kad unutar funkcije koristiš float i tražiš preciznost aritmetičke sredine ,ovako imaš gubitak točnosti određivanja aritm.sredine osim ako ti se u zadatku ne traži zaokružiti na cijele brojeve?Također u for petlji stavi i<=y po mom mišljenju.Možda i griješim.Drugi će ti pomoći.....Osmijeh

Private
Poruka je uređivana zadnji put ned 7.2.2010 14:47 (Private).
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice