Programiranje u C-u - od svega pomalo izdvojena tema

poruka: 1.661
|
čitano: 386.741
|
moderatori: Lazarus Long, XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
11 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

q

Poruka je uređivana zadnji put sri 28.5.2014 17:09 (Electr097).
 
0 0 hvala 0
17 godina
offline
Programiranje u C-u - od svega pomalo

Pozdrav, trebao bih pomoć oko ovog zadatka:

 

2) Napišite program koji se sastoji od glavne i tri dodatne funkcije, te učitava n cijelih brojeva u jednodimenzionalno polje. Program treba prebrojati koliko je učitano negativnih brojeva. Za učitavanje vrijednosti varijable n, učitavanje vrijednosti elemenata polja i prebrojavanje negativnih brojeva napisati zasebne funkcije (tri dodatne funkcije). Koristiti samo lokalne varijable.

 

 

Ne kužim ovaj dio sa unosm polja u funkciji. Da je zadatak bez dodatnih funkcija, riješio bih ga već. Ali ne ide mi u glavu kako unjeti polje u dodatnoj funkciji?? Znam da ima veze sa pokazivačima i to, al ne kužim to. Ako može netko napisati ili još bolje objasniti mi da kužim za druge zadatke. Hvala, lp

Pretpostavka je majka svih zajeba. || To do list....go to Pamplona and run in front of bulls!!
Moj PC  
0 0 hvala 0
15 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo

Evo ti pa čitaj:

http://www.cplusplus.com/doc/tutorial/arrays/

http://stackoverflow.com/questions/6567742/passing-array-as-argument-to-function-in-c

http://publications.gbdirect.co.uk/c_book/chapter5/

http://publications.gbdirect.co.uk/c_book/chapter4/

 

Ukratko, polja funkciji prosljeđuješ baš kao i svaki drugi tip podatka.

 

Ako imaš neko polje:

int polje[100];

 

Onda će prototip za funkciju koja prima takvo polje izgledati ovako:

void nekafunkcija(int polje[100])

 

A možeš i izostaviti navođenje broja elemenata polja, pa napisati:

void nekafunkcija(int polje[])

 

A ako znaš da se pokazivači mogu koristiti kao polja onda jednostavno možeš napisati i ovako:

void nekafunkcija(int *polje)

 

P.S.

Ja sam tu iskoristio isto ime za polje u prototipu funkcije i ono polje koje je proslijeđeno kao argument. Ta imena ne moraju biti ista...

To understand what recursion is, you must first understand recursion.
Poruka je uređivana zadnji put čet 5.6.2014 22:15 (rustweaver).
14 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo

Kada se polje predaje funkciji tada se predaje adresa početka polja i njegov broj elemenata.

 

void nekafunkcija(int *p, int elem){
    int i;
    for(i = 0; i < elem; i++)
       printf("%d ", p[i]);
}

 

a poziv je:

 

int polje[100];
//... inicijalizacija
nekafunkcija(polje, 100);  // ili nekafunkcija(&polje[0], 100);

 

Broj elemenata nije potrebno predavati kada je riječ o znakovnim poljima jer se zna da ona završavaju s znakom '\0'.

Poruka je uređivana zadnji put čet 5.6.2014 23:29 (TracerCPP).
17 godina
offline
Programiranje u C-u - od svega pomalo

Hvala na odgovorima, ali ono što je mene na kraju mučilo je bilo sljedeće. Predaja polja iz glavne u pomoćnu funkciju:

 

void pomocnafca (int x[], int n){

 ...

}

 

int main () {

 int x[60],n;

 ...

 pomocnafca(x,n); // znaci samo ovaj dio kod x-a je mene mučio. Nije potrebno ništa dopisivati uz ili prije x. (ne treba x[], *x() ili bilo koja druga šema...)

return 0;

}

Pretpostavka je majka svih zajeba. || To do list....go to Pamplona and run in front of bulls!!
Moj PC  
0 0 hvala 0
15 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

može pomoć, program se crasha a ne mogu naći grešku, zadatak je jednostavno napuniti listu sa random brojevima i ispisati ju:

 

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

struct el{
    struct el* sljedeci;
    int vrijednost;
};
typedef struct el element;

int dodajulistu(element **glavap, int broj)
{ element *novi;
  if((novi=(element*) malloc(sizeof(element)))==NULL)
     return 0;
  novi->vrijednost=broj;
 
if(*glavap==NULL || (*glavap)->vrijednost >= broj)
{novi->sljedeci=*glavap;
*glavap=novi;
}
  return 1;
}

void ispisilistu(element *glava)
{ for(;glava;glava=glava->sljedeci)
printf("%d",glava->vrijednost);
return ;
}

int main(void)
{ int i,broj;
  element **glavap;
  *glavap=NULL;
  srand((unsigned)time(NULL));
  printf("sada cemo napuniti listu brojevima\n");
  for(i=0;i<10;i++)
  { broj=rand()%20;
    dodajulistu(glavap,broj);
  }
  printf("\nsada cemo ispisati listu\n");
  ispisilistu(*glavap);
  return 0;
 
}

Moj PC  
0 0 hvala 0
14 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo

Na prvi pogled vidim da nema potrebe za deklaracijom

 

element **glavap;

 

Tebi treba tek pointer na glavu liste, a kada taj pointer predaješ funkciji tek onda ti treba pointer na pointer. Stoga, ovako nešto bi bilo sasvim dovoljno:

 

element *glavap=NULL;

 

s time da funkciji sada predaješ adresu tog pointera:

 

dodajulistu(&glavap,broj);

 

Pogledaj malo sljedeći primjer pa će ti možda biti jasnije.

 

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

struct zapis{
    int god;
    char ime[25+1];
    char prez[25+1];
    struct zapis* godp;    // sljedeći zapis po starosti
    struct zapis* imep;    // ----- II -------- imenu
    struct zapis* prezp;   // ----- II -------- prezimenu
};
typedef struct zapis glava;

void PoGodini(glava **glavap, glava *novi) {
    for(; *glavap && (*glavap)->god < novi->god;
        glavap = &((*glavap)->godp));
    novi->godp = *glavap;
    *glavap = novi;
}
void PoImenu(glava **glavap, glava *novi) {
    for(;*glavap && strcmp((*glavap)->ime, novi->ime) < 0;
       glavap = &((*glavap)->imep));
    novi->imep = *glavap;
    *glavap = novi;
}
void PoPrezimenu(glava **glavap, glava *novi) {
    for(;*glavap && strcmp((*glavap)->prez, novi->prez) < 0;
       glavap = &((*glavap)->prezp));
    novi->prezp = *glavap;
    *glavap = novi;
}
int main(){
    int n, i;
    glava *lista_god = NULL, *lista_ime = NULL, *lista_prez = NULL;
    glava *temp;

    cout<< "Unesite broj željenih podataka: ";
    cin>> n;
    for(i=1; i<=n; i++){
       if((temp = (glava*)malloc(sizeof(glava)))==NULL){
          cout<< "Nema dovoljno memorije!";
          return -1;
       }
       cout<< "Unesi ime, prezime i starost: ";
       cin>> temp->ime >> temp->prez >> temp->god;
       // dodaj u liste...
       PoGodini(&lista_god, temp);
       PoImenu(&lista_ime, temp);
       PoPrezimenu (&lista_prez, temp);
    }
    cout<<"\nIspis po starosti:\n";
    while(lista_god){
       cout<< lista_god->god << " " << lista_god->ime << " "
          << lista_god->prez << endl;
       lista_god = lista_god->godp;
    }
    cout<<"\nIspis po imenu:\n";
    while(lista_ime){
       cout<< lista_ime->god << " " << lista_ime->ime << " "
          << lista_ime->prez << endl;
       lista_ime = lista_ime->imep;
    }
    cout<<"\nIspis po prezimenu:\n";
    while(lista_prez){
       cout<< lista_prez->god << " " << lista_prez->ime << " "
          << lista_prez->prez << endl;
       lista_prez = lista_prez->prezp;
    }
    return 0;
}

Poruka je uređivana zadnji put pet 6.6.2014 23:22 (TracerCPP).
15 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Hvala, rješili smo, napravili smo to i još nije bilo dobro, zbog uvjeta u funkciji za dodavanje koja je prekopirana od jednog drugog zadatka, a na kraju uopće netreba uvjet jer samo dodajemo elemente.. :)

Moj PC  
0 0 hvala 0
12 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

zadatak - napisati funkciju koja brise sve elemente u listi osim prvog

Moze li se efikasnije (ako je ovo uopce dobro)?

BTW - ako moze brzo objasnjenje gdje treba *, &(, ** etc... propustio sam skoro sva predavanja, duga prica...

 

void brisi_sve_osim_prvog(cvor **vrh)
{
   cvor *pom1 = *vrh->slijed;
   cvor *pom2 = pom1->slijed;

   while (   (pom1->slijed != 0 )   ||   (pom2->slijed != 0)   ){
      free (pom1);
      pom1 = pom2->slijed;
      free (pom2);
      pom2 = pom1->slijed;
   }
}

Under neon loneliness...Motorcycle emptiness...
Poruka je uređivana zadnji put uto 24.2.2015 0:03 (lazy_punk).
Moj PC  
0 0 hvala 0
17 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Evo da i ja zamolim za pomoć... Imam polje ulaznih vrijednosti koje dobijem mjerenjima:

 

const int16 y[4] = { 1000, 500, -400, -800 };

Više-manje slučajni brojevi, no ograničenog raspona i uvijek vrijedi da je y[0] > y[1], y[1] > y[2], y[2] > y[3].

 

I znam da ta mjerenja korespondiraju sa slijedećim fiksnim i uvijek istim početnim vrijednostima; fizikalno to znači da mjerim u poznatim i konstantnim intervalima:

const int16 x[4] = { -2048, -1024, 1024, 2048 };

 

Sad bih trebao neku lijepu kubičnu, B-spline ili već bilo kakvu smislenu interpolacijsku krivulju, koja će za neki ulazni y12, za koji uvijek vrijedi y[1] < y12 < y[2] tj nalazi se između srednje dvije točke, vratiti koji mu je pripadajući x12:

int16 reverse_spline(const int16 y12)
{

  int16 x12 = 0;
  // ???

  return x12;
}

Znam da mora biti x[1] < x12 < x[2] jer je svaki mjereni interval pažljivo odabran tako da bude smislen i pravilan i konstantno rastući/padajući, ali treba mi puno preciznije. Može i C++, ali poželjno je (nije uvjet) da je algoritam čim čitljiviji i sa integerskom aritmetikom jer će ga možda jednog dana trebati portirati u slabi malo-jezgreni ne-x86 cpu. Dosta sam guglao, ali nisam od toga postao ništa pametniji. Nije zadatak nego hobi projekt u vezi s procesiranjem videa; array y vrijednosti su zapravo sume apsolutnih razlika keyframeova koje analiziram, odnosno na neki način tražim frame u kojem ima najmanje pokreta, što bih detektirao po tome da tada (uz pretpostavku da nisam pogrješio negdje drugdje u cijeloj zamisli) x12 mora biti 0 +- neka tolerancija. Sve navedeno sam već složio i radi, zapeo sam baš na izinterpoliravanju x12...

 

Poruka je uređivana zadnji put uto 24.2.2015 15:17 (DigiMagic).
Moj PC  
0 0 hvala 0
16 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
DigiMagic kaže...

Evo da i ja zamolim za pomoć... Imam polje ulaznih vrijednosti koje dobijem mjerenjima:

 

const int16 y[4] = { 1000, 500, -400, -800 };

Više-manje slučajni brojevi, no ograničenog raspona i uvijek vrijedi da je y[0] > y[1], y[1] > y[2], y[2] > y[3].

 

I znam da ta mjerenja korespondiraju sa slijedećim fiksnim i uvijek istim početnim vrijednostima; fizikalno to znači da mjerim u poznatim i konstantnim intervalima:

const int16 x[4] = { -2048, -1024, 1024, 2048 };

 

Sad bih trebao neku lijepu kubičnu, B-spline ili već bilo kakvu smislenu interpolacijsku krivulju, koja će za neki ulazni y12, za koji uvijek vrijedi y[1] < y12 < y[2] tj nalazi se između srednje dvije točke, vratiti koji mu je pripadajući x12:

int16 reverse_spline(const int16 y12)
{

  int16 x12 = 0;
  // ???

  return x12;
}

Znam da mora biti x[1] < x12 < x[2] jer je svaki mjereni interval pažljivo odabran tako da bude smislen i pravilan i konstantno rastući/padajući, ali treba mi puno preciznije. Može i C++, ali poželjno je (nije uvjet) da je algoritam čim čitljiviji i sa integerskom aritmetikom jer će ga možda jednog dana trebati portirati u slabi malo-jezgreni ne-x86 cpu. Dosta sam guglao, ali nisam od toga postao ništa pametniji. Nije zadatak nego hobi projekt u vezi s procesiranjem videa; array y vrijednosti su zapravo sume apsolutnih razlika keyframeova koje analiziram, odnosno na neki način tražim frame u kojem ima najmanje pokreta, što bih detektirao po tome da tada (uz pretpostavku da nisam pogrješio negdje drugdje u cijeloj zamisli) x12 mora biti 0 +- neka tolerancija. Sve navedeno sam već složio i radi, zapeo sam baš na izinterpoliravanju x12...

 

 

ALL CREDITS  : http://www.pcs.cnu.edu/~bbradie/cinterpolation.html

 

Na tom linku imaš dokumentirane funkcije.

Ja sam samo izvukao najbitnije i pobacao u main kako bi ti vidio da li ti odgovara output (vidi niži printScreen ili još bolje sam kompajliraj code).

Malo se poigraj code-om pa prebaci štogod na int16_t jer ovo je float-point ver. , također je u cpp-u zapravo samo radi jednostavnosti cout prikaza.

Vjerujem da nije problem sve prebaciti u čisti C.

 

Sretno s projektom .

 

 

#include <iostream>
using namespace std;



double neville ( int n, double *x, double *y, double t )
{
    int i, j;
    double *f, fxbar;

    f = new double [n];
    for ( i = 0; i < n; i++ )
        f[i] = y[i];

    for ( j = 1; j < n; j++ )
        for ( i = n-1; i >= j; i-- )
        {
            f[i] = ( (t-x[i-j])*f[i] - (t-x[i])*f[i-1] ) / ( x[i] - x[i-j] );
        }

    fxbar = f[n-1];
    delete [] f;
    return ( fxbar );
}


double* divdiff ( int n, double *x, double *y )
{
    int i, j;
    double *f;

    f = new double [n];
    for ( i = 0; i < n; i++ )
        f[i] = y[i];

    for ( j = 1; j < n; j++ )
        for ( i = n-1; i >= j; i-- )
        {
            f[i] = ( f[i] - f[i-1] ) / ( x[i] - x[i-j] );
        }

    return ( f );
}


double nf_eval ( int n, double *x, double *nf, double t )
{
    int j;
    double temp;

    temp = nf[n-1];
    for ( j = n-2; j >= 0; j-- )
        temp = temp * ( t - x[j] ) + nf[j];

    return ( temp );
}


void tridiagonal ( int n, double *c, double *a, double *b, double *r )

{
    int i;

    for ( i = 0; i < n-1; i++ )
    {
        b[i] /= a[i];
        a[i+1] -= c[i]*b[i];
    }

    r[0] /= a[0];
    for ( i = 1; i < n; i++ )
        r[i] = ( r[i] - c[i-1] * r[i-1] ) / a[i];

    for ( i = n-2; i >= 0; i-- )
        r[i] -= r[i+1] * b[i];
}


void cubic_nak ( int n, double *x, double *f, double *b, double *c, double *d )
{
    double *h,
           *dl,
           *dd,
           *du;
    int i;

    h  = new double [n];
    dl = new double [n];
    dd = new double [n];
    du = new double [n];

    for ( i = 0; i < n-1; i++ )
        h[i] = x[i+1] - x[i];
    for ( i = 0; i < n-3; i++ )
        dl[i] = du[i] = h[i+1];

    for ( i = 0; i < n-2; i++ )
    {
        dd[i] = 2.0 * ( h[i] + h[i+1] );
        c[i]  = ( 3.0 / h[i+1] ) * ( f[i+2] - f[i+1] ) -
                ( 3.0 / h[i] ) * ( f[i+1] - f[i] );
    }
    dd[0] += ( h[0] + h[0]*h[0] / h[1] );
    dd[n-3] += ( h[n-2] + h[n-2]*h[n-2] / h[n-3] );
    du[0] -= ( h[0]*h[0] / h[1] );
    dl[n-4] -= ( h[n-2]*h[n-2] / h[n-3] );

    tridiagonal ( n-2, dl, dd, du, c );

    for ( i = n-3; i >= 0; i-- )
        c[i+1] = c[i];
    c[0] = ( 1.0 + h[0] / h[1] ) * c[1] - h[0] / h[1] * c[2];
    c[n-1] = ( 1.0 + h[n-2] / h[n-3] ) * c[n-2] - h[n-2] / h[n-3] * c[n-3];
    for ( i = 0; i < n-1; i++ )
    {
        d[i] = ( c[i+1] - c[i] ) / ( 3.0 * h[i] );
        b[i] = ( f[i+1] - f[i] ) / h[i] - h[i] * ( c[i+1] + 2.0*c[i] ) / 3.0;
    }

    delete [] h;
    delete [] du;
    delete [] dd;
    delete [] dl;
}


void cubic_clamped ( int n, double *x, double *f, double *b, double *c,
                     double *d, double fpa, double fpb )
{
    double *h,
           *dl,
           *dd,
           *du;
    int i;

    h  = new double [n];
    dl = new double [n];
    dd = new double [n];
    du = new double [n];

    for ( i = 0; i < n-1; i++ )
    {
        h[i] = x[i+1] - x[i];
        dl[i] = du[i] = h[i];
    }

    dd[0] = 2.0 * h[0];
    dd[n-1] = 2.0 * h[n-2];
    c[0] = ( 3.0 / h[0] ) * ( f[1] - f[0] ) - 3.0 * fpa;
    c[n-1] = 3.0 * fpb - ( 3.0 / h[n-2] ) * ( f[n-1] - f[n-2] );
    for ( i = 0; i < n-2; i++ )
    {
        dd[i+1] = 2.0 * ( h[i] + h[i+1] );
        c[i+1] = ( 3.0 / h[i+1] ) * ( f[i+2] - f[i+1] ) -
                 ( 3.0 / h[i] ) * ( f[i+1] - f[i] );
    }

    tridiagonal ( n, dl, dd, du, c );

    for ( i = 0; i < n-1; i++ )
    {
        d[i] = ( c[i+1] - c[i] ) / ( 3.0 * h[i] );
        b[i] = ( f[i+1] - f[i] ) / h[i] - h[i] * ( c[i+1] + 2.0*c[i] ) / 3.0;
    }

    delete [] h;
    delete [] du;
    delete [] dd;
    delete [] dl;
}


double spline_eval ( int n, double *x, double *f, double *b, double *c,
                     double *d, double t )
{
    int i,
        found;

    i = 1;
    found = 0;
    while ( !found && ( i < n-1 ) )
    {
        if ( t < x[i] )
            found = 1;
        else
            i++;
    }
    t = f[i-1] + ( t - x[i-1] ) * ( b[i-1] + ( t - x[i-1] ) * ( c[i-1] +
                                    ( t - x[i-1] ) * d[i-1] ) );
    return ( t );
}



int main ()
{
    double x[4] = { -2048.0 , -1024.0 , 1024.0 , 2048.0 };
    double y[4] = { 1000.0 , 500.0 , -400.0 , -800.0 };
    int n = 4;

    cout << "USING NEVILLE's ALGORITHM" << endl;
    cout << "x = -2048.0" << '\t' << neville ( n, x, y, -2048.0 ) << endl;
    cout << "x = -1536.0" << '\t' << neville ( n, x, y, -1536.0 ) << endl;
    cout << "x =  0.0" << '\t' << neville ( n, x, y, 0.0 ) << endl;
    cout << "x =  1024.0" << '\t' << neville ( n, x, y, 1024.0 ) << endl;
    cout << "x =  2048.0" << '\t' << neville ( n, x, y, 2048.0 ) << endl;
    cout << "x = 2816.0" << '\t' << neville ( n, x, y, 2816.0 ) << endl;
    cout << endl;

    return 0;
}

moje aplikacije na play-u : https://play.google.com/store/search?q=nik02droid
Poruka je uređivana zadnji put uto 24.2.2015 18:37 (nik_02).
16 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
lazy_punk kaže...

zadatak - napisati funkciju koja brise sve elemente u listi osim prvog

Moze li se efikasnije (ako je ovo uopce dobro)?

BTW - ako moze brzo objasnjenje gdje treba *, &(, ** etc... propustio sam skoro sva predavanja, duga prica...

 

void brisi_sve_osim_prvog(cvor **vrh)
{
   cvor *pom1 = *vrh->slijed;
   cvor *pom2 = pom1->slijed;

   while (   (pom1->slijed != 0 )   ||   (pom2->slijed != 0)   ){
      free (pom1);
      pom1 = pom2->slijed;
      free (pom2);
      pom2 = pom1->slijed;
   }
}

 

Dovoljno ti je samo par linija u void del_all_save_head(Node* nd);

Ovdje je riječ o simple linked listi tako da je **cvor zapravo greška (pointer to pointer) osim ako u code-u nema nekog drugog dijela koji ovdje nije vidljiv.

Sorry , prebacio sam ono cvor i slijed na Node i next jer code pisati u bilo čemu osim en-usa smatram kriminalom .

Osim ponekad naravno ali treba tu praksu u globalu što prije zaboraviti a i zvuči neako suludo loše :  čvor , slijed , dretva ....

 

 

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


typedef struct Node Node;
struct Node
{
    Node* _next;
};


void del_all_save_head(Node* nd)
{
    while(nd != NULL){
        Node* tmp = nd;
        free(nd);
        nd = tmp->_next;
    }
}



int main()
{
    Node* head = (Node*)malloc(sizeof(Node));
    Node* n0   = (Node*)malloc(sizeof(Node));
    Node* n1   = (Node*)malloc(sizeof(Node));
    Node* n2   = (Node*)malloc(sizeof(Node));

    head->_next = n0;
    n0->_next = n1;
    n1->_next = n2;
    n2->_next = NULL;

    Node* nd = head;

    while(nd != NULL){
        printf("node: %i \n" , (int)nd);
        nd = nd->_next;
    }


    del_all_save_head(head);


    nd = head;
    while(nd != NULL){
        printf("\n\nsaved node: %i \n" , (int)nd);
        nd = nd->_next;
    }


    return 0;
}

moje aplikacije na play-u : https://play.google.com/store/search?q=nik02droid
Poruka je uređivana zadnji put uto 24.2.2015 19:05 (nik_02).
17 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
nik_02 kaže...

Ovo se čini savršeno, dugujem ti pivo, burek, ćevape ili po izboru! Probat ću preko vikenda. Floati i cpp nisu problem, lako to izoptimiziram sad kad imam što izoptimizirati.

 

16 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
DigiMagic kaže...
nik_02 kaže...

Ovo se čini savršeno, dugujem ti pivo, burek, ćevape ili po izboru! Probat ću preko vikenda. Floati i cpp nisu problem, lako to izoptimiziram sad kad imam što izoptimizirati.

 

 

Sve OK ,  drago mi je da sam ti pomogao.

moje aplikacije na play-u : https://play.google.com/store/search?q=nik02droid
12 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
Ma i ja sam zato da se izbaci sve osim engleskog iz programiranja, trebalo mi je sat vremena sinoc prvo da rasclanim atom / vrh / glava / cvor / korijen / dijete / list / roditelj ..
Svejedno, nocno ucenje je bilo korisno, 5ca se dobila hehe...
Under neon loneliness...Motorcycle emptiness...
15 godina
offline
Programiranje u C-u - od svega pomalo

Pozdrav ekipa, imam jedno pitanje, krenuo sam u svijet C-a radim po skripti od Dennis M. Ritchie i Brian W. Kernighan (drugo izdanje) kod pišem u programskom okruženju CodeBlocks, i ne kužim koji god program napisao(prepisao iz skripte) ništa se ne događa, molim Vas za pomoć. Slike u prilogu.

 

Kod:

#include <stdio.h>
int main()
{

 

int c, i, nwhite, nother;

 

int ndigit[10];

 

nwhite = nother = 0;

 

for(i = 0; i<10; ++i)

 

ndigit[i] = 0;

 

while((c = getchar()) !=EOF)

 

if(c >= '0'&& c<='9')

 

++ndigit[c-'0'];

 

else

 

if(c== ' '|| c=='\n'|| c=='\t')

 

++nwhite;

 

else

 

++nother;

 

printf("znamenke=");

 

for(i = 0; i < 10; i++)

 

printf(" %d", ndigit[i]);

 

printf(", specijalni znakovi=%d, ostalo=%d\n", nwhite, nother);

 

return 0;

}

Poruka je uređivana zadnji put uto 3.3.2015 14:46 (ERROR1911).
 
0 0 hvala 0
13 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Si napravil kao Empty Project?

File->New->Project nakon toga ti se otvori prozor i odaberes Empty project i stisnes Go!
Onda ti se otvori novi prozor i stisne Next, upišeš naziv projekta pod Project Title i mozes si cak putanju promjeniti gdje da ti se nalazi projekt (Folder to create...).
Nakon toga stisnes Next i Finish nakon toga.
Onda odes File->New->Empty file i skocni prozor te pita da li želiš dodati taj file trenutno projektu na sto ti kazes da. Pa te trazi da das ime tom fajlu, moze dati proizvoljno i na kraju stavis .c (pr. Test.c).
EDIT: Samo malo da analiziram kod; da onaj EOF kod while petlje stvara probleme, to sam stavil != '\n' pa je proradilo, ali znaci niz zadajes u jednom retku tipa: 1 2 3 4 5 6 7 a b c  i onda stisnes enter, program koliko sam skuzio broji frekvenciju pojavljivanja znamenki od 0 - 9, ali znaci ti mozes unijeti 123 ili 1 2 3, on ce svejedno povecati brojac za svaku znamenku za jedan samo kaj ce u drugom slucaju povecati brojac specijalnih znakova jer imas space-ove, a slova ti broji pod drugo...
Ja se nadam da si ti vec skuzio kak radi program, ali pisem u slucaju da nisi...

Poruka je uređivana zadnji put uto 3.3.2015 15:09 (Master11).
Moj PC  
0 0 hvala 1
15 godina
offline
Re: Programiranje u C-u - od svega pomalo
Master11 kaže...

Si napravil kao Empty Project?

File->New->Project nakon toga ti se otvori prozor i odaberes Empty project i stisnes Go!
Onda ti se otvori novi prozor i stisne Next, upišeš naziv projekta pod Project Title i mozes si cak putanju promjeniti gdje da ti se nalazi projekt (Folder to create...).
Nakon toga stisnes Next i Finish nakon toga.
Onda odes File->New->Empty file i skocni prozor te pita da li želiš dodati taj file trenutno projektu na sto ti kazes da. Pa te trazi da das ime tom fajlu, moze dati proizvoljno i na kraju stavis .c (pr. Test.c)

 

Da točno sam sve tako radio. 

Poruka je uređivana zadnji put uto 3.3.2015 14:54 (ERROR1911).
13 godina
protjeran
offline
Programiranje u C-u - od svega pomalo

pozdrav svima,molim vas mozete li mi reci kako ste vi naucili c jezik,bilo bi pozeljno da mi linkate i literaturu,ja znam teoriju,al' kad hocu rijesavati zadatke ne znam sto da radim,svaki savjet bi dobrodosao. 

Moj PC  
0 0 hvala 0
15 godina
offline
Programiranje u C-u - od svega pomalo

Radim par dana po skripti Dennis M. Ritchie i Brian W. Kernighan (drugo izdanje) i primjetio sam da ima dosta grešaka u kodu, dali imate još koju drugu literaturu za preporučiti? 

 
0 0 hvala 0
16 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
ERROR1911 kaže...

Radim par dana po skripti Dennis M. Ritchie i Brian W. Kernighan (drugo izdanje) i primjetio sam da ima dosta grešaka u kodu, dali imate još koju drugu literaturu za preporučiti? 

 

Ako nije problem , postaj ovdje copy-paste par primjera molio bih te.

Ovo što si naveo je dosta nevjerovatno pa me stoga zanima.

Hvala.

 

moje aplikacije na play-u : https://play.google.com/store/search?q=nik02droid
15 godina
offline
Programiranje u C-u - od svega pomalo

#include <stdio.h>
#define MAXLINE 1000 /* maksimalna dužina linije */


int getline(char line[], int maxline);

void copy(char to[], char from[]);
/* ispis najduže linije s ulaza */

main()
{
int len;
int max;

char line[MAXLINE];
char longest[MAXLINE];

max=0;

while((len=getline(line, MAXLINE))>0)
if(len>max){
max=len;
copy(longest, line);
}
if(max>0) /* ima linija */

printf("%s", longest);

return 0;
}


 

Evo recimo ovaj kod, ne znam u čemu je problem ali dok ga build javi mi greške, vjerovatno je greška do mene, ispričavam se ali prvi puta radim u C-u i susrečem s programiranjem 

 

ovo su greške 

C:\Users\Matija\Desktop\C\SKRIPTA\01\Untitled2.c|23|undefined reference to `copy'|

C:\Users\Matija\Desktop\C\SKRIPTA\01\Untitled2.c|20|undefined reference to `getline'|

 

 
0 0 hvala 0
16 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
ERROR1911 kaže...

#include <stdio.h>
#define MAXLINE 1000 /* maksimalna dužina linije */


int getline(char line[], int maxline);

void copy(char to[], char from[]);
/* ispis najduže linije s ulaza */

main()
{
int len;
int max;

char line[MAXLINE];
char longest[MAXLINE];

max=0;

while((len=getline(line, MAXLINE))>0)
if(len>max){
max=len;
copy(longest, line);
}
if(max>0) /* ima linija */

printf("%s", longest);

return 0;
}


 

Evo recimo ovaj kod, ne znam u čemu je problem ali dok ga build javi mi greške, vjerovatno je greška do mene, ispričavam se ali prvi puta radim u C-u i susrečem s programiranjem 

 

ovo su greške 

C:\Users\Matija\Desktop\C\SKRIPTA\01\Untitled2.c|23|undefined reference to `copy'|

C:\Users\Matija\Desktop\C\SKRIPTA\01\Untitled2.c|20|undefined reference to `getline'|

 

 

Ajmo ovako.

 

Inače ti baca grešku undefined reference je imaš gore getline(...) i copy(...) samo deklarirano a nigdje definirano.

Znači int getline(char line[], int maxline); nije dovoljno ukoliko nemaš negdje definiciju 

int getline(char line[], int maxline)

{

  // neki code ovdje

}

 

No i kad to obaviš , bacit će ti grešku konflikta tvoje funkcije getline s već postojećom u <stdio.h>.

Ponavljam zamolbu , postaj doslovan COPY-PASTE i molim te navedi da li su zadaci samostojni

ili samo služe kao primjer u kontekstu nekog objašnjenja.

 

Inače je Ritchie jedan od tvoraca C jezika tako da su greške ovog tipa skoro pa nemoguće (obzirom na starost knjige ako

su i postojale , davno je to revidirano u sljedećim izdanjima)

 

 

moje aplikacije na play-u : https://play.google.com/store/search?q=nik02droid
Poruka je uređivana zadnji put sri 11.3.2015 12:51 (nik_02).
10 godina
neaktivan
offline
Pomoć u C-u

Pozdrav.

 

Potrebna mi je pomoć oko sljedećeg C programa:

 

Napisati program u kojem se učitava niz od n cijelih brojeva, a zatim se ispisuje
najduža serija parnih, kao i najduža serija pozitivnih elemenata niza.

Npr. učitani niz: 2 4 6 -1 7 3 -2 1

Ispis: 3 3 (broj najduže serije parnih je 3, broj najduže serije pozitivnih je 3)

 

Napisao sam program na "lakši" način:

 

#include <stdio.h>
int paran(int x) {
return x % 2 == 0;
}
int pozitivan(int x) {
return x > 0;
}
int najduza_serija(int a[], int n, int (*f) (int)) {
int i;
int ts = 0;
/* Najduza serija je tekuca serija */
int ns = ts;
for (i = 0; i < n; i++) {
/* Ako element zadovoljava kriterijum */
if ((*f)(a[i]))
/* Nastavlja se tekuca serija */
ts++;
else
/* Inace, prekidamo seriju */
ts = 0;
/* Azuriramo vrijednost najduze serije */
if (ts > ns)
ns = ts;
}
/* Vracamo duzinu najduze serije */
return ns;
}
/* Testiramo napisane funkcije */
int main() {
int a[] = {2,4,6,-1,7,3,-2,1},
n = sizeof(a)/sizeof(int);
printf("%d %d\n", najduza_serija(a, n, &paran),
najduza_serija(a, n, &pozitivan));
return 0;
}

 

Kako implementirati program ako se za prototip uzme funkcija:

void najduza_serija(int *niz, int n, int (*s)(int), int **pocetak, int *duzina);

 

Unaprijed hvala.

 
0 0 hvala 0
17 godina
offline
Programiranje u C-u - od svega pomalo

Pretpostavljam da taj dvostruki pokazivač kao parametar u funkciji znači da u funkciju iz koje se poziva vraća polaznu poziciju podniza, što se koristi za ispis ili drugu radnju sa podnizom u funkciji iz koje se ova funkcija poziva.

Pošto se radi sa pokazivačima, išao sam sa aritmetikom pokazivača a ne operatorom index, mada je ista stvar.

Stavio sam provjeru tekuće duljine u if blok, ovako vrši provjeru samo kad vrijednost na poziciji niza udovoljava uvjetu, a ne uvijek.

 

#include <stdio.h>
int paran(int x) {
   return x % 2 == 0;
}
int pozitivan(int x) {
   return x > 0;
}
void najduza_serija(int* niz, int n, int(*f) (int), int** pocetak, int* duzina) {
   int tekucaDuzina = 0;
   for (int i = 0; i < n; i++)
   {

      if ((*f)(*(niz + i)))
      {
         tekucaDuzina++;
         if (tekucaDuzina > *duzina)
         {
            *duzina = tekucaDuzina;
            *pocetak = &(*(niz + i - *duzina + 1));
         }
      }
      else
         tekucaDuzina = 0;
   }
}
/* Testiramo napisane funkcije */
int main() {
   int duzina = 0;
   int a[] = { 2, 3, -4, 2, 3, 4, 6, 10, 12, -2, 3, 5, 4, 9 },
      n = sizeof(a) / sizeof(int);
   int* pocetak = a;
   najduza_serija(a, n, &pozitivan, &pocetak, &duzina);
   printf("%d\n", duzina);
   for (int i = 0; i < duzina; i++)
   {
      printf("%d ", *(pocetak + i));
   }
   return 0;
}

Poruka je uređivana zadnji put sri 18.3.2015 15:16 (Floki).
 
0 0 hvala 0
11 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

moze mala pomoc oko ovog zadatka pomocu while petlje nađite najveću znamenku visekratnog broja n

 
0 0 hvala 0
15 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Radim program sa slikama, i pročitati ću red slike i spremiti ga u polje.

 

//tako sad radim 

PIXEL row[width];

// u programu još koristim

fread(&row, sizeof(PIXEL), width, inPnt);    // učitavanje reda u memoriju

fwrite( &row[k], sizeof(PIXEL), 1, outPnt );  //za pisanje pojedinih piksel

 

Sad ako pokušam to napraviti sa malloc kod pokretanja dobijem Segmentation Error.

 

PIXEL* row = (PIXEL*)  malloc ( width * sizeof(PIXEL) );

 

I na kraju programa imam

free (row);

Trebam li još promjeniti argumente fwrit i fread funkcija?

 

ಠ_ಠ Rolling on the floor laughing until someone jump on me a makes me stop rolling on the floor laughing but then I do it again cuz it&amp;#39;s awesome
Moj PC  
0 0 hvala 0
15 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

bok, moze netko objasniti zašto dobivam "stack around the variable object is corrupted" po zavrsetku programa

 

void read(FILE* bin_file, struct object3D* object)
{
int i = 0;
//bufferi za fread funkciju
float* float_buffer = malloc((float)sizeof(float)* 12);
unsigned int uns_int_buffer;
unsigned short uns_short_buffer;
fseek(bin_file, 80, SEEK_SET); //offset na iza headera
fread(&uns_int_buffer, sizeof(unsigned int), 1, bin_file);
object->broj_trokuta = uns_int_buffer;
//printf("Broj trokuta je: %d\n", object->broj_trokuta);
object->trokut = malloc(sizeof(struct trokut)*(object->broj_trokuta));
for (i = 0; i < object->broj_trokuta; i++)
{
fread(float_buffer, sizeof(float), 12, bin_file); //sprema niz od 9 + 3 float-ova (normala i vrhovi) u float buffer
object->trokut[i].n1 = *(float_buffer + 0);
object->trokut[i].n2 = *(float_buffer + 1);
object->trokut[i].n3 = *(float_buffer + 2);
object->trokut[i].x1 = *(float_buffer + 3);
object->trokut[i].y1 = *(float_buffer + 4);
object->trokut[i].z1 = *(float_buffer + 5);
object->trokut[i].x2 = *(float_buffer + 6);
object->trokut[i].y2 = *(float_buffer + 7);
object->trokut[i].z2 = *(float_buffer + 8);
object->trokut[i].x3 = *(float_buffer + 9);
object->trokut[i].y3 = *(float_buffer + 10);
object->trokut[i].z3 = *(float_buffer + 11);
fread(&uns_short_buffer, sizeof(unsigned short), 1, bin_file);
}
}
int main()
{
struct object3D* object;
object = malloc(sizeof(struct object3D));
FILE* bin_file = fopen("D:\\primjerbin.stl", "r+");
FILE* bin_file1 = fopen("D:\\bin_file1.stl", "w");
read(bin_file, &object);
//write(bin_file1, &object);
}

 

funkcija je dio programa za rad s binarnim stl datotekama

Poruka je uređivana zadnji put sri 1.4.2015 12:42 (luka.miskovic).
 
0 0 hvala 0
12 godina
offline
Re: Programiranje u C-u - od svega pomalo

object je pointer. funkcija read prima pointer. Kad saljes &object, ustvari saljes pointer na pointer. & je nepotreban.

Nije dana definicija struct object3D, pa ne znam da li ima jos koji problem...

15 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Zahvaljujem, to je rijesilo problem, promaknuo mi je taj & nekako. Tu su struct trokut i ovject3D ali nema tu problema. Hvala

 

struct trokut
{
float n1, n2, n3;
float x1, y1, z1;
float x2, y2, z2;
float x3, y3, z3;
};

struct object3D
{
unsigned int broj_trokuta;
struct trokut* trokut;
};

 
0 0 hvala 0
Nova poruka
E-mail:
Lozinka:
 
vrh stranice