q
Programiranje u C-u - od svega pomalo
- poruka: 1.661
- |
- čitano: 386.741
- |
- moderatori:
Lazarus Long, XXX-Man, vincimus
- +/- sve poruke
- ravni prikaz
- starije poruke gore
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
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...
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'.
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;
}
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;
}
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;
}
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.. :)
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;
}
}
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...
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;
}
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;
}
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.
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.
Svejedno, nocno ucenje je bilo korisno, 5ca se dobila hehe...
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;
}
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...
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.
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.
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?
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.
#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'|
#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)
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, ¶n),
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.
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;
}
moze mala pomoc oko ovog zadatka pomocu while petlje nađite najveću znamenku visekratnog broja n
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?
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
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...
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;
};