Programiranje u C-u - od svega pomalo
- poruka: 1.661
- |
- čitano: 386.995
- |
- moderatori:
Lazarus Long, XXX-Man, vincimus
- +/- sve poruke
- ravni prikaz
- starije poruke gore
ček evo tebi kako glasi zadatak pa mi onda uz pomoć mojeg source-a ispravi greške (poboldano da vidim što je mijenjano)
Izmjeniti program da ispisuje unaprijed (od prvog slova prema zadnjem)
Bitno mi je da shvatim ovo poboldano kako riješiti (preko nekih primjera kao što je TracerCPP pokazao)
Samo zamijenis pocetak i kraj:
Popravljen programčić sa pozivom funkcije rewind(f) (može i fseek(f, 0, SEEK_SET), svejedno) netom prije poziva fgets-a.
Pa ja sam putsu cijelo vrijeme predavao NULL pointer Pomogla mi ekipa sa Stack Overflowa - unutar tri minute odgovor, sweet jesus.
Da li to podcjenjujes lokalnu ekipu, a? :P
Ma tamo su strucnjaci, kada imam neki problem/pitanje ne moram ni postavljati jer je neko to vec postavio sigurno.
Da li to podcjenjujes lokalnu ekipu, a? :P
Ma tamo su strucnjaci, kada imam neki problem/pitanje ne moram ni postavljati jer je neko to vec postavio sigurno.
Ma Bože sačuvaj da ih podcjenjujem, daleko od toga, nego svi preporučuju SO pa sam eto tamo otišao kada se nisam nikako mogao sam dosjetiti rješenja.
Sada mi samo ostaje misterij kako ovaj kod radi na borlandovom compileru (ili kojeg već koristi c++ Builder) - valjda je dovoljno pametan pa zna da treba kursor vratiti na početak filea, ne znam. Moguće je i da ignorira non-ASCII charactere u stdoutu, ma nije to sad ni toliko bitno.
Inače, vidi se da Tracer zna, tu se nema što reći. Samo što je na Stacku takvih more pa prije dobiješ odgovor.
Zanimljivo... Kao što sam rekao, kod mene u C++ Builderu sve radi tako da stvarno ne znam zašto kod tebe treba raditi te dodatne izmjene. No svejedno, bitno da si našao odgovor .
I inače, slažem se. SO je odlično mjesto. Mnoštvo stručnjaka i ljudi koji se profesionalno bave programiranjem.
Tracer je stručnjak, profesor je, a čovjek je od prakse, kud ćeš bolje. :D
kod mene u C++ Builderu sve radi
Takav sam problem, sličan mislim, imao sa starim MS-ovim C kompajlerom ili koji je već bio sa Visual C-om, živce mi je odnosilo, koji mi je đavo bio da nisam koristio MinGW, ne znam...
MS compiler ima stvarno nekih čudnih stvari u sebi. Sjećam se još prije da je točno određena kombinacija printf-a i scanf-a izazivala resetiranje računala svaki put kad se program izvrši.
Nego,pitanje...kako u printf stavit hrvatske znakove sa palatalima?
setlocale(LC_ALL, "croatian" );
printf("%s", "šđč枊ĐČĆŽ");
Ovako nešto se sjećam da mi je radilo pod linuxom, no sad pod windowsima neće..
setlocale(LC_ALL, "croatian" );
printf("%s", "šđč枊ĐČĆŽ");
Ovako nešto se sjećam da mi je radilo pod linuxom, no sad pod windowsima neće..
Mislim da to ovisi o OS-u, tj. OS-ovim localeovima, mozda ima neka dodatna fora pod Winsima. Mozda wprintf?
Da. U tome je trik
setlocale(LC_ALL, "croatian" );
wprintf(L"šđč枊ĐČĆŽ\n");
Nego,pitanje...kako u printf stavit hrvatske znakove sa palatalima?
I nemoj zaboraviti dodati <locale.h> header ako se ne varam.
Pozdrav, zadatak glasi: Pomoću tipkovnice upiši za 5 učenika njihovu tjelesnu težinu i neka program izračuna njihov prosjek.
Do ovdje sam došao:
Deklariraj jednu varijablu tipa float , nazovi je npr. ukupnaTezina i inicijaliziraj je na nula.
Kroz petlju u kojoj unosiš težinu za sve učenike pribroji unesene pojedinačne težine učenika toj varijabli:
ukupnaTezina += tezinaUcenika;
Kad izađeš iz petlje, odnosno završiš unose težine svih učenika, rezultat ti je ovdje: ukupnaTezina/brojUcenika
Uploadao sam vježbe iz C-a i (većinom) moja rješenja za njih. Fali par zadataka, no skoro sve je tu.
Dosta je dobra pokrivenost gradivom, ima težih i lakših zadataka - dobri su za početnike, imho.
Rješenja su u .docx-u jer .pdf ne pamti identaciju.
Tko želi, neka slobodno skine i pogleda.
Uploadao sam vježbe iz C-a i (većinom) moja rješenja za njih. Fali par zadataka, no skoro sve je tu.
Dosta je dobra pokrivenost gradivom, ima težih i lakših zadataka - dobri su za početnike, imho.
Rješenja su u .docx-u jer .pdf ne pamti identaciju.
Tko želi, neka slobodno skine i pogleda.
Lijepo, ali samo jedna opaska. Ne znam s cim si ti to exportao u PDF, ali meni s LibreOffice-ovim Writerom sasvim uredno exporta kod u PDF.
Imaj na umu da nemaju svi MSO (osobno im ne dam novce za njega, a neki si i ne mogu priustiti). Ali ajde, LO ovo lijepo otvara, nema artefakata, pa u redu onda.
Nemoj koristiti nase znakove kod imenovanja direktorija/datoteka, jer se onda dogodi ovo:
i ovo Kod izgleda lijepo
Najbolje od svega je, sto si puno naucio na ovaj nacin, samo nastavi ;)
Nisam se sjetio palatala, uzeo sam zdravo za gotovo da su svi na Windozama, a što se može
Ovo je dobar savjet za .h i .c fajlove, mada ne vidim koji je problem C/P-ati source drito u text editor IDE-a kojeg se koristi. Isto tako, u .docx-u se odmah vidi syntax highlighting što je prednost.
Od 10. vježbe nadalje je dijeljeno na fajlove tako da se vidi gdje što pripada.
Što se tiče izgleda, koristim se Allmanom, K & R mi je podosta teži za pročitati iako je puno kompaktniji. Stvar ukusa, valjda.
Komentare baš i nemam običaj pisati, ali ako krenem ozbiljnije s programiranjem očito ću morati.
Kod ovih zadačića uglavnom nisu ni potrebni osim nešto malo kod stringova, imho.
Pozdrav.
Možete mi pomoći oko jednog problemčeka. Naime sad sam kao programski zadatak dobio ovo:
Napišite program koji u unosu s tipkovnice prima početni i krajnji broj niza iz kojeg
se ispisuju svi parni brojevi u rastućem redoslijedu (od najmanjeg prema najvećem), razdvojeni
razmakom (SPACE).
Ispišite i početni i/ili krajnji broj ako su i oni parni. Početni i krajnji broj moraju
biti cijeli, pozitivni i manji od 100. (neobavezno)
Unos i ispis možete prilagoditi i uljepšati prema izboru, dani primjeri samo pokazuju
funkcionalnost programa.
Primjer:
unos: 12 23
ispis: 12 14 16 18 20 22
Primjer:
unos: 1 8
ispis: 2 4 6 8
Dobro sam izveo for petlju i if petlju, no problem je kako da napravim deklaraciju parnih brojeva i kako da ih ispišem (tu je najveći problem).
Source kod sa trenutnim stanjem:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
int main(){
int i, a, b, c=0, d=0;
printf ("Upisi dva broja odvojena razmakom: ");
scanf("%d %d", &a, &b);
if (b>a) {
for(i=a;i<=b;i++){
if(a%3==1 || b%2==0){
a=c;
b=d;
printf("%d %d ",c,d);
}
}
}
return 0;
}
Molim za pomoć. Hvala
Radi kako treba, čini mi se, iako se valjda može i bez pomoćnih varijabli - samo mi se nije dalo, ipak je skoro 3 ujutro
Izbor izlaska iz programa riješen je sa stringovima, čisto iz zayebancije - tu ti je dosta int (ili nešto slično) pa izlazak s 0 i nastavak sa ostalim.
// Zadatak
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main()
{
int prvi, drugi, min, max;
int i;
char buf[16];
puts("Traze se brojevi u intervalu - [0, 100]");
do
{
printf("Unesite dva broja: ");
scanf("%d %d", &prvi, &drugi);
if((prvi < 0 || prvi > 100) || (drugi < 0 || drugi > 100))
{
puts("Niste unijeli brojeve u trazenom intervalu!\n");
continue;
}
if(drugi > prvi)
{
max = drugi;
min = prvi;
}
else
{
max = prvi;
min = drugi;
}
if(min % 2 == 1)
min++;
for(i = min; i <= max; i += 2)
printf("%d ", i);
printf("\nZelite li izaci iz programa? ");
scanf("%s", buf);
for(i = 0; buf[i]; ++i)
buf[i] = tolower(buf[i]);
if(strcmp(buf, "da") == 0)
break;
putchar('\n');
}
while(1);
putchar('\n');
return 0;
}
Možemo ići i sa samo dvije varijable, da one zamjene vrijednosti ako je prva veća od druge. Inače se obično jedna pomoćna varijabla uvodi u igru kod zamjene vrijednosti dvije varijable.
A onda kroz petlju ići na ispis na gornji način.
#include <cstdio>
int main()
{
int prvi, drugi;
scanf("%d %d", &prvi, &drugi);
if (prvi>drugi)
{
prvi += drugi;
drugi = prvi - drugi;
prvi -= drugi;
}
if (prvi%2)
prvi++;
for (int i = prvi; i <= drugi; i+=2)
printf("%d ", i);
return 0;
}
Radi kako treba, čini mi se, iako se valjda može i bez pomoćnih varijabli - samo mi se nije dalo, ipak je skoro 3 ujutro
Izbor izlaska iz programa riješen je sa stringovima, čisto iz zayebancije - tu ti je dosta int (ili nešto slično) pa izlazak s 0 i nastavak sa ostalim.
// Zadatak
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main()
{
int prvi, drugi, min, max;
int i;
char buf[16];
puts("Traze se brojevi u intervalu - [0, 100]");
do
{
printf("Unesite dva broja: ");
scanf("%d %d", &prvi, &drugi);
if((prvi < 0 || prvi > 100) || (drugi < 0 || drugi > 100))
{
puts("Niste unijeli brojeve u trazenom intervalu!\n");
continue;
}
if(drugi > prvi)
{
max = drugi;
min = prvi;
}
else
{
max = prvi;
min = drugi;
}
if(min % 2 == 1)
min++;
for(i = min; i <= max; i += 2)
printf("%d ", i);
printf("\nZelite li izaci iz programa? ");
scanf("%s", buf);
for(i = 0; buf[i]; ++i)
buf[i] = tolower(buf[i]);
if(strcmp(buf, "da") == 0)
break;
putchar('\n');
}
while(1);
putchar('\n');
return 0;
}
Možemo ići i sa samo dvije varijable, da one zamjene vrijednosti ako je prva veća od druge.
A onda kroz petlju ići na ispis na gornji način.
#include <cstdio>
int main()
{
int prvi, drugi;
scanf("%d %d", &prvi, &drugi);
if (prvi>drugi)
{
prvi += drugi;
drugi = prvi - drugi;
prvi -= drugi;
}
if (prvi%2)
prvi++;
for (int i = prvi; i <= drugi; i+=2)
printf("%d ", i);
return 0;
}
Hvala vam obojici na pomoći :) Riješio sam ga na prvi način (da se vidi "trud" i ideja zadatka).
if(drugi > prvi)
{
max = drugi;
min = prvi;
}
else
{
max = prvi;
min = drugi;
}
Ovo bode oči, nema smisla to raditi, onda radije unesi prvi i drugi i zamjeni im vrijednosti pomoćnom varijablom ukoliko je prva veća od druge.
if(drugi > prvi)
{
max = drugi;
min = prvi;
}
else
{
max = prvi;
min = drugi;
}
Ovo bode oči, nema smisla to raditi, onda radije unesi prvi i drugi i zamjeni im vrijednosti pomoćnom varijablom ukoliko je prva veća od druge.
Ma radio sam to u pola tri ujutro, sad vidim da je glupost
Ma radio sam to u pola tri ujutro, sad vidim da je glupost
Ma i nije glupost, nego jedan od načina od, tu i jesmo sa stavimo više načina, pa nešto i naučimo, nekad ja od tebe i drugih, nekad ti i drugi od mene i tako u krug
Konačno, pitanje je bil se i ja sjetio petlje napravljene na taj način ili bi išao sa provjerom parnih, to si super napravio.
pozdrav ..
kako da napravim funkciju koja određuje maksimalni broj u polju ,znaci u funkciju trebam "poslat" sve brojeve iz polja i kao output da dobijem maksimalni broj ,pa ak netko moze pripomoc barem sa idejom jer ja je nemam kak da to napravim
kod niza kao npr: int mojNiz[MAX] pristupom na mojNiz bez uglatih zagrada dobiješ početnu adresu niza. Dakle to prosljedi funkciji koja ce izgledati otprilike ovako
int maxBroj(int prosljedjeniNiz[], int brojClanova)
Dakle imaš funkcioju koja prima dva argumenta, prosljedjeni niz i broj clanova u nizu koji ce ti trebati da odvrtis petlju kroz niz.
funkciju pozivas iz main()
int main()
{
...
maxBroj(mojNiz, MAX);
...
a u funkciji sa for petljom prodji kroz niz i u svakom koraku provjeri da li je broj veci od proslog (koristi dodatnu varijablu) te ako je stavi taj za daljnju usporedbu. Na kraju kada izadjes iz petlje vrati broj koji ti je ostao.
Evo samo nakuckas kod :)
Kako zadati matricu preko jednodimenzionalnog niza u C-u ?
Za dvodimenzionalni niz je lako. Evo primjera:
# include <stdio.h>
void main()
{
int i,j;
int x[4][4] = {{7,9,3,4},{5,8,7,-8},{3,-1,1,2},{3,-4,5,-6}};
for (i=0;i<4;i++){
for (j=0;j<4;j++){
printf("%d \t",x[i][j]);
}
printf("\n");
}
}
To bi mi ispisalo matricu koja izgleda ovako:
7 9 3 4
5 8 7 -8
3 -1 1 2
3 -4 5 -6
E sad mene zanima kako to mogu napraviti korištenjem jednodimenzionalnog niza.
Kako zadati matricu preko jednodimenzionalnog niza u C-u ?
7 9 3 4
5 8 7 -8
3 -1 1 2
3 -4 5 -6
E sad mene zanima kako to mogu napraviti korištenjem jednodimenzionalnog niza.
Jednostavno. Kako su podaci slozeni u memoriji? Kao matrica ili sekvencijalno? Kad se sve konacno iskompajlira i program ucita u memoriju, sve matrice su ti ovako i onako sekvencijalno slozene u memoriji, ovaj prikaz u kodu kao 2D array je tu samo da bi programeru bilo lakse. Dakle ova tvoja matrica bi u memoriji bila: 7 9 3 4 | 5 8 7 -8 | 3 -1 1 2 | 3 -4 5 -6 gdje sam ti sa znakom | odvojio retke dok je u memoriji to poslozeno tako sekvencijalno. Jel vec mozda vidis rjesenje?
Ako ne, citaj dalje. Kolika je ukupna velicina neke n x m matrice? Upravo n puta m. Dakle, ako zelis matricu prikazati preko 1D arraya, za njega trebas alocirati upravo n puta m elemenata. U tvojem primjeru bi to bilo 4x4 = 16. To znaci da moras alocirati polje velicine 16. E sad malo jednostavne matematike za setanje po matrici. Mozes odabrati dva nacina: da seces po stupcima (znaci, odaberes prvi stupac, pa po njemu ides prema dolje, kad dodes do kraja skocis u drugi stupac itd. - to je column-major order) ili da seces po retcima (kako je i uobicajeno, koliko znam, vecina C-like jezika koriste ovakav prolazak po matrici (izuzetak su eventualno MATLAB, Octave, Fortran i sl.) - to se zove row-major order).
Ilustrirat cu ti row-major order zato jer se on u vecini slucajeva i upotrebljava, za vjezbu mozes probati implementirati column-major order.
Dakle, da dodemo do elementa A[i][j] koristimo jednostavnu algebarsku formulu: elementi,j = i*m + j gdje su i i j indeksi elementa kojem zelimo pristupiti, a m je broj stupaca, tj. sirina matrice. Recimo za A[1][3] u tvojoj matrici (broj -8) dobijemo 1*4 + 3 = 7, sad kad tu matricu poredamo sekvencijalno: 7 9 3 4 | 5 8 7 -8 | 3 -1 1 2 | 3 -4 5 -6 vidimo da je -8 uistinu na indeksu 7 1D arraya (brojanje krece od 0).
Mozes si skicirati na papiru, lakse ce ti biti za shvatiti, a mozes iz te skice i sam doci do te formule.
Kako zadati matricu preko jednodimenzionalnog niza u C-u ?
7 9 3 4
5 8 7 -8
3 -1 1 2
3 -4 5 -6
E sad mene zanima kako to mogu napraviti korištenjem jednodimenzionalnog niza.
Jednostavno. Kako su podaci slozeni u memoriji? Kao matrica ili sekvencijalno? Kad se sve konacno iskompajlira i program ucita u memoriju, sve matrice su ti ovako i onako sekvencijalno slozene u memoriji, ovaj prikaz u kodu kao 2D array je tu samo da bi programeru bilo lakse. Dakle ova tvoja matrica bi u memoriji bila: 7 9 3 4 | 5 8 7 -8 | 3 -1 1 2 | 3 -4 5 -6 gdje sam ti sa znakom | odvojio retke dok je u memoriji to poslozeno tako sekvencijalno. Jel vec mozda vidis rjesenje?
Ako ne, citaj dalje. Kolika je ukupna velicina neke n x m matrice? Upravo n puta m. Dakle, ako zelis matricu prikazati preko 1D arraya, za njega trebas alocirati upravo n puta m elemenata. U tvojem primjeru bi to bilo 4x4 = 16. To znaci da moras alocirati polje velicine 16. E sad malo jednostavne matematike za setanje po matrici. Mozes odabrati dva nacina: da seces po stupcima (znaci, odaberes prvi stupac, pa po njemu ides prema dolje, kad dodes do kraja skocis u drugi stupac itd. - to je column-major order) ili da seces po retcima (kako je i uobicajeno, koliko znam, vecina C-like jezika koriste ovakav prolazak po matrici (izuzetak su eventualno MATLAB, Octave, Fortran i sl.) - to se zove row-major order).
Ilustrirat cu ti row-major order zato jer se on u vecini slucajeva i upotrebljava, za vjezbu mozes probati implementirati column-major order.
Dakle, da dodemo do elementa A[i][j] koristimo jednostavnu algebarsku formulu: elementi,j = i*m + j gdje su i i j indeksi elementa kojem zelimo pristupiti, a m je broj stupaca, tj. sirina matrice. Recimo za A[1][3] u tvojoj matrici (broj -8) dobijemo 1*4 + 3 = 7, sad kad tu matricu poredamo sekvencijalno: 7 9 3 4 | 5 8 7 -8 | 3 -1 1 2 | 3 -4 5 -6 vidimo da je -8 uistinu na indeksu 7 1D arraya (brojanje krece od 0).
Mozes si skicirati na papiru, lakse ce ti biti za shvatiti, a mozes iz te skice i sam doci do te formule.
Hvala. Znači to bi trebalo izgledati ovako ?
#include <stdio.h>
void main()
{
int i,j;
int x[16] = {7,9,3,4,5,8,7,-8,3,-1,1,2,3,-4,5,-6};
for (i=0;i<4;i++){
for (j=0;j<4;j++){
printf("%d \t",x[(4*i)+j]);
}
printf("\n");
}
}