Programiranje u C-u - od svega pomalo izdvojena tema

poruka: 1.661
|
čitano: 387.097
|
moderatori: Lazarus Long, XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
12 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo
pooomoc pliz :)
zadatak kaze korisnik unosi 3 niza, nadji iz sva tri neparne brojeve i ispisi ih u novom nizu a) uzlazno b) silazno - u komentaru /*
ja sam unila nizove, ali neznam kako bi pronasla iz sva tri neparne bez da moram svakog posebno, i kako ih poredane ispisat u novom nizu? :(
 
0 0 hvala 0
13 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Evo koda; ako ti ne bude nekaj jasno pitaj...
Rekla si da znas algoritam za sortiranje pa ces dalje znati nadopisati kod... 

Neparni_br Neparni_br
Poruka je uređivana zadnji put pon 11.2.2013 13:04 (Master11).
Moj PC  
0 0 hvala 0
17 godina
offline
Programiranje u C-u - od svega pomalo

Ostala si nedorečena, da li se u novom nizu ponavljaju brojevi ili ne.

Ako se ponavljaju, onda modifikacija koda od gore:

 

    for (int i = 0; i < 3; i++)
    {
       if (niz1[i]%2)
          niz[index++] = niz1[i];
       if (niz2[i]%2)
          niz[index++] = niz2[i];
       if (niz3[i]%2)
          niz[index++] = niz3[i];
    }

Varijablu index inicijaliziraš na 0 prije petlje, a ispis novog niza vršiš od i = 0 do i < index.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Poruka je uređivana zadnji put pon 11.2.2013 13:18 (Floki).
 
0 0 hvala 0
12 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

nece radi

Poruka je uređivana zadnji put pon 18.2.2013 12:49 (amarantha).
 
0 0 hvala 0
13 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Vidis ja pokrenem ovaj sa mojim kodom i sve dobro radi, jedino ti preostaje sortirati niz...

I čemu ovaj scanf kod ispisa neparnih brojeva, wtf!
Daj molim te, prepisi kod koji sam ti postao, tocno onako kako pise tamo, nista ni manje ni vise, nego tocno tako i pokreni, imas nebuloze u svome i zato ti ne radi dobro... 

Poruka je uređivana zadnji put pon 11.2.2013 13:57 (Master11).
Moj PC  
0 0 hvala 0
12 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
kako mislis je li se u novom nizu ponavljaju brojevi? novi niz se sastoji samo od neparnih brojeva iz ova 3 niza

ako mislis na to da u 2 niza bude upisan isti broj nista mi po tom pitanju nije zadano, pa pretpostavljam da je moguce da se ponavljaju
17 godina
offline
Re: Programiranje u C-u - od svega pomalo
amarantha kaže...
kako mislis je li se u novom nizu ponavljaju brojevi? novi niz se sastoji samo od neparnih brojeva iz ova 3 niza

ako mislis na to da u 2 niza bude upisan isti broj nista mi po tom pitanju nije zadano, pa pretpostavljam da je moguce da se ponavljaju

pa onda imaš sve ovdje, a algoritam za sortiranje imaš na prethonoj strani, kolko vidim u svom si zabrljala stvari, vanjska petlja ide do broja članova novog niza - 1, a unutarnja do broja ćlanova novog niza, i temp varijabla ti ne može biti prazna u prvoj liniji algoritma za sortoranje. Nemaš nikakav temp[i], to ne postoji, nego koristiš temp varijablu za privremeno skladištenje broja kojeg zamjenjuješ.

Poruka je uređivana zadnji put pon 11.2.2013 14:15 (Floki).
12 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo

da M-1 znam to sam bila zaboravila...a za t nisam stavila t[i]?

Poruka je uređivana zadnji put pon 11.2.2013 14:24 (amarantha).
12 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
Master11, ugl izgleda da mi je bilo do programa kad sam isto kopirala u novi project radilo je...sry ako sam te uvridila
(a to za scanf posto nije radilo sam stavila kad sam isprobavala ne snalazim se u poljima bas, nisan izbrisala)
12 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Zapela sam na zadatku pa mi treba malo pomoci :)

 

#include <stdio.h>

char distance(char a, char b)
{
    unsigned char d;
    if(((a>='a'&&a<='z')||(a>='A'&&a<='Z'))&&((b>='a'&&b<='z')||(b>='A'&&b<='Z')))
    {
        if(a>b)
            d=a-b;
        else
            d=b-a;
    }
    return d;
}

int main(void)
{
    char ch1, ch2;

    printf("Unesite dva znak:\n");
    scanf(" %c %c", &ch1, &ch2);

    printf("Znak %c je %d udaljen od znaka %c\n", ch1, distance(ch1, ch2), ch2);
    return 0;
}

 

 

problem je u tome sto program treba odrediti udaljenost neovisno da li se radi o velikom ili malom slovu...

on to radi kod kombinacija malo*malo, veliko*veliko...

ali ne kod kombinacije malo*veliko, veliko*malo :(

 
0 0 hvala 0
14 godina
offline
Re: Programiranje u C-u - od svega pomalo

Jesi probala sa toupper funkcijom? Napravi toupper na ulaznim varijablama distance funkcije, i onda ćeš uvijek raditit sa velikim slovima.

WordPress ❤
12 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo

radi, hvala ;)

15 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

kada se koriste keywordovi volatile i extern?

može primjer koda?

Ja sam Plavi zmaj.Form the future!Masa,društvo većina,''normalni'' su ništa bez onih pojedinaca koji ih čine.
Moj PC  
0 0 hvala 0
13 godina
offline
Re: Programiranje u C-u - od svega pomalo
g12356 kaže...

kada se koriste keywordovi volatile i extern?

može primjer koda?

Evo ti svi C-ovi keywordi pa pogledaj.

Za primjere pogledaj Stack Overflow, Codecall, itd.

0100011001000001010100000010000000110100001000000100110001001001010001100100010100100001
14 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
Kada lajavci laju onda završe ovako: http://i471.photobucket.com/albums/rr77/toropreto/2012-07-0813_30_07.gif
15 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
pr0n_addict kaže...
g12356 kaže...

kada se koriste keywordovi volatile i extern?

može primjer koda?

Evo ti svi C-ovi keywordi pa pogledaj.

Za primjere pogledaj Stack Overflow, Codecall, itd.

  Jeli je to po c11?

  Hvala,pokušavam nastaviti učiti C nakon što smo sa njime više manje gotovi na faksu!

Ja sam Plavi zmaj.Form the future!Masa,društvo većina,''normalni'' su ništa bez onih pojedinaca koji ih čine.
15 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
g12356 kaže...

 Jeli je to po c11?

To je ANSI C, odnosno C89/C90

 

C99 dodaje još:

inline
restrict
_Bool
_Complex
_Imaginary

 

a C11 dodaje:

_Alignas
_Alignof
_Atomic
_Generic
_Noreturn
_Static_assert
_Thread_local

 

To su keywordi C jezika, razni kompajleri dodaju na to još i svoje keyworde kao ekstenzije...

0xBADC0DE
13 godina
offline
Programiranje u C-u - od svega pomalo

Pojavljuje mi se problem sa ispisom podataka na konzolu. Imam .txt datoteku sa podacima o popisu stanovništva 2011. godine koje učitavam liniju po liniju i to spremam u članove statički alociranog niza struktura.

Koristim funkcije za wide charove da bi mogao ispisati naše znakove, ali to nije problem (ista stvar je i sa printf-om samo što ispisuje žvrljotine za naše znakove). U for petlji standardno iteriram po nizu strukture, ali mi ne printa od početka nego krene od nekog random indexa niza.

Inače, to nije poanta zadatka nego sortiranje podataka sa qsort-om i slično, ali to ću rješavati nakon što ovo dokučim.

Kada manualno "usporim" iteriranje petlje sa Sleepom onda radi normalno.

U .h fajlu je samo definirana struktura - no kako je moguće da ja trpam string iz buffera koji je wchar_t u niz_popis[i].ime_naselja koji je običan char? Čak mi ni warning ne javlja.

 

Tekstualna datoteka je tu.

 

EDIT: Čini mi se da toliko linija ispisa jednostavno ne stane u konzolu. Očito ima neku fiksnu količinu teksta koju može prikazati.

 

#include <stdio.h>
#include <locale.h>
#include <Windows.h>
#include "header.h"

#define MAX_L 7500

int main()
{
    FILE *f;
    wchar_t buffer[64];
    int i = 0;
    struct popis niz_popis[MAX_L];
    setlocale(LC_ALL, "croatian");
    if((f = fopen("popis-cp1250.txt", "r")) == NULL)
    {
       perror("Doslo je do pogreske prilikom otvaranja datoteke");
       return 1;
    }
    while(fgetws(buffer, 64, f) != NULL)
    {
       swscanf(buffer, L"%s %u %u", niz_popis[i].ime_naselja, &niz_popis[i].broj_stanovnika, &niz_popis[i].broj_kucanstava);
       i++;
    }
    for(i = 0; i < 7395; i++)
    {
       wprintf(L"%d. %s %u %u\n", i + 1, niz_popis[i].ime_naselja, niz_popis[i].broj_stanovnika, niz_popis[i].broj_kucanstava);
       /*Sleep(100);*/
    }
    fclose(f);
    return 0;
}

 

0100011001000001010100000010000000110100001000000100110001001001010001100100010100100001
Poruka je uređivana zadnji put čet 7.3.2013 1:16 (pr0n_addict).
Moj PC  
0 0 hvala 0
15 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
pr0n_addict kaže...
U for petlji standardno iteriram po nizu strukture, ali mi ne printa od početka nego krene od nekog random indexa niza.

Inače, to nije poanta zadatka nego sortiranje podataka sa qsort-om i slično, ali to ću rješavati nakon što ovo dokučim.

Kada manualno "usporim" iteriranje petlje sa Sleepom onda radi normalno.

U .h fajlu je samo definirana struktura - no kako je moguće da ja trpam string iz buffera koji je wchar_t u niz_popis[i].ime_naselja koji je običan char? Čak mi ni warning ne javlja.

 

Meni sve radi kako treba nakon što sam strukturu definirao ovako:

struct popis
{
    wchar_t ime_naselja[64];
    int broj_stanovnika;
    int broj_kucanstava;
};

 

pr0n_addict kaže...
U .h fajlu je samo definirana struktura - no kako je moguće da ja trpam string iz buffera koji je wchar_t u niz_popis[i].ime_naselja koji je običan char? Čak mi ni warning ne javlja.

Veličina wchar_t tipa nije strogo određena, nego je prepuštena implementaciji. Na windowsima ona u praksi iznosi 2 bajta, na linuxu 4 bajta.

klasičan char je uvijek samo jedan bajt.

 

wchar_t niz1[12]; //rezervirano mjesto za 12 wchar znakova, što je u biti 24 bajta u memoriji

char niz2[12];    //rezervirano mjesto za 12 char znakova koji zauzimaju sveukupno 12 bajta memorije

 

Što se dogodi ako sadržaj gornjeg wchar polja kopiraš u char polje? Samo polovica whcar znakova će stati, ostatak ti izbije izvan granica polja, odnosno kopiraš 24 bajta u područje rezervirano za 12 bajta.

 

pr0n_addict kaže...
EDIT: Čini mi se da toliko linija ispisa jednostavno ne stane u konzolu. Očito ima neku fiksnu količinu teksta koju može prikazati.

Dobro ti se čini.

0xBADC0DE
Poruka je uređivana zadnji put čet 7.3.2013 1:41 (rustweaver).
13 godina
offline
Programiranje u C-u - od svega pomalo

Kada stavim wchar_t u strukturu onda mi ne može alocirati niz u mainu.

Probao sam za male veličine i radi, čim stavim nešto veće - boom. Fino se kompajlira i sve, samo mi ga u runtime-u sruši sa onom standardnom porukom za crashani proces na Winsima.

 

Još me yebuckaju ove wchar.h funkcije, jao. Poslijepodne ću ovo nastaviti, prekasno mi je već sada.

 

EDIT: Jesi ti na MinGW-u ili na Visual C-u?

 

 

Problem signature:
  Problem Event Name:    APPCRASH
  Application Name:    SPA_vj1.exe
  Application Version:    0.0.0.0
  Application Timestamp:    5137e3e7
  Fault Module Name:    SPA_vj1.exe
  Fault Module Version:    0.0.0.0
  Fault Module Timestamp:    5137e3e7
  Exception Code:    c00000fd
  Exception Offset:    000119b7
  OS Version:    6.1.7601.2.1.0.256.1
  Locale ID:    1050
  Additional Information 1:    798c
  Additional Information 2:    798c6145807572dc03da3d232622f216
  Additional Information 3:    74e2
  Additional Information 4:    74e20586148abd4a4d0dd7f5b70dae43

0100011001000001010100000010000000110100001000000100110001001001010001100100010100100001
Poruka je uređivana zadnji put čet 7.3.2013 1:52 (pr0n_addict).
Moj PC  
0 0 hvala 0
15 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
pr0n_addict kaže...

Kada stavim wchar_t u strukturu onda mi ne može alocirati niz u mainu.

Probao sam za male veličine i radi, čim stavim nešto veće - boom. Fino se kompajlira i sve, samo mi ga u runtime-u sruši sa onom standardnom porukom za crashani proces na Winsima.

 

Još me yebuckaju ove wchar.h funkcije, jao.


Exception Code:    c00000fd

Stack overflow. Pokušavaš previše toga staviti na stack. Nauči se čitati "standardnu poruku za crash" jer iz nje možeš puno toga saznati.

 

Konkretno, automatske (lokalne) varijable se stavljaju na stack, ti imaš lokalni niz od 7500 struktura od kojih je svaka 136 bajta (u mom slučaju je tolika). To ti je 7500*136=1020000 bajta stack memorije. Ups...

 

Linkeru možeš narediti da stvori veći stack putem --stack parametra.

Recimo:

--stack 4194304

Za 4 MB stack.

 

Savjet? Alociraj potrebnu memoriju na heapu.

0xBADC0DE
Poruka je uređivana zadnji put čet 7.3.2013 2:05 (rustweaver).
13 godina
offline
Re: Programiranje u C-u - od svega pomalo
rustweaver kaže...
pr0n_addict kaže...

Kada stavim wchar_t u strukturu onda mi ne može alocirati niz u mainu.

Probao sam za male veličine i radi, čim stavim nešto veće - boom. Fino se kompajlira i sve, samo mi ga u runtime-u sruši sa onom standardnom porukom za crashani proces na Winsima.

 

Još me yebuckaju ove wchar.h funkcije, jao.


Exception Code:    c00000fd

Stack overflow. Pokušavaš previše toga staviti na stack. Nauči se čitati "standardnu poruku za crash" jer iz nje možeš puno toga saznati.

 

Konkretno automatske (lokalne varijable) se stavljaju na stack, ti imaš niz od 7500 struktura od kojih je svaka 136 bajta (u mom slučaju je tolika). To ti je 7500*136=1020000 bajta stack memorije.

 

Savjet? Alociraj potrebnu memoriju na heapu.

Tokom dana probam, vjerojatno će raditi. Bilo mi je sumnjivo jer znam da je stack relativno malen. Kako se formalno zove taj report, inače?

Thanks {#}

0100011001000001010100000010000000110100001000000100110001001001010001100100010100100001
Poruka je uređivana zadnji put čet 7.3.2013 2:04 (pr0n_addict).
15 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
pr0n_addict kaže...

Kako se formalno zove taj report, inače?

Koji report? Misliš na ovaj error code koji si ti dobio?

 

STATUS_STACK_OVERFLOW

definiran je u headeru ntstatus.h

 

Na MSDN-u se spominje kao EXCEPTION_STACK_OVERFLOW

 

Ili misliš baš na naziv za sveukupni izvještaj o rušenju koji ti je iskočio u prozoru? Što ja znam... "error report"? :D

 

I da, ja koristim GCC. To objašnjava zašto ja imam veći defaultni stack, a tebi se rušilo :D

0xBADC0DE
Poruka je uređivana zadnji put čet 7.3.2013 2:27 (rustweaver).
13 godina
offline
Programiranje u C-u - od svega pomalo

Radi sve fino s malloc-om kako si preporučio (za sortiranje ću ga trebati zamijeniti s calloc-om zbog toga jer on inicijalizira elemente niza, barem mislim). Još sam usto omogućio "preskakanje" linija fajla koje imaju neke nepoželjne podatke (regija, županija itd.).

 

Još to treba sortirati abecedno i prema broju stanovnika pa ispisati prvih 10 najmanje naseljenih mjesta. I još usto implementirati vlastiti bsearch, iterativno i rekurzivno - đizs...

Ne sumnjam da će i to štekati {#}Steep learning curve, kako se kaže.

0100011001000001010100000010000000110100001000000100110001001001010001100100010100100001
Poruka je uređivana zadnji put čet 7.3.2013 18:59 (pr0n_addict).
Moj PC  
0 0 hvala 0
15 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
pr0n_addict kaže...

Radi sve fino s malloc-om kako si preporučio (za sortiranje ću ga trebati zamijeniti s calloc-om zbog toga jer on inicijalizira elemente niza, barem mislim)

Calloc inicijalizira, da, sve bajtove na nulu.

 

Ja ga po defaultu koristim, sigurnosti radi. Malloc samo kada znam da mi baš ne treba inicijalizirani blok memorije, pa da uštedim malo cpu ciklusa...

 

pr0n_addict kaže...

Još to treba sortirati abecedno i prema broju stanovnika pa ispisati prvih 10 najmanje naseljenih mjesta. I još usto implementirati vlastiti bsearch, iterativno i rekurzivno - đizs...

Ne sumnjam da će i to štekati {#}Steep learning curve, kako se kaže.

Najbolji način za učenje, iz prakse. Puno bolje upoznaš problem kada ga jednom riješiš. Prvo rješenje je uglavnom koma, ali budeš zadovoljan što uopće radi. Drugi puta već znaš pogreške i nedostatke iz prve verzije pa pametnije konstruiraš cijelu stvar, treći puta još bolje itd.. To se zove iskustvo :D

0xBADC0DE
Poruka je uređivana zadnji put pet 8.3.2013 0:36 (rustweaver).
13 godina
offline
Programiranje u C-u - od svega pomalo

Ubacio sam qsort, koji je btw žešća zayebancija sa strukturama, ali mi sada baca access violation kada ga pokrenem. Ne ide mi ovo baš glatko {#}

 

Source fajlovi, lakše mi je ovako.

0100011001000001010100000010000000110100001000000100110001001001010001100100010100100001
Moj PC  
0 0 hvala 0
15 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
pr0n_addict kaže...

Ubacio sam qsort, koji je btw žešća zayebancija sa strukturama, ali mi sada baca access violation kada ga pokrenem. Ne ide mi ovo baš glatko {#}

Uf koji kung-fu sa pokazivačima, podsjeća me na moj kod :D

 

Da ne spominjem kako mi je GCC izbacivao illegal byte seqeunce (to nije tvoja greška, nego su mi se poklali kompajler, IDE i OS sa svojim zamislima koji encoding bi se trebao koristiti) :D

 

Prvo:

imaš ovo:

qsort((void*)&niz_popis, array_size, sizeof(struct popis), unsignedcmp);

a trebaš imati ovo:

qsort((void*)niz_popis, array_size, sizeof(struct popis), unsignedcmp);

 

Zašto? Zato što te funkcija qsort traži pokazivač na prvi element polja. Varijabla "niz_popis" već jest pokazivač na prvi element polja. Ti si proslijedio pokazivač na pokazivač na prvi element polja.

 

Dalje je samo bilo potrebno prepraviti funkciju unsignedcmp u ovo:

int unsignedcmp(const void* elem1, const void* elem2)
{
    struct popis* popis1 = (struct popis*)elem1;
    struct popis* popis2 = (struct popis*)elem2;
    return popis1->broj_stanovnika - popis2->broj_stanovnika;
}

 

Tvoj casting bi u toj funkciji bio ispravan kada bi ti qsort doista slao pokazivače na pokazivače na elemente polja, ali on ti šalje samo pokazivače na elemente polja. Ukratko samo si pogrešno protumačio kako qsort doista radi. Evo referenca i primjer pri dnu.

0xBADC0DE
Poruka je uređivana zadnji put pet 8.3.2013 2:40 (rustweaver).
13 godina
offline
Programiranje u C-u - od svega pomalo

Tražio sam po net-u dosta pa sam našao ove stranice:

1. razlog ampersanda

2. razlog pointer ludila-a (mada je i meni bilo čudno - zašto bi ga castao u ** pa ga onda dereferencirao, wtf?)

 

Inače radi sad, naravno {#}

Nego zašto treba u return-u unsignedcmp-a maknuti cast u const unsigned*?

0100011001000001010100000010000000110100001000000100110001001001010001100100010100100001
Moj PC  
0 0 hvala 0
15 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
pr0n_addict kaže...
Nego zašto treba u return-u unsignedcmp-a maknuti cast u const unsigned*?

Je li član "broj_stanovnika" pokazivač na neku vrijednost ili vrijednost? Zašto ga castaš u pokazivać na unsigned int?

 

Pazi, kada stukturi pristupaš preko pokazivača, njenim članovima pristupaš pomoću "->" operatora. I to je to, ne moraš te članove castati u ništa specijalno osim ako i sami nisu specijalni...

 

Dakle ukloniti castanje u pokazivač i dereferenciranje tog pokazivača, jer broj_stanovnika nije nikakav pokazivač. No mogao sam ostaviti castanje u unsigned const, ali nisam vidio smisao a bez toga je kraće.

 

 

Da ti objasnim, da je kojim slučajem struktura definirana ovako:

struct popis
{
    wchar_t ime_naselja[64];
    unsigned* broj_stanovnika;
    unsigned* broj_kucanstava;
};

 

Onda ni broj_stanovnika, ni broj_kucanstava ne bi bile vrijednosti, nego pokazivači na te vrijednosti, pa bi ih morao dereferencirati ako bi želio pristupati vrijednostima na koje pokazuju.

0xBADC0DE
Poruka je uređivana zadnji put pet 8.3.2013 2:53 (rustweaver).
13 godina
offline
Re: Programiranje u C-u - od svega pomalo
rustweaver kaže...
...

Smetnuo sam s uma da je -> ustvari samo čitljivije napisano derefenciranje. Zbog toga su i uveli taj operator.

 

Dosta sam pointere vježbao, ali stvarno nekad to zna biti malo zbunjujuće.

 

Inače, dok sam ja skužio da ne mogu kao drugi argument qsorta dati sizeof(niz_popis)/sizeof(niz_popis[o]) jer je niz_popis samo pointer, ma izludio sam skoro. I da može ne bi radio kako spada jer nije do kraja bio pun niz odnosno višak su sve nule.

Gledao sam primjere sa statički alociranim nizovima gdje taj princip funkcionira odlično i ponijelo me to valjda.

0100011001000001010100000010000000110100001000000100110001001001010001100100010100100001
Poruka je uređivana zadnji put pet 8.3.2013 3:08 (pr0n_addict).
Nova poruka
E-mail:
Lozinka:
 
vrh stranice