Isprobaj?
Programiranje u C-u - od svega pomalo
- poruka: 1.661
- |
- čitano: 386.865
- |
- moderatori:
Lazarus Long, XXX-Man, vincimus
- +/- sve poruke
- ravni prikaz
- starije poruke gore
Isprobaj?
Radi. Hvala.
Evo,na svom blogu sam detaljno objasnio Hello world program:
Evo,na svom blogu sam detaljno objasnio Hello world program:
Why all those "enter's"?Because readable C code should expand vertically not horizontally.
Što si s ovime htio reći?
Pa naučit ljude da ne stavljaju sav svoj kod u jednu liniju...
Pa naučit ljude da ne stavljaju sav svoj kod u jednu liniju...
A mogao si ih naučiti i da intedndiraju kôd...
Nevezana primjedba, nakon zareza, točke, uskličnika itd. ide razmak. Nije kao da pišeš SMS pa si ograničen brojem znakova :)
Pa naučit ljude da ne stavljaju sav svoj kod u jednu liniju...
A mogao si ih naučiti i da intedndiraju kôd...
da,ali iz nekog razloga blogspot ne prihvaća tab...Svejedno,nadam se da će ih auto indent naučit.
Topla preporuka - Wordpress...
Topla preporuka - Wordpress...
A neda mi se sad migrirat...Razmišljao sam i o wordpressu,ali ovo nije profi blog.
da,ali iz nekog razloga blogspot ne prihvaća tab...Svejedno,nadam se da će ih auto indent naučit.
Podesi IDE da konvertira tab u razmake. To se ionako tako radi...
...i pliz, koristi razmak nakon #include ;)
Imam par pitanja,pa ako možete odgovoriti:
1.Naime trebam sortirati parne brojeve,a ne znam kako.Vidio sa
da se može sa f/2-(int)f/2==0,ali mi se čini prekomplicirano,ali
generalno mi treba za svaki uvjet kada mi traži da izbacim nešto što je djeljivo
s nekim brojem.
2.Imam zadatak,ispisati:
*
**
***
****
*****
pomoću petlji,ali nisam siguran kako?
Znam kako ispisati * u svakom redu,ali neznam kako
ih postepeno povećati?
Imam par pitanja,pa ako možete odgovoriti:
1.Naime trebam sortirati parne brojeve,a ne znam kako.Vidio sa
da se može sa f/2-(int)f/2==0,ali mi se čini prekomplicirano,ali
generalno mi treba za svaki uvjet kada mi traži da izbacim nešto što je djeljivo
s nekim brojem.
A za sortiranje koristi bubble sort...
2.Imam zadatak,ispisati:
*
**
***
****
*****
pomoću petlji,ali nisam siguran kako?
Znam kako ispisati * u svakom redu,ali neznam kako
ih postepeno povećati?
int x, y, n=1;
for (y=0; y<5; y++)
{
for (x=0; x<n; x++)
{
printf("*");
}
n++;
printf("\n");
}
#include <stdio.h>
void main()
{
int N[15];
int i,temp,j,n;
for(i=0;i<15;i++)
{
printf("Unesite %d. element niza:\n",i+1);
scanf("%d",&N[i]);
}
for(i=0;i<14;i++)
for(j=i+1;j<15;j++)
{
if(N[i]>N[j])
{
temp=N[i];
N[i]=N[j];
N[j]=temp;
}
}
for(i=15;i<15;i--)
{
printf("%d",N[i]);
}
getchar();
getchar();
Hvala za ono.Neznam zašto bubble sort algo ne radi ovdje,
neće da mi razvrsta brojeve?
Pogledaj tu zadnju petlju za ispis. Ta petlja ne ispisuje ništa.
Napravi je ovako:
for(i=0; i<15; i++)
{
ispis
}
Koji sam ja retard lol.
Može mala pomoć, I am stuck.
Inače sve nađem na Google-u ali ovo nikako da shvatim.
Ovo imam:
Prvo, i najbitnije, crasha mi se program radi funkcije statistika_gen, kada obrišem obje for petlje odnosno da funkcija ne radi ništa, nema crasha.
Druga, manje bitna stvar ali svejedno me zanima, zašto dobivam ovaj warning:
test.c:33:6: warning: conflicting types for 'rand_upis' [enabled by default]
test.c:49:6: warning: conflicting types for 'statistika_gen' [enabled by default]
Hvala unaprijed
Ruši ti se jer dobivaš pagefault, pristupaš komadu memorije kojem nemaš pristup. Zašto bi se nešto takvo moglo dogoditi? Hint: zbrljao si sa pokazivačima.
int izvuceni_brojevi[52][7], i, j, statistika[39];
Što su varijable "izvuceni_brojevi" i "statistika"? Pokazivači na prvi element polja.
Pazi sad ovo:
rand_upis( *izvuceni_brojevi );
statistika_gen( *izvuceni_brojevi, *statistika );
Što si ti ovdje napravio? Dereferencirao si pokazivač na prvi element polja, i umjesto adrese polja dobio vrijednost prvog elementa koju si onda proslijedio kao memorijsku adresu polja. Kako polje nije inicijalizirano prvi element ima bog-te-pitaj koju vrijednost.
To jako lagano provjeriš. Ispiši memorijsku adresu polja prije ulaska u funkciju (dakle u mainu), i onda ju ponovno ispiši u nekoj od ovih funkcija, vidjet ćeš da nije isti broj.
test.c:33:6: warning: conflicting types for 'rand_upis' [enabled by default]
test.c:49:6: warning: conflicting types for 'statistika_gen' [enabled by default]
Meni GCC daje 4 poruke:
conflicting types for 'rand_upis'
previous implicit declaration of 'rand_upis' was here
conflicting types for 'statistika_gen'
previous implicit declaration of 'statistika_gen' was here
Ukratko nedostaje ti forward deklaracija funkcija. Jednostavno sam prije maina dodao:
void statistika_gen( int[][], int*);
void rand_upis(int[][]);
I nemoj main definirati kao funkciju koja ne prima argumente. Btw nedostaje ti i return na kraju maina.
Evo, sa ispravcima:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
void statistika_gen( int[][], int*);
void rand_upis(int[][]);
int main() {
srand( time( NULL ) );
int izvuceni_brojevi[52][7]={0}, i, j, statistika[39]={0};
rand_upis( izvuceni_brojevi );
for ( i = 0; i < 52; i++ ) {
for ( j = 0; j < 7; j++ ) {
printf( "%d\n", izvuceni_brojevi[i][j] );
}
}
statistika_gen( izvuceni_brojevi, statistika );
for ( i = 0; i < 39; i++ ) {
printf( "%d\n", statistika[i] );
}
return 0;
}
void rand_upis( int unos[52][7] ) {
int i, j;
for ( i = 0; i < 52; i++ ) {
for ( j = 0; j < 7; j++ ) {
unos[i][j] = rand() % 39 + 1;
}
}
}
void statistika_gen( int unos[52][7], int statistika[39] ) {
int i, j;
// postavi na nulu
//nije potrebno jer u mainu inicijaliziramo na nulu
/*for ( i = 0; i < 39; i++ ) {
statistika[i] = 0;
}*/
for ( i = 0; i < 52; i++ ) {
for ( j = 0; j < 7; j++ ) {
statistika[ unos[i][j] + 1 ] += 1;
}
}
}
Hvala ti puno na objašnjenju i odgovoru.
1.) Da li je zbilja potrebno deklarirati funkcije prije maina? Inače radim samo u PHP-u, ovo je za fax, pa mi ovo ide na živce.
2.) Tvoj kod mi daje sljedeče greške (koristim Geany):
gcc -Wall -c "test.c" (in directory: C:\Users\WPress\Documents\geany)
test.c:6:1: error: array type has incomplete element type
test.c:7:1: error: array type has incomplete element type
test.c: In function 'main':
test.c:12:5: warning: missing braces around initializer [-Wmissing-braces]
test.c:12:5: warning: (near initialization for 'izvuceni_brojevi[0]') [-Wmissing-braces]
test.c:14:5: error: type of formal parameter 1 is incomplete
test.c:22:5: error: type of formal parameter 1 is incomplete
test.c:14: confused by earlier errors, bailing out
Compilation failed.
1.) Da li je zbilja potrebno deklarirati funkcije prije maina? Inače radim samo u PHP-u, ovo je za fax, pa mi ovo ide na živce.
Bitno je da prije maina napišeš prototip funkcije, a ne moraš nužno i definiciju pisati.
Geany nije kompajler, dakle i ti koristiš GCC. Vjerojatno noviju verziju jer je ova moja stara s kojom DevCpp dolazi.
test.c:7:1: error: array type has incomplete element type
Probaj te dvije linije prepraviti u ovo:
void statistika_gen( int[52][7], int*);
void rand_upis(int[52][7]);
test.c:12:5: warning: (near initialization for 'izvuceni_brojevi[0]') [-Wmissing-braces]
int izvuceni_brojevi[52][7]={{0}}, i, j, statistika[39]={{0}};
To je samo warning, ali ok, ipak su dvodimenzionalna polja...
test.c:22:5: error: type of formal parameter 1 is incomplete
test.c:14: confused by earlier errors, bailing out
Compilation failed.
Ovo bi sada trebalo biti pokriveno sa popravkom prototipa.
EDIT: ni GCC 4.6.1 mi ne ne žali zbog onog prvotnog prototipa, ali mi se žalio za zagrade kod incijalizacije polja nakon što sam omogučio sva upozorenja:
gcc.exe "d:\test\statistika.c" -o "d:\test\statistika.exe" -std=gnu99 -Wall -g3
EDIT2: ipak je to do starije verzije kompajlera, 4.6.1 ipak ne voli nepotpune tipove u prototipu. Naime, zbog mog zeza, u IDE-u se nije prebacio kompajler pa sam mislio da kompajliram sa 4.6.1, dok se u stvari kompajliralo sa 3.4.5. Bilo kako bilo, kada maknem random seed, output je isti sa obje verzije koda što će reći da se i "nepravilan slučaj" kompajlirao kako treba.
Da, znam, zaboravih to napomenuti :)
Hvala ti puno, sada kod radi, uf glavobolje s tim poljima, strašno kad dođeš sa php-a :S
Hvala puno!
Opet ja :)
Zanima me kako spojiti dva niza?
Samo teorijski s kojom komandom?
I da,u zadatku mi traži da kod matrice nađem najmanji element glavne,i najveći sporedne dijagonale.
Mislio sam preko bubblesorta,pa ispisat prvi koji je najmanji,ali ne znam kako dijagonalu prebaciti u niz.
Može pomoć?
min = niz[0][0];
for(int i=0; i<n; i++)
{
if(niz[i][i] < min)
min = niz[i][i];
}
Ovo ti je način za glavnu dijagonalu, naime elementi na glavnoj dijagonali niz[i][j] su oni kod kojih je i = j, a n je veličina kvadratne matrice.
Za pomoćnu dijagonalu pokušaj sam. Kao što vidiš tu je sortiranje suvišno i nepotrebno.
Što se tiče pomoćne dijagonale kod elemenata niz[i][j] su oni kojima je i + j = n-1, gdje je n veličina kvadratne matrice. To znači da je isto dovoljna jedna petlja koja provjerava elmente niz[i][n-i-1].
Shvatio sam to za glavnu kako ide,no sporedna je uglavnom [j++][i--],s tim
da je j==max,i==min.
No još me zanima kako spojiti dva niza?
Jer mi je bio zadatak na kolokviju gdje imam dva niza,trebam ih spojiti u jedan i poredati po veličini,znači bubblesort?
Shvatio sam to za glavnu kako ide,no sporedna je uglavnom [j++][i--],s tim
da je j==max,i==min.
No još me zanima kako spojiti dva niza?
Jer mi je bio zadatak na kolokviju gdje imam dva niza,trebam ih spojiti u jedan i poredati po veličini,znači bubblesort?
Deklariraš treći koji ima veličinu zbroja veličina ta dva niza i kroz dvije petlje ga popuniš prvo jednim, pa drugim, a onda sortiraš.
Jel ovo za dijagonalu trebaš za kolokvij isto?
Ma vježbam malo za ispite,pa etom,informiram se na vrijeme :)
Možeš mi samo prototip toga napisati otprilike?
Što se tiče sporedne dijagonale,gledamo sam to nekako ovako uraditi:
if(i==4&&j==1) //u s slucaju da je matrica 4x4
if(niz[i][j]<min_spo)
min_spo=niz[i][j]
i--;
j++;
Veličina kvadratne matrice n je 3X3.
Sve kroz jednu petlju. Prvi if uvjet je minimum glavne dijagonale, a drugi if uvjet je maksimum pomoćne djagonale.
#include <iostream>
using namespace std;
int main()
{
int min, max;
int niz[3][3] = {{3,5,1}, {8, 7, 9}, {2, 4, 5}};
min = niz[0][0];
max = niz[0][2];
for (int i = 1; i < 3; i++)
{
if (niz[i][i]<min)
min = niz[i][i];
if (niz[i][3-i-1]>max)
max = niz[i][3-i-1];
}
cout<< min << " " << max << endl;
return 0;
}
iostream mi je još nepoznat,najdalje što smo mi došli je funkcije,tako da
ne bi smio raditi preko toga..
No hvala svejedno na trudu :)
P.S.Znači ono što sam napisao je točno?
Mislim onaj kod?
P.P.S.Prototip sam mislio za ono spajanje dva niza u jedan,jer mi
nije izvedba krajnje jasna?
P.P.P.S.Zar ono 3-i-1 radi uopće?
iostream mi je još nepoznat,najdalje što smo mi došli je funkcije,tako da
ne bi smio raditi preko toga..
No hvala svejedno na trudu :)
E pa prevedi ovo na C, bitan ti je algoritam, a sintaksu u čistom C napiši, umjesto cout printf, i deklariraj indekse petlje izvan petlje.
Što se tiče spajanja nizova, pogledaj ovdje http://stackoverflow.com/questions/1700182/how-do-i-merge-two-arrays-having-different-values-into-one-array
nemam vremena sad pisati to.
A ono 3-i-1 naravno da radi, ne pišem ja ništa bez veze, lijepo sam ti rekao da kod elementa na sporednoj dijagonali niz[i][j] je suma indeksa i + j = n-1, a to je upravo to.