Samo tuci po kodu, stackoverflow, geeksforgeeks itd će ti pomoći. Što više radiš sam bit ćeš bolji iako će ti duže trebati.
Programiranje u C-u - od svega pomalo
- poruka: 1.661
- |
- čitano: 355.154
- |
- moderatori:
Lazarus Long, XXX-Man, vincimus
Pozdrav, ljudi!
Prolazim kroz neke vježbe za početnike i naišao sam na zadatak gdje neki broj dana treba rasporediti u godine, mjesece, tjedne i ponovo dane (ostatak pri dijeljenju).
Nekako sam ga uspio riješiti, no htio sam da broj dana unosim iz konzole kao parametar (*char argv[]).
Taj string sam koristeći atoi() prebacio u integer i to šljaka.
Međutim, zanima me ima li neka caka da se umjesto *char argv[] unosi niz integera? int argv[] ili nešto slično.
Unaprijed hvala!
evo kod:
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[])
{
int x = atoi(argv[1]);
int years = x / 365;
int months = (x % 365) / 30;
int weeks = ((x % 365) % 30) / 7;
int days = ((x % 365) % 30) % 7;
printf ("YEARS: %d\n", years);
printf ("MONTHS: %d\n", months);
printf ("WEEKS: %d\n", weeks);
printf ("DAYS: %d\n", days);
}
Nevermind za zadnji post.
Pokušavam riješiti zadatak s nekog školskog natjecanja iz 2008. (slike u prilogu).
Ovo je kod koji sam napisao, međutim radi samo kada je rotacija istog tipa, čim ih pomiješam, ne radi više ništa.
Ima li itko ideju zašto je tomu tako?
Hvala unaprijed!
#include <stdio.h>
int main ()
{
int fields[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
char buffer1[100];
int nm=0; // moves
int memory[3][3];
int command[20];
int x=1;
int i=0;
int j=0;
char buffer[100];
fgets(buffer1, 100, stdin);
sscanf(buffer1, "%d", &nm);
fgets(buffer, 100, stdin);
for (i=0; i<nm; i++) {
sscanf(buffer, "%d", &command[i]);
switch (command[i])
{
case 1:
memory[0][0]=fields[0][0];
memory[0][1]=fields[0][1];
memory[0][2]=fields[1][1];
memory[0][3]=fields[1][0];
fields[0][0] = memory[0][3];
fields[0][1] = memory[0][0];
fields[1][0] = memory[0][2];
fields[1][1] = memory[0][1];
break;
case 2:
memory[1][0]=fields[0][1];
memory[1][1]=fields[0][2];
memory[1][2]=fields[1][1];
memory[1][3]=fields[1][2];
fields[0][2] = memory[1][0];
fields[1][2] = memory[1][1];
fields[1][1] = memory[1][3];
fields[0][1] = memory[1][2];
break;
case 3:
memory[2][0]=fields[1][0];
memory[2][1]=fields[1][1];
memory[2][2]=fields[2][0];
memory[2][3]=fields[2][1];
fields[1][1] = memory[2][0];
fields[2][1] = memory[2][1];
fields[2][0] = memory[2][3];
fields[1][0] = memory[2][2];
break;
case 4:
memory[3][0]=fields[1][1];
memory[3][1]=fields[1][2];
memory[3][2]=fields[2][1];
memory[3][3]=fields[2][2];
fields[1][2] = memory[3][0];
fields[2][1] = memory[3][3];
fields[2][2] = memory[3][1];
fields[1][1] = memory[3][2];
break;
default:
printf ("FAILED");
}
}
//prints out the entire field
for (i=0; i<3; i++) {
for (j=0; j<3; j++) {
printf ("%d", fields[i][j]);
}
printf("\n");
}
return 0;
}
Problem je
sscanf(buffer, "%d", &command[i]);
Ova linija kod svakog izvršavanja učita prvi broj iz stringa buffer, a ne i-ti broj iz stringa buffer.
Dodaj jedan printf("%d\n", command[i]); iza ove naredbe i vidjet ćeš da u svakom koraku radiš prvu rotaciju.
Problem je
sscanf(buffer, "%d", &command[i]);
Ova linija kod svakog izvršavanja učita prvi broj iz stringa buffer, a ne i-ti broj iz stringa buffer.
Dodaj jedan printf("%d\n", command[i]); iza ove naredbe i vidjet ćeš da u svakom koraku radiš prvu rotaciju.
Da, hvala puno!
trebalo je upotrijebit pointer i onda neki %n i onda pointeru dodat taj n, nemam pojma što to točno radi, ali upalilo je:
char *at; // pointer
fgets(buffer, 100, stdin);
at =buffer; //point to buffer
for (i=0; i<nm; i++) {
sscanf(at, "%d%n", &command[i], &n);
.
.
.
at += n;
Taj %n je mehanizam kojim sscanf vraća broj znakova učitanih iz stringa at. Zadnja naredba omogućuje da sljedeći poziv sscanf nastavi tamo gdje je prethodni poziv završio.
Pozdrav,
Napisati C program koji će učitati dva cijela broja A i B, takvi da su veći od 300 i manji od 500, i da je B veće od A za najmanje 28. Ako nisu ispunjeni navedeni uvjeti ispisati poruku "Brojevi nisu u zadanim granicama" i ponoviti učitavanje brojeva.Izračunati broj i zbroj parnih brojevaizmeđuA i B čiji je zbroj znamenki jednak 11.Ispisati broj pronađenih brojeva i njihov zbroj porukom "Brojeva je _, zbroj je _".
#include <stdio.h>
int main()
{
int A, B, C;
int prva, druga, treca, treca_f;
printf ("Upisite dva broja: ");
scanf ("%d%d",&A,&B);
while (A>500 || A<300 || B>500 || B<300 || B-A<28)
{
printf ("Brojevi nisu u zadanim granicama!");
break;
}
for (A; A<B; A++)
{
prva=A/100;
treca_f=A%100;
treca=treca_f%10;
druga=treca_f/10;
if (A%2==0 && prva + druga+treca==11)
{C++;
printf ("\n%d", A);
}
}
printf ("Broj brojeva je: %d", C);
return 0;
}
Znači sve mi dobro izračuna no program se ne prekida nakon što se unesu pogrešni brojevi. Kako napraviti da se nakon ispisa poruke "Brojevi nisu u zadanim granicama" završi program i korisnik treba upet upisivati brojeve
Napisati C program koji će učitati dva cijela broja A i B, takvi da su veći od 300 i manji od 500, i da je B veće od A za najmanje 28. Ako nisu ispunjeni navedeni uvjeti ispisati poruku "Brojevi nisu u zadanim granicama" i ponoviti učitavanje brojeva.Izračunati broj i zbroj parnih brojevaizmeđuA i B čiji je zbroj znamenki jednak 11.Ispisati broj pronađenih brojeva i njihov zbroj porukom "Brojeva je _, zbroj je _".
Znači sve mi dobro izračuna no program se ne prekida nakon što se unesu pogrešni brojevi. Kako napraviti da se nakon ispisa poruke "Brojevi nisu u zadanim granicama" završi program i korisnik treba upet upisivati brojeve
Ne želiš da ti se program završi, nego želiš da ponovno učitava brojeve.
While petlja ti trenutno ništa ne radi nego samo ispisuje poruku, ali se program dalje nastavi, tj radi kao obični if uvjet jer ako uđe u nju odmah izađe iz nje zbog break naredbe.
U while petlji moraš ponovit učitavanje brojeva nakon ispisa "Brojevi nisu u zadanim granicama!" i maknut break kako bi se radnja ponovila sve dok uneseni brojevi ne budu u redu.
Jesi uspio riješiti ?
Jesi uspio riješiti ?
Jesam, ovako sam riješio taj problem, ne znam jel najelegantnije riješenje, ali funkcionira :D.
#include <stdio.h>
int main()
{
int A, B, C;
int prva, druga, treca, treca_f;
printf ("Upisite dva broja: ");
scanf ("%d%d",&A,&B);
while (A>500 || A<300 || B>500 || B<300 || B-A<28)
{
printf ("Brojevi nisu u zadanim granicama!");
printf ("\nPonovno upisite dva broja: ");
scanf ("%d%d",&A, &B);
}
for (A; A<B; A++)
{
prva=A/100;
treca_f=A%100;
treca=treca_f%10;
druga=treca_f/10;
if (A%2==0 && prva + druga+treca==11)
{C++;
printf ("\n%d", A);
}
}
printf ("\nBroj brojeva je: %d", C);
return 0;
}
Pozdrav,
Zadatak glasi ovako:
Pozdrav, može netko pomoći, zadatak je sljedeći:
Na slici ispod je umjetnički prikazan koncept. Vi ste pozicionirani s lijeve strane, na koordinatama (0,0). Postoji N (1 <= N <= 1000) vrhova (u donjem slucaju, N=7), a svaki vrh ima X koordinatu i visinu V (0 < X, V <= 1000000000).
Potrebno je za učitane vrhove (koji su učitani redom s lijeva na desno) odrediti koliko ih je vidljivo s koordinate (0,0). U donjem primjeru, vidljiva su 2 vrha, dok ostali nisu vidljivi jer vrh broj 2 nam zaklanja pogled da vidimo ostale.
Uglavnom znači koliko vrhova planine N se vidi, ako imamo njihove koordinate X i V
Ja sam ovako napravio, ali ne ispada dobro, trebam li koristiti nizove možda?
Riješeno
Program izgleda OK, možeš li navesti konkretne koordinate vrhova koje si koristio za testiranje?
Program izgleda OK, možeš li navesti konkretne koordinate vrhova koje si koristio za testiranje?
Ma skužio sam, rješenje mi je bilo krivo jer sam stavio varijable int za koordinate umjesto float pa je zato bilo krivo. Hvala svejedno :).
Pozdrav ljudi, nije nikakva hitnoća ni ništa, čisto dodatni zadatak za vježbu, ali me baš zanima kako se riješava, radi se o nizovima.
Evo lijepog teksta zadatka:
1 50
4 75
2 60
1 10
#include <stdio.h>
#include <stdlib.h>
int main()
{
int N,K,i;
int tezina [10];
int vrijednost [10];
scanf ("%d%d", &K, &N);
for (i=0;i<N;i++)
{
scanf ("%d%d", &tezina[i], &vrijednost[i]);
Ja sam evo samo započeo, no uopće mi ne pada na pamet kako riješiti odnosno kako kombinirati stvari iz dva različita niza tako da jedna vrijednost ovisi o drugoj. Ne morate mi riješiti zadatak dajte mi da se mučim, ali mi dajte neki hint ili pomoć kako recimo učitati nizA i nizB od četiri elementa i da onda kombinacija vrijednosti iz niza A bude najveća ako kombinacija vrijednosti iz drugog niza odgovara N (u ovom slučaju 5).
Hvala unaprijed
Pozdrav ljudi, nije nikakva hitnoća ni ništa, čisto dodatni zadatak za vježbu, ali me baš zanima kako se riješava, radi se o nizovima.
Evo lijepog teksta zadatka:
1 50
4 75
2 60
1 10
#include <stdio.h>
#include <stdlib.h>
int main()
{
int N,K,i;
int tezina [10];
int vrijednost [10];
scanf ("%d%d", &K, &N);
for (i=0;i<N;i++)
{
scanf ("%d%d", &tezina[i], &vrijednost[i]);
Ja sam evo samo započeo, no uopće mi ne pada na pamet kako riješiti odnosno kako kombinirati stvari iz dva različita niza tako da jedna vrijednost ovisi o drugoj. Ne morate mi riješiti zadatak dajte mi da se mučim, ali mi dajte neki hint ili pomoć kako recimo učitati nizA i nizB od četiri elementa i da onda kombinacija vrijednosti iz niza A bude najveća ako kombinacija vrijednosti iz drugog niza odgovara N (u ovom slučaju 5).
Hvala unaprijed
Odličan zadatak, evo hint.
Pozdrav ljudi, nije nikakva hitnoća ni ništa, čisto dodatni zadatak za vježbu, ali me baš zanima kako se riješava, radi se o nizovima.
Evo lijepog teksta zadatka:
1 50
4 75
2 60
1 10
#include <stdio.h>
#include <stdlib.h>
int main()
{
int N,K,i;
int tezina [10];
int vrijednost [10];
scanf ("%d%d", &K, &N);
for (i=0;i<N;i++)
{
scanf ("%d%d", &tezina[i], &vrijednost[i]);
Ja sam evo samo započeo, no uopće mi ne pada na pamet kako riješiti odnosno kako kombinirati stvari iz dva različita niza tako da jedna vrijednost ovisi o drugoj. Ne morate mi riješiti zadatak dajte mi da se mučim, ali mi dajte neki hint ili pomoć kako recimo učitati nizA i nizB od četiri elementa i da onda kombinacija vrijednosti iz niza A bude najveća ako kombinacija vrijednosti iz drugog niza odgovara N (u ovom slučaju 5).
Hvala unaprijed
Odličan zadatak, evo hint.
Uh hvala puno, nisam znao da je toliko pažnje posvećeno baš ovom problemu :D.
Pozdrav,
Evo mene opet sa zadatkom.
Vaš zadatak je isprogramirati jednostavu igricu sličnu tetrisu, ali sa slijedećim pravilima:
- polje za igru veliko je 3x3
- polje za igru na početku igre je uvijek prazno (polje je popunjeno s vrijednostima 0)
- polje za igru se popunjava odozgora prema dole, dakle ulazni objekt pada s vrha na dno polja za igru (kao u klasičnom tetrisu)
- padajući objekt je dimenzije 1x1 (visine jednog retka i dužine jednog stupca) i ima vrijednost 1
- objekt uvijek pada vertikalno kroz određeni stupac i ne mijenja smjer
- na početku igre, unosi se broj stupca kroz koji će objekt padati
- u slučaju unosa neodgovarajuće vrijednosti, izvan raspona [1,3], potrebno je ponoviti unos vrijednosti te ispisati poruku "Ponovi unos!"
- nakon svakog "kruga" igre potrebno je ispisati stanje polja za igru i poruku "Nakon n-tog kruga:", dakle nakon primjene svih gore navedenih pravila vezanih uz tijek igre
- kada neki stupac u polju za igru dostigne vrijednost 3 (visinu polja za igru) igra se prekida s porukom "Prekid igre."
Primjer ulaza:
2
2
2
Očekivani izlaz:
Nakon 1. kruga:
000
000
010
Nakon 2. kruga:
000
010
010
Nakon 3. kruga:
010
010
010
Prekid igre.
Neću uploadat kod da nebi slučajno netko od kolega naišao i kopirao, ljudi su padali zbog toga. Nego ću čisto pitati za hint. Znači došao sam do ovog slika.
Sad ne znam kako da se prebacim na drugi red, odnosno kako da postavim uvjet da ako je zadnji red ispunjen da se prilikom ponovnog unosa istog broja ispuni drugi red, a ne treći.
Prije upisa u polje (red, stupac) provjeri da li je polje prazno. Ako nije ponovi postupak za polje (red-1, stupac).
Prije upisa u polje (red, stupac) provjeri da li je polje prazno. Ako nije ponovi postupak za polje (red-1, stupac).
Uspio, hvala, ma išao sam preko brojača ipak, znači ako je neki stupac ispunjen njegov brojač++ i ako je brojač 1 ispuni drugi redak, ako je 2 ispuni prvi i radi.
Evo me opet. Radi se o 2D polju dimenzija 3x3 koje se inicira kao devet nuli.
Upisuju se vrijednosti tri po tri. Gotovo je kada u jednom stupcu bude 3 brojke koje nisu nula.
Znači otprilike ovako:
Input: 131, 200, 300
Nakon 1. kruga:
000
000
131
Nakon 2. kruga:
000
200
131
Nakon 3. kruga:
300
200
131
Prekid igre.
Ea sad, zadatak ima dodatan problem, ako su susjedne brojke iste, one se poništavaju i ako je cijeli redak 0 unosi se ispočetka.
Znači ovako
Input: 111, 320, 011, 001, 320
Nakon 1. kruga:
000
000
000
Nakon 2. kruga:
000
000
320
Nakon 3. kruga:
000
010
321
Nakon 4. kruga:
000
000
320
Nakon 5. kruga:
000
000
000
Ponovi unos!
Nakon 6. kruga:
000
000
131
Nakon 7. kruga:
000
200
131
Nakon 8. kruga:
300
200
131
Prekid igre.
Napravio sam kod za ovaj slučaj kad nema poništavanja, čak sam i na tragu da sklopim nešto i kada se poništavaju brojke, ali mi je problem kako vratiti da kada se ponište brojke da se ponovno unosi prvi redak
Riješeno
Nisam gledao detaljno, ali vidim da imaš for i unutar for i.
Svaki put moraš koristiti drugu varijablu.
Nisam gledao detaljno, ali vidim da imaš for i unutar for i.
Svaki put moraš koristiti drugu varijablu.
Haha hvala, to je to, a ja razbijao glavu već jedno dulje vrijeme.
Na mobitelu sam, tako da mi malo teže ide podučavanje koda :)
Iz iskustva bi rekao krivi poredak i i j, umjesto brojenje od 0 na više, treba biti više prema 0, brojenje treba početi od i+1, a ne i... Ili nešto u tom stilu :D
Na mobitelu sam, tako da mi malo teže ide podučavanje koda :)
Iz iskustva bi rekao krivi poredak i i j, umjesto brojenje od 0 na više, treba biti više prema 0, brojenje treba početi od i+1, a ne i... Ili nešto u tom stilu :D
Hm hm, ma čudno mi je da dobro radi bez tog dijela koda za prebacivanje brojeva na nule niže, to je obični if, i da tako poremeti ispis.
Kako rješavate stringove, konkretno u ovoj situaciji. Zadatak je kao napravit igru kaladont, odnosno nakon svakog unosa stringa ispisat zadnja dva slova i ako su ona NT onda je igra gotova. Jel to nešto pomoću substringova?
Koristiš C string. Znači string definiraš kao
char tekst[32];
S time da si limitiran na 31 znak, 32. znak je \0(null) koji mora biti u svakom stringu kako bi računalo znalo da je došlo do kraja stringa.
Nakon svakog unosa uzimaš duljinu teksta s
uint8_t duljina = strlen(tekst);
Nakon toga ispisuješ zadnja dva znaka s
tekst[duljina - 2] i tekst[duljina - 1]
Nakon toga napraviš provjeru za kraj igre s
if((tekst[duljina - 2] == 'N' && tekst[duljina - 1] == 'T') || (tekst[duljina - 2] == 'n' && tekst[duljina - 1] == 't'))
Ako je provejra prošla - kraj igre - ako nije, ideš na ponovan unos.
Može neki hint, pseudo kod, bilo šta, kako biste ovo riješili.
Znači s matrice na lijevoj strani potrebno je dobiti riješenje na desnoj strani.
Drugim riječima, točke se pretvaraju u zvjezdice samo ako je put do G takav da se ne može nigdje skrenuti, znači X je i gore i dolje i dok dode do G stane.
Oke, ako je X iznad i ispod pretvaram tockicu u zvjezdicu, ali to mi ne rješava problem, koji još uvjeti nedostaju.
Hvala na pomoci.