
Programiranje u C-u - od svega pomalo


Hvala puno za onaj zadatak.. naisao sam na novi problem (ispircavam se ako sam dosadan)..
zadatak:::
Generirati pseudo-sluˇcajni cijeli broj u [50; 1000] te zauzeti dinamiˇcki memoriju za
toliko podataka tipa double. Popuniti dobiveno polje pseudo-sluˇcajnim brojevima
u [0, 1]. Provjeriti i na ekran ispisati odgovaraju´cu poruku nalazi li se u polju
vrijednost 1.
napisao sam kod za program::
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
double *p;
int i, n;
srand((unsigned)time(NULL));
n = 50 + (float)rand() / RAND_MAX * 950;
printf("random broj iz intervala [50,1000] = %.2f \n", n);
p = (double*)malloc(n * sizeof(double));
if (p == NULL)
return 0;
for (i = 0; i < n; i++)
{
p[i] = (double)rand() / RAND_MAX;
}
for (i = 0; i < n; i++)
{
printf("p[%d]=%.2f \n", i, p[i]);
}
for (i = 0; i < n; i++)
{
if (p[i] == 1)
printf("u polju se nalazi vrijednost 1\n");
else printf("vrijednost 1 se ne nalazi u ovom polju\n");
break;
}
free(p);
return 0;
}
greska kada pokrenem program je (pretpostavljam) kod usporedjivanja
if (p[i]==1)
{ ... }
stalno mi ispisuje "broj 1 se ne nalazi u vasem polju" a vise puta sam vidio da se nalazi
moze pomoc?

Hvala puno za onaj zadatak.. naisao sam na novi problem (ispircavam se ako sam dosadan)..
zadatak:::
Generirati pseudo-sluˇcajni cijeli broj u [50; 1000] te zauzeti dinamiˇcki memoriju za
toliko podataka tipa double. Popuniti dobiveno polje pseudo-sluˇcajnim brojevima
u [0, 1]. Provjeriti i na ekran ispisati odgovaraju´cu poruku nalazi li se u polju
vrijednost 1.
napisao sam kod za program::
.
.
.
greska kada pokrenem program je (pretpostavljam) kod usporedjivanja
if (p[i]==1)
{ ... }
stalno mi ispisuje "broj 1 se ne nalazi u vasem polju" a vise puta sam vidio da se nalazi
moze pomoc?
if (p[i] == 1)
printf("u polju se nalazi vrijednost 1\n");
else printf("vrijednost 1 se ne nalazi u ovom polju\n");
break;
provjerava ti samo prvi clan
ude u petlju, provjeri da li je 1, ako ne ispise da nije i prekine petlju
bit ce ti jasnije ako si u istu petlju stavis da ti ispisuje brojeve:
evo:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
double *p;
int i, n;
srand((unsigned)time(NULL));
n = 50 + (float)rand() / RAND_MAX * 950;
printf("random broj iz intervala [50,1000] = %.2f \n", n);
p = (double*)malloc(n * sizeof(double));
if (p == NULL)
return 0;
for (i = 0; i < n; i++)
{
p[i] = (double)rand() / RAND_MAX;
}
for (i = 0; i < n; i++)
{
}
for (i = 0; i < n; i++)
{
if (p[i] == 1){
printf("u polju se nalazi vrijednost 1\n");
free(p);
return 0;
}
else {
printf("p[%d]=%.2f \n", i, p[i]);
}
}
printf("vrijednost 1 se ne nalazi u ovom polju\n");
free(p);
return 0;
}
s druge strane, ne uspijevam dobit 1 no kasno je da sad to isprobavam :S

Na objektno orijentiranom programiranju profesor je spominjao virtualnu i fizičku memoriju, te kako malloc radi (odnosno kako upravlja memorijom), sve usputno
Gdje mogu naučiti više o tim stvarima?
Na operacijskim sustavima? Mislim da se pri kraju predmeta radi nešto vezano za to (strategije dodjele memorije i sl.).
Mislim da je to dio ASP-a(Algoritni i strukture podataka)

Jel netko može pronaći grešku u ovom programu ?
#include<stdio.h>
#include<stdlib.h>
void upisi(int x[10])
{
int i;
randomize();
for(i=0;i<100;i++)
x[i]=random(1000)-500;
}
void sortiraj(int x[100])
{
int pom,i,j;
for(i=0;i<99;i++)
for(j=i+1;j<100;j++)
if(x[j]<x[i])
{
pom=x[i];
x[i]=x[j];
x[j]=pom;
}
}
void ispisi(int x[100])
{
int i;
for(i=0;i<100;i++)
printf("%d\t",x[i]);
}
void main()
{
int a[100];
upisi(a);
printf("\n nesortirano polje je: \n");
ispisi(a);
sortiraj(a);
printf("\n sortirano polje je \n");
ispisi(a);
getch();
}

Jel netko može pronaći grešku u ovom programu ?
Citiram samo zbog poboljšanja čitljivosti kada se već uporno odbija koristiti odgovarajući format teksta:
#include<stdio.h>
#include<stdlib.h>
void upisi(int x[10])
{
int i;
randomize();
for(i=0;i<100;i++)
x[i]=random(1000)-500;
}
void sortiraj(int x[100])
{
int pom,i,j;
for(i=0;i<99;i++)
for(j=i+1;j<100;j++)
if(x[j]<x[i])
{
pom=x[i];
x[i]=x[j];
x[j]=pom;
}
}
void ispisi(int x[100])
{
int i;
for(i=0;i<100;i++)
printf("%dt",x[i]);
}
void main()
{
int a[100];
upisi(a);
printf("n nesortirano polje je: n");
ispisi(a);
sortiraj(a);
printf("n sortirano polje je n");
ispisi(a);
getch();
}

Moze li netko pronaći grešku u programu.

Jel netko može pronaći grešku u ovom programu ?
Evo napisao sam ti komentare u programu, ono što je po meni krivo.
#include<stdio.h>
#include<stdlib.h>
void upisi(int x[10]) //deklarirao si polje od 10 elemenata i onda ga poslje puniš do 100 elemenata?!
{
int i;
randomize(); //ovo ne postoji u c-u, možeš koristiti srand sa vremenom
for(i=0;i<100;i++) //polje deklarirano do 10, a puniš ga do 100?!
x[i]=random(1000)-500; //također ne postoji koristi rand
}
void sortiraj(int x[100])
{
int pom,i,j;
for(i=0;i<99;i++)
for(j=i+1;j<100;j++)
if(x[j]<x[i])
{
pom=x[i];
x[i]=x[j];
x[j]=pom;
}
}
void ispisi(int x[100])
{
int i;
for(i=0;i<100;i++)
printf("%dt",x[i]); //ne znam što bi trebalo značiti %dt -> samo %d\n
void main()
{
int a[100];
upisi(a);
printf("n nesortirano polje je: n"); //ne razumijem što bi ovo trebalo značiti
ispisi(a);
sortiraj(a);
printf("n sortirano polje je n"); //ne razumijem što bi ovo trebalo značiti
ispisi(a);
getch(); //ovo ti ne treba
}
Koji IDE koristiš?

Oprostite,znam da je ovo offtopic ali ne znam u koju temu da se javim.
Naime idem na županijsko natjecanje iz inf za tjedan dana,te ne razumijem kako riješiti sljedeći algoritam:

Oprostite,znam da je ovo offtopic ali ne znam u koju temu da se javim.
Naime idem na županijsko natjecanje iz inf za tjedan dana,te ne razumijem kako riješiti sljedeći algoritam:
zbrajaš samo djelitelje tipa:
A. zbroj = 1
B. zbroj = 1+2+4 = 7
C. zbroj = 1+2+4+7+14 = 28
D. zbroj = 1+2+4+8+16+32+64=127
Tako da c je točan

Oprostite,znam da je ovo offtopic ali ne znam u koju temu da se javim.
Naime idem na županijsko natjecanje iz inf za tjedan dana,te ne razumijem kako riješiti sljedeći algoritam:
zbrajaš samo djelitelje tipa:
A. zbroj = 1
B. zbroj = 1+2+4 = 7
C. zbroj = 1+2+4+7+14 = 28
D. zbroj = 1+2+4+8+16+32+64=127
Tako da c je točan
Hvala ali možeš li mi objasniti na koji način si izvukao postupak.Algoritmi mi baš i ne idu

Pa ako je k broj, zbrojiš sve djeljitelje broja k osim njega samog.
Druga linija koda znači uzmi raspon od 1 do k-1
Treća linija koda znači uzmi djeljitelje
Četvrta linija koda znači zbroji djeljitelje

Pa kako da ja znam koliki je raspon od 1 do k-1.
I sto je tocno i?

Pa kako da ja znam koliki je raspon od 1 do k-1.
I sto je tocno i?
Evo ti code da se više ne zayebavaš , ako nije što jasno pitaj.
#include <stdio.h>
#include <string.h>
void check(int k) {
char res[2];
int zbroj = 0;
for(int i=1 ; i<(k-1) ; ++i){
if((k%i) == 0) {
zbroj = zbroj+i;
}
}
if (zbroj == k) {
strcpy(res , "da");
} else {
strcpy(res , "ne");
}
printf("%s\n" , res);
}
int main()
{
check(2);
check(8);
check(28);
check(128);
return 0;
}

Pa kako da ja znam koliki je raspon od 1 do k-1.
I sto je tocno i?
i je brojač u toj petlji koji ide do k-1, a ujedno ti i služi kao djelitelj. Ti moraš naći sve djelitelje tih zadanih brojeva osim početnog broja jer imaš do k-1, i zbrojiti ih. To je to.

Koristim Dev c++. Jel možeš napisati točan kod ako imaš vremena, jer ne razumijem baš sve.

Koristim Dev c++. Jel možeš napisati točan kod ako imaš vremena, jer ne razumijem baš sve.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
void upisi(int x[100])
{
int i;
srand(time(NULL));
for(i=0;i<100;i++)
x[i]=rand() % 1000;
}
void sortiraj(int x[100])
{
int pom,i,j;
for(i=0;i<99;i++)
for(j=i+1;j<100;j++)
if(x[j]<x[i])
{
pom=x[i];
x[i]=x[j];
x[j]=pom;
}
}
void ispisi(int x[100])
{
int i;
for(i=0;i<100;i++)
printf("%d.: %d\n",i+1, x[i]);
}
int main()
{
int a[100];
upisi(a);
printf("\nnesortirano polje je:\n");
ispisi(a);
sortiraj(a);
printf("\nsortirano polje je:\n");
ispisi(a);
getch();
return 0;
}
Evo izvoli
stavio sam da generira random brojeve do 1000.

U biti onaj kod gdje kao argument funkcije upis deklarira polje od 10 elemenata radi. U funkciju upis prenosimo pokazivac na prvi element niza X iz main funkcije, a ostalo napravi aritmetika pokazivaca.
Zato kao argument funkcije deklariramo pokazivac umjesto niza ili niz bez broja elemenata.

Pa kako da ja znam koliki je raspon od 1 do k-1.
I sto je tocno i?
Na koje ti natjecanje tocno ides, informatike ili filozofije.
Ako iz pseudo koda ne znas procitati da je k broj koji unosis a iz petlje ne znas vidjeti da je i index petlje a od 1 do k - i raspon petlje, o cemu mi onda govorimo.
Covjek ti je cisto solidno objasnio rad algoritma, a petlje i grananja moras nauciti sam iz bilo kojeg izvora, skola, repeticije, knjiga, tutorijali na netu, to ti ovdje nitko nece objasnjavati.

U biti onaj kod gdje kao argument funkcije upis deklarira polje od 10 elemenata radi. U funkciju upis prenosimo pokazivac na prvi element niza X iz main funkcije, a ostalo napravi aritmetika pokazivaca.
Zato kao argument funkcije deklariramo pokazivac umjesto niza ili niz bez broja elemenata.
Aha znači apsolutno je svejedno što se deklarira. E super
Nego, imam problema sa razumijevanjem pokazivača na polje pokazivača. Recimo:
char *a[5];
char **b = &a;
//na što sada pokazuje pokazivač b(pretpostavimo da je u svakom a[i] nekakav string); kako alocirati memoriju za takvo polje i kako ga prenijeti u funkciju

U biti onaj kod gdje kao argument funkcije upis deklarira polje od 10 elemenata radi. U funkciju upis prenosimo pokazivac na prvi element niza X iz main funkcije, a ostalo napravi aritmetika pokazivaca.
Zato kao argument funkcije deklariramo pokazivac umjesto niza ili niz bez broja elemenata.
Aha znači apsolutno je svejedno što se deklarira. E super
Nego, imam problema sa razumijevanjem pokazivača na polje pokazivača. Recimo:
char *a[5];
char **b = &a;
//na što sada pokazuje pokazivač b(pretpostavimo da je u svakom a[i] nekakav string); kako alocirati memoriju za takvo polje i kako ga prenijeti u funkciju
To je prijenos 2D polja.
Naravno, treba staviti i dealokaciju nizova, ne da mi se sad to raditi, onda bi trebao strcpy koristiti kad inicijaliziram nizove.
#include<stdio.h>
#include<stdlib.h>
void ispis(char** a)
{
for (int i = 0; i < 2; i++)
printf("%s\n", *(a+i));
}
int main()
{
char** a;
a = new char*[10];
for (int i = 0; i < 10; i++)
*(a+i) = new char[10];
a[0] = "abc";
a[1] = "def";
ispis(a);
return 0;
}

Moze mala pomoc, sortiranje vezane liste, jel moze neko objasnit di grijesim.
Greska je sto samo mijenjem na sto pokazuju pokazivaci ne mijenjam stvarne adrese, jel ima neko alg za promjenu adresa ili i zamjena podataka ok ?

Pitanje, koliko bajta memorije se zauzima izvršavanjem naredbe: float *p = (float *)malloc(5 + 10 * sizeof(float)); (float je 4 bajta)
Može mi netko reći po čemu zaključim koliko to zauzima. sizeof je ovaj operator kojim je postavljen float i 15 puta ga očito množi? Nije li onda 60 bajta memorije overall.

Pitanje, koliko bajta memorije se zauzima izvršavanjem naredbe: float *p = (float *)malloc(5 + 10 * sizeof(float)); (float je 4 bajta)
Može mi netko reći po čemu zaključim koliko to zauzima. sizeof je ovaj operator kojim je postavljen float i 15 puta ga očito množi? Nije li onda 60 bajta memorije overall.
Nije,
//5 +(10* 4 ) = 45
float *p = (float *)malloc(5 + 10 * sizeof(float));
Množenje ima prednost nad zbrajanjem.

Može mi netko reći po čemu zaključim koliko to zauzima.
printf("%d", 5 + 10 * sizeof(float));

Moze mala pomoc, sortiranje vezane liste, jel moze neko objasnit di grijesim.
Greska je sto samo mijenjem na sto pokazuju pokazivaci ne mijenjam stvarne adrese, jel ima neko alg za promjenu adresa ili i zamjena podataka ok ?
Adrese pokazivaca mozemo promjeniti jedino preko preko dvostrukih pokazivaca, a ovdje jos imamo izmjenu next pokazivaca noda kao dodatan posao.
U primjeru sam uzeo sentiel node kao prvi da olaksam posao, to je onaj kojeg ne koristimo. Sljedeca dva noda sam zamjenio, najprije isprintao listu prije zamjene dva noda, a zatim poslije zamjene. Da bolje predocim stvari isprintao sam i adrese pokazivaca.
void print(node* start)
{
while (start != NULL)
{
printf(" %d %p", start->broj, start);
start = start->next;
}
printf("\n");
}
int main()
{
node* start = (node*)malloc(sizeof(node));
node* prvi = (node*)malloc(sizeof(node));
node* drugi = (node*)malloc(sizeof(node));
start->broj = 0;
start->next = prvi;
prvi->broj = 8;
prvi->next = drugi;
drugi->broj = 5;
drugi->next = NULL;
node* temp;
node** k = &start; // uzimamo adresu start pokazivaca u dvostruki pokazivac k
node** l;
print(start);
k = &(*k)->next; // dvostruki pokazivac k pomice adresu na node prvi
l = &(*k)->next; // dvostruki pokazivac l pokazuje na node drugi
temp = *k; // mijenjamo adrese pokazivaca
*k = *l;
*l = temp;
temp = (*k)->next; // mijenjamo next pokazivace
(*k)->next = (*l)->next;
(*l)->next = temp;
print(start);
free(start);
free(prvi);
free(drugi);
return 0;
}

imam jedno pitanjce. zna netko brzinski alogritam kako doći do elemenata iznad i ispod presjeka glavne i sporedne dijagonale unutar matrice (2D polja) u c-u. postoji li mogućnost ugnjezditi četiri petlje for jednu unutar druge? moja pretpostavka da ne, jer budem opet tražil po čitavom području ispod ili iznad jedne dijagonale, pa mi program tu radi nepotreban višak koraka, zar ne
složil sam ovak nešto za elemente
ispod sporedne:
for (i = 0; i < n; i++)
for (j = i + 1; j < n; j++)
iznad sporedne:
for (i = 0; i < n; i++)
for (j = 0; j < n - i - 1; j++)
ispod glavne:
for (i = 0; i < n; i++)
for (j = 0; j < i; j++)
iznad glavne:
for (i = 0; i < n - 1; i++)
for (j = 1 + i; j < n; j++)
znači ciljano mi treba presijek iznad i ispod jedne i druge dijagonale 2d polja, malo mi je overload

Najlakse ti je kad si nacrtas sliku na papir i oznacis kriticne tocke.
ajmo reci da je x ono sto trebas, gledamo presjek iznad glavne i sporedne dijagonale(dijagonale ukljucene):
1 1 1 1 1
0 1 1 1 0
0 0 1 0 0 -n/2
0 0 0 0 0
0 0 0 0 0
|
n/2
Znaci krecemo razmisljati logicki i vidimo da prva petlja mora do n/2
E, sad gledamo kako doci uz najmanje koraka do svih brojeva:
Zakljucujemo da u svakom redu krecemo od i, a stajemo na n-i
Iz toga dobivamo :
for(i=0;i<=n/2;i++){
for(j=i;j<n-i;j++){
}
}
Takoder imaj na umu da mozes koristiti i i--
Tako da onda za presjek ispod koristis obrnutu logiku:
for(i=n:i>n/2;i--){
for(j=n-i;j<i;j++){
}
}

hvala na ideji, ovo mi daje malo drugačiju sliku na polje, svakako plus. samo, nije li presijek isključivo sve iznad 'točke' sjecišta dijagonala, bez dijagonala (elementi koji su iznad odnosno ispod obje dijagonale polja)
dakle ako je 2D polje primjerice 5x5, traženi elementi x(iznad presjeka glavne i sporedne) i y(ispod):
0 x x x 0
0 0 x 0 0
0 0 0 0 0
0 0 y 0 0
0 y y y 0
masnim označene dijagonale
ili preglednije, u polju 3x3
0 x 0
0 0 0
0 y 0
4x4
0 x x 0
0 00 0
0 00 0
0 y y 0
možda griješim, ispravite me
postupkom
for (i = 0; i <= n / 2; i++)
for (j = i; j < n - i; j++)
dolazim do ovoga:
x x x x x
0 x x x 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

A gle, sad s matematicke strane ovisi kakve su zagrade, to moras pitati onog tko ti je postavio zadatak, ali u tom slucaju samo promjenis u for-u samo za +1 pocetak reda i za -1kraj i brojis 1 red manje.
EDIT:
probaj:
for(i=0;i<(n/2);i++){
for(j=i+1;j<n-i-1;j++){
//mozda je i krivo, nemam bas vremena analizirati
}
}
Trebao bih pomoc u jednom programu (za fax):
zadatak kaze:::
Napisati funkciju koja raˇcuna zbroj dva vektora predstavljena poljima realnih
brojeva (uzeti u obzir kako oba polja moraju biti iste veliˇcine). Funkcija kao rezultat
vra´ca polje koje je rezultat zbrajanja. Na primjeru u main() funkciji pokazati
uporabu napisane funkcije. Za sva polja dinamiˇcki zauzeti potrebnu memoriju.
Za pocetak, zadatak ti kaze realnih, a ti si koristio cijele brojeve pa je to trebalo ispravit, takodjer kad pasteas na forum koristi fromate za kod, ako se radi o kodu.
inace, ovo bi trebalo biti rijesenje
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
float *rezVektor (float *a, float *b, float *c, int n){
int i;
for (i = 0; i<n; i++) {
*(c + i) = *(a + i) + *(b + i);
}
return c;
}
int main() {
int i, n;
float *a, *b, *c;
printf("kolika je dimenzija vaseg vektora? \n");
scanf("%d", &n);
a = (float *)malloc(n * sizeof(float));
b = (float *)malloc(n * sizeof(float));
c = (float *)malloc(n * sizeof(float));
printf("unesite elemente prvog vektora...\n");
for (i = 0; i<n; i++)
{
printf("%d. element: ", i + 1);
scanf("%f", a + i);
}
//rezVektor(a);
printf("unesite elemente drugog vektora...\n");
for (i = 0; i<n; i++)
{
printf("%d. element; ", i + 1);
scanf("%f", b + i);
}
c = rezVektor(a, b, c, n);
for (i = 0; i<n; i++) {
*(c + i) = *(a + i) + *(b + i);
}
printf("rezultantni vektor je..\n");
for (i = 0; i<n; i++) {
printf("%.2f. element: %d\n", i + 1, *(c + i));
}
free(a);
free(b);
free(c);
return 0;
}
Ako ti sta nije jasno pitaj