Programiranje u C++-u - pitanja i odgovori izdvojena tema

poruka: 7.285
|
čitano: 1.713.038
|
moderatori: Lazarus Long, XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
13 godina
offline
Programiranje u C++-u - pitanja i odgovori

Pozdrav ljudi, novi sam u ovom svijetu pa me zanima kako da krenem, imate li neki online prirucnik ili nesto da udem u te vode?

 

EDIT: koji program preporucujute?

I Love Milka
Poruka je uređivana zadnji put uto 17.12.2013 21:30 (1950Killer).
Moj PC  
0 0 hvala 0
17 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
1950Killer kaže...

Pozdrav ljudi, novi sam u ovom svijetu pa me zanima kako da krenem, imate li neki online prirucnik ili nesto da udem u te vode?

Otvoris ovaj podforum, pogledas malo dalje od prve sticky teme, tocnije, odaberes cetvrtu sticky temu - Literatura za programiranje i naci ces pregrst linkova, knjiga, tutorijala i raznih informacija.

Perhaps today IS a good day to die. PREPARE FOR RAMMING SPEED!
15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Cartman93 kaže...

meni ne treba pravi kod vec me zanima nacin na koji se moze rijesiti zadatak. btw programiram u C-u ali to sad nije bitno. dakle zadatak:

 

imam strukturu podataka (npr. float brojeva). ja bih trebao napisati funkciju koja ce mi napraviti sve kombinacije (ne permutacije!) tih brojeva i spremiti ih. npr imam polje ili listu:

1,2,3,4,5,6,7,8. ako je argument u funkciji 2 onda program treba ispisati (1,2) (1,3) (1,4) ... (2,3) (2,4)... (3,4) itd. ako je argument 4 onda su kombinacije (1,2,3,4) (1,2,3,5) (1,2,3,6)...(1,2,4,5) (1,2,4,6) itd.

dakle korisnik upisuje argument na temelju kojeg se rade grupe.

ja sam razmisljao napraviti za svaki argument(prvih 5-6 brojeva) novu funkciju, ali to mi je previse posla pa me zanima da li je moguce napisati jednu funkciju koja ce izraditi kombinacije na opisani nacin.

i zanima me koja struktura podataka je najbolja (polje, lista, red,stablo,???...).

 

vremenska slozenost algoritma mi nije pretjerano bitna, ali bilo bi pozeljno da je manja od O(2^n).

Mislim da je rekurzija najjednostavnije rjesenje, ja sam napisao da ti ispisuje skupove, a ti mozes napisat da ih ubaci u neku strukturu.
I struktrura najbolja za sto?  

#include <iostream>

#include <vector>

using namespace std;

 

vector<int> nums;

vector<int> sol;

 

void rec(int dep, vector<int> &sol) {

   if (dep != 0)

     for (int i = 0; i < nums.size(); i++) {

       sol.push_back(nums[i]);

       rec(dep-1, sol);

       sol.pop_back();

     }

   else {

     for (int i = 0; i < sol.size(); i++)

       cout << sol[i] << " ";

     cout << endl;

   }

}

 

 

int main() {

   nums.push_back(2);

   nums.push_back(3);

   nums.push_back(5);

   nums.push_back(7);

   nums.push_back(11);

 

   rec(2, sol);

   return 0;

}

15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
C je programski jezik kaže...

kako napraviti "spin control" u win32 aplikaciji?

To se još naziva i "up down control"

 

 

#include <windows.h>
#include <commctrl.h>

#define IDC_EDIT    1000
#define IDC_UPDOWN  1001

LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow)
{
    HWND hwnd;
    MSG messages;
    WNDCLASS wc = {0};

    wc.hInstance      = hThisInstance;
    wc.lpszClassName  = "TestAppClass";
    wc.lpfnWndProc    = WindowProcedure;
    wc.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground  = (HBRUSH)COLOR_BACKGROUND;

    if (!RegisterClass(&wc))
        return 1;

    hwnd = CreateWindow("TestAppClass", "Test app",
                        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        200, 100,
                        NULL, NULL, hThisInstance, NULL);

    while (GetMessage(&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }

    return messages.wParam;
}


LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HWND hEdit, hUpDown;

    switch (message)
    {
        case WM_CREATE:
            // kreiraj kontrolu čiju će vrijednost updown kontrola kontrolirati
            hEdit = CreateWindowEx(WS_EX_CLIENTEDGE,
                                   WC_EDIT, "0",
                                   WS_CHILD | WS_VISIBLE | ES_NUMBER | ES_RIGHT,
                                   20, 20, 100, 20,
                                   hwnd, IDC_EDIT, GetModuleHandle(NULL), NULL);

            // kreiraj updown kontrolu
            hUpDown = CreateWindow(UPDOWN_CLASS, NULL,
                                   WS_CHILD | WS_VISIBLE |
                                   UDS_SETBUDDYINT | UDS_ALIGNRIGHT,
                                   0, 0, 0, 0,
                                   hwnd, IDC_UPDOWN, GetModuleHandle(NULL), NULL);

            // postavi editbox kao 'buddy' od updown kontrole
            SendMessage(hUpDown, UDM_SETBUDDY, hEdit, 0);

            // Bez ovoga se updown kontrola ponaša obratno, strelica dolje
            // povećava vrijednost, strelica gore smanjuje vrijednost
            // vidi: http://blogs.msdn.com/b/oldnewthing/archive/2005/12/22/506725.aspx
            SendMessage(hUpDown, UDM_SETRANGE, 0, MAKELPARAM(1000, 0));
            break;

        case WM_DESTROY:
            PostQuitMessage(0);
            break;

        default:
           return DefWindowProc(hwnd, message, wParam, lParam);
    }

    return 0;
}

 

Referenca

 

Primjer by MS (ne baš intuitivan IMHO, ali nek se nađe)

Primjer by FoosYerDoos (iz kolekcije ostalih primjera)

To understand what recursion is, you must first understand recursion.
Poruka je uređivana zadnji put sri 18.12.2013 0:05 (rustweaver).
11 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
srky.du kaže...
Cartman93 kaže...

meni ne treba pravi kod vec me zanima nacin na koji se moze rijesiti zadatak. btw programiram u C-u ali to sad nije bitno. dakle zadatak:

 

imam strukturu podataka (npr. float brojeva). ja bih trebao napisati funkciju koja ce mi napraviti sve kombinacije (ne permutacije!) tih brojeva i spremiti ih. npr imam polje ili listu:

1,2,3,4,5,6,7,8. ako je argument u funkciji 2 onda program treba ispisati (1,2) (1,3) (1,4) ... (2,3) (2,4)... (3,4) itd. ako je argument 4 onda su kombinacije (1,2,3,4) (1,2,3,5) (1,2,3,6)...(1,2,4,5) (1,2,4,6) itd.

dakle korisnik upisuje argument na temelju kojeg se rade grupe.

ja sam razmisljao napraviti za svaki argument(prvih 5-6 brojeva) novu funkciju, ali to mi je previse posla pa me zanima da li je moguce napisati jednu funkciju koja ce izraditi kombinacije na opisani nacin.

i zanima me koja struktura podataka je najbolja (polje, lista, red,stablo,???...).

 

vremenska slozenost algoritma mi nije pretjerano bitna, ali bilo bi pozeljno da je manja od O(2^n).

Mislim da je rekurzija najjednostavnije rjesenje, ja sam napisao da ti ispisuje skupove, a ti mozes napisat da ih ubaci u neku strukturu.
I struktrura najbolja za sto?  

#include <iostream>

#include <vector>

using namespace std;

 

vector<int> nums;

vector<int> sol;

 

void rec(int dep, vector<int> &sol) {

   if (dep != 0)

     for (int i = 0; i < nums.size(); i++) {

       sol.push_back(nums[i]);

       rec(dep-1, sol);

       sol.pop_back();

     }

   else {

     for (int i = 0; i < sol.size(); i++)

       cout << sol[i] << " ";

     cout << endl;

   }

}

 

 

int main() {

   nums.push_back(2);

   nums.push_back(3);

   nums.push_back(5);

   nums.push_back(7);

   nums.push_back(11);

 

   rec(2, sol);

   return 0;

}

jel moze taj program u C-u ako nije problem? ne znam c++ pa su mi neki djelovi nejasni (npr vector???).

 

najbolja struktura za pohraniti pocetne brojeve (struktura koja se salje u funkciju). bilo bi pozeljno da je linked list jer u programu ne znam koliko ce tocno biti brojeva, ali i obicno polje je isto ok(lakse za napisati).

13 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Koju preporucate stranicu kao jednu od boljih stranica za tutoriale o C++-u?

Zelim pocet uciti, pa da krenem negdje. I da, neka bude za vise manje totalne pocetnike, i ako nesto ne znam, podsjetit cu se preko toga... {#}

[img]http://ch-slike.com/images/2013/09/09/buyYn.png[/img]
 
0 0 hvala 0
11 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Svenos kaže...

Koju preporucate stranicu kao jednu od boljih stranica za tutoriale o C++-u?

Zelim pocet uciti, pa da krenem negdje. I da, neka bude za vise manje totalne pocetnike, i ako nesto ne znam, podsjetit cu se preko toga... {#}

youtube je vise-manje ok (ako znas engleski). cak je i zanimljivije kad se uci uz video. :)

13 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Cartman93 kaže...
Svenos kaže...

Koju preporucate stranicu kao jednu od boljih stranica za tutoriale o C++-u?

Zelim pocet uciti, pa da krenem negdje. I da, neka bude za vise manje totalne pocetnike, i ako nesto ne znam, podsjetit cu se preko toga... {#}

youtube je vise-manje ok (ako znas engleski). cak je i zanimljivije kad se uci uz video. :)

Znam engleski, ima li nekog posebnog youtubera ili da pogledam videe od lika koji ima najvise lajkova/gledanja?

[img]http://ch-slike.com/images/2013/09/09/buyYn.png[/img]
12 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
Cartman93 kaže...

jel moze taj program u C-u ako nije problem? ne znam c++ pa su mi neki djelovi nejasni (npr vector???).

 

najbolja struktura za pohraniti pocetne brojeve (struktura koja se salje u funkciju). bilo bi pozeljno da je linked list jer u programu ne znam koliko ce tocno biti brojeva, ali i obicno polje je isto ok(lakse za napisati).

Za n brojeva i velicinu k=3, algoritam je ugrubo (pseudo kod):

for i=1 to n-2
  for j=i+1 to n-1
    for k=j+1 to n
    printf i,j,k

Svaki novi indeks mora bit barem za 1 veci od prethodnog.
Ovo nije tesko poopciti za bilo koji k preko rekurzije. I uzet jedno polje da pamti prijasnje indekse (umjesto i,j,k gore) da znas koliko elemenata imas.
Za svaki indeks moras znati odakle pocinje i dokle ide. Sve skupa ti treba 4 argumenta, tj. 5 ako ne zelis globalnu varijablu za polje:
void combinations(int curIndex, int start, int k, int size)

Unutar funkcije ces imat petlju: for (int i=start; i<= size-k+1; i++).
Ako je curIndex==size, onda si gotov i samo ispisujes cijelo polje. Inace pozivas rekurzivno combinations(curIndex+1, i+1, k-1, size).
Iz main() funkcije pozivas sa comb(1, 1, k, n);

Nisam bas sve detalje objasnio, ali uz malo truda i razmisljanja bi trebalo bit dovoljno, reci ako zapnes...

11 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
rustweaver kaže...

Primjer by FoosYerDoos (iz kolekcije ostalih primjera)

Hvala Ti puno, spasio si me :)

Moji pokušaji traženja vjerojatno nisu bili uspješni jer sam cijelo vrijeme tražio spin control, umjesto updown koji je puno češći :)

 

Na toj stranici ima stvarno puno korisnih stvari, već sam si ubacio i razne druge stvari od tamo u program :D

 

BTW, jel postoji neki razlog zašto ljudi ne koriste enum{ }; na numeriranje konstanti vezanih za child windowe? kolko sam zamijetio obično koriste vrijednosti od 100 na dalje. jel postoji mogućnost da program vrati wParam izvan mojih definiranih?

11 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Svenos kaže...
Cartman93 kaže...
Svenos kaže...

Koju preporucate stranicu kao jednu od boljih stranica za tutoriale o C++-u?

Zelim pocet uciti, pa da krenem negdje. I da, neka bude za vise manje totalne pocetnike, i ako nesto ne znam, podsjetit cu se preko toga... {#}

youtube je vise-manje ok (ako znas engleski). cak je i zanimljivije kad se uci uz video. :)

Znam engleski, ima li nekog posebnog youtubera ili da pogledam videe od lika koji ima najvise lajkova/gledanja?

za pocetnike bi trebali svi biti u redu. mozda pogledaj tko ima vise pozitivnih lajkova. za malo naprednije korisnike preporucujem mycodeschool https://www.youtube.com/user/mycodeschool . on i u teoriji i u programu dobro sve objasni(pointeri, adt, sortiranja itd). radi u c i c++.

11 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
CyberK kaže...
Cartman93 kaže...

jel moze taj program u C-u ako nije problem? ne znam c++ pa su mi neki djelovi nejasni (npr vector???).

 

najbolja struktura za pohraniti pocetne brojeve (struktura koja se salje u funkciju). bilo bi pozeljno da je linked list jer u programu ne znam koliko ce tocno biti brojeva, ali i obicno polje je isto ok(lakse za napisati).

Za n brojeva i velicinu k=3, algoritam je ugrubo (pseudo kod):

for i=1 to n-2
  for j=i+1 to n-1
    for k=j+1 to n
    printf i,j,k

Svaki novi indeks mora bit barem za 1 veci od prethodnog.
Ovo nije tesko poopciti za bilo koji k preko rekurzije. I uzet jedno polje da pamti prijasnje indekse (umjesto i,j,k gore) da znas koliko elemenata imas.
Za svaki indeks moras znati odakle pocinje i dokle ide. Sve skupa ti treba 4 argumenta, tj. 5 ako ne zelis globalnu varijablu za polje:
void combinations(int curIndex, int start, int k, int size)

Unutar funkcije ces imat petlju: for (int i=start; i<= size-k+1; i++).
Ako je curIndex==size, onda si gotov i samo ispisujes cijelo polje. Inace pozivas rekurzivno combinations(curIndex+1, i+1, k-1, size).
Iz main() funkcije pozivas sa comb(1, 1, k, n);

Nisam bas sve detalje objasnio, ali uz malo truda i razmisljanja bi trebalo bit dovoljno, reci ako zapnes...

hvala, malo cu to prouciti i probati isprogramirati sad kad dođu praznici.

15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
C je programski jezik kaže...
BTW, jel postoji neki razlog zašto ljudi ne koriste enum{ }; na numeriranje konstanti vezanih za child windowe? kolko sam zamijetio obično koriste vrijednosti od 100 na dalje. jel postoji mogućnost da program vrati wParam izvan mojih definiranih?

Kojih konstanti? Ako pričaš o konstanti koja se stavi na mjesto HMENU parametra CreateWindow funkcije i koja ti kasnije služi kao identifikator prozora/kontrole, onda je razlog zašto se koristi makro zapravo tehničke prirode. Naime u slučaju da koristiš resurse, resource kompajler razumije makroe, ali ne i enumerirane tipove (ili se barem samo windres tako ponaša), pa se navikneš koristiti makroe za to.

 

Ako te konstante nisu namijenjene za resource kompajler, onda možeš slobodno koristiti enumerirane tipove.

 

U ovom mom primjeru samo zamijeniš:

#define IDC_EDIT    1000
#define IDC_UPDOWN  1001

 

sa:

enum CtrlID {IDC_EDIT = 1000, IDC_UPDOWN};

 

To understand what recursion is, you must first understand recursion.
17 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
Cartman93 kaže...
CyberK kaže...
Cartman93 kaže...

jel moze taj program u C-u ako nije problem? ne znam c++ pa su mi neki djelovi nejasni (npr vector???).

 

najbolja struktura za pohraniti pocetne brojeve (struktura koja se salje u funkciju). bilo bi pozeljno da je linked list jer u programu ne znam koliko ce tocno biti brojeva, ali i obicno polje je isto ok(lakse za napisati).

Za n brojeva i velicinu k=3, algoritam je ugrubo (pseudo kod):

for i=1 to n-2
  for j=i+1 to n-1
    for k=j+1 to n
    printf i,j,k

Svaki novi indeks mora bit barem za 1 veci od prethodnog.
Ovo nije tesko poopciti za bilo koji k preko rekurzije. I uzet jedno polje da pamti prijasnje indekse (umjesto i,j,k gore) da znas koliko elemenata imas.
Za svaki indeks moras znati odakle pocinje i dokle ide. Sve skupa ti treba 4 argumenta, tj. 5 ako ne zelis globalnu varijablu za polje:
void combinations(int curIndex, int start, int k, int size)

Unutar funkcije ces imat petlju: for (int i=start; i<= size-k+1; i++).
Ako je curIndex==size, onda si gotov i samo ispisujes cijelo polje. Inace pozivas rekurzivno combinations(curIndex+1, i+1, k-1, size).
Iz main() funkcije pozivas sa comb(1, 1, k, n);

Nisam bas sve detalje objasnio, ali uz malo truda i razmisljanja bi trebalo bit dovoljno, reci ako zapnes...

hvala, malo cu to prouciti i probati isprogramirati sad kad dođu praznici.

Tu se radi o kombinacijama bez ponavljanja, odnosno ako imamo n elemenata k različitih kombinacija imamo n! / (k! * (n-k)!), odnosno redosljed elemenata nije bitan , a u skupu (1,2,3,4) kombinacija (1,2) i (2,1) su iste kombinacije.

 

Možemo to riješiti i dvostrukom rekurzijom.

 

void kombinacije(int *niz, int *nizK, int n, int k, int indexN, int indexK)
{
    if (indexK == k)
    {
       for (int i = 0; i < k; i++)
       {
          printf("%d ", nizK[i]);
       }
       printf("\n");
       return;
    }
    if (indexN == n) return;

    nizK[indexK] = niz[indexN];
    kombinacije(niz, nizK, n, k, indexN + 1, indexK + 1);
    kombinacije(niz, nizK, n, k, indexN+1, indexK);
}

 

a parametri funkcije imaju sljedeće značemje:

niz - skup od n elemenata predstavljen kao niz

nizK - skup k kombinacija od skupa od n elemenata predstavljen kao niz

n - broj elemenata skupa

k - broj kombinacija od n elemenata

indexN - tekući index niza n elemenata

indexK - tekući index niza od k elemenata

 

U main metodu dinamički alociramo niz od n elemenata i niz od k kombinacija, pa pozovemo funkciju

kombinacije(niz, nizK, n, k, 0, 0)

 

Poruka je uređivana zadnji put pet 20.12.2013 13:21 (Floki).
11 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Ovako imam jedan problem.. 

 

Novi sam korisnik (izvinjavam se ako sam fulao nesto).. :) 

Dobio sam neke projektne zadatke, jedan od njih je sa datotekama, nisam ih bas shvatio dobro, tj.. skroz slabo.. evo zadatka: 

 

"" Data je datoteka "ulaz.txt" u koju su upisani brojevi tipa long.

a) Napisati funkciju koja sve brojeve u datoteci zamjenjuje njihovom apsolutnom vrijednošću.

b) Napisati funkciju koja će brojeve veće od 100 iz datoteke "ulaz.txt" prepisati u datoteku "vece100.txt" , poredane po rastućem redoslijedu "" 

 

Eh sad.. radi se o sljedećem.. drug mi je malo pomogao, uradili smo djelimično.. ali sad kad pokrenem taj zadatak pod a) on ne radi, otvorim taj .txt fajl u kojem bi trebali bit brojevi (njihova apsolutna vrijednost, ali bude prazan), a pod b) ne sortira ih u novoj datoteci, već ih ispiše sve jedan ispod drugog.. 

Evo izgled tih zadataka:

Pod a) http://i.imgur.com/V9ixfrF.png

Pod b) http://img13.imageshack.us/img13/2968/h3if.png

 

Pa ako ima neko ko je voljan pomoći mi, i zna uradit ova 2 zadatka, bio bih zahvalan.. nzm kako se mogu odužit, ako bude sve radilo dogovoricemo se, ugl.. bitno je.. :D 

Damir Begic
Poruka je uređivana zadnji put pon 23.12.2013 23:13 (Niwwiak).
 
0 0 hvala 0
16 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori

Kako odrediti koliko paragrafa ima u nekom txt fajlu?Ako u notepadu napravim paragrafe,gets učita samo prvi red,a ostale redove zanemari i kada tražim \n nikada ga ne nađe.Hvala.

AC Milan - IL CLUB PIU' TITOLATO AL MONDO
12 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori
Pozdrav evo malo gledam nešto oko vektora i po knjizi mi ima primjer koji kada ga kompajliram javlja mi grešku kod for petlje za (int elem:v), do čega bi mogla biti greška?
void print(vector<int> v){
for ( int elem : v)
cout << elem << ;
cout << endl;
}
Koja mi je razlika između liste i vektora, iako su mi indentični po primjeru u knjizi koje su pogodnosti jednog a koje drugog za raditi na nečemu?
 
0 0 hvala 0
17 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Xyloto kaže...
Pozdrav evo malo gledam nešto oko vektora i po knjizi mi ima primjer koji kada ga kompajliram javlja mi grešku kod for petlje za (int elem:v), do čega bi mogla biti greška?
void print(vector<int> v){
for ( int elem : v)
cout << elem << ;
cout << endl;
}

Greska je u tome sto je to range-based for petlja koja je u C++-u definirana tek u novijem C++11 (C++0x) standardu. Kod tebe je ocito da kompajliras s kompajlerom koji kompajlira po starijem standardu u kojem takvih for petlji nije bilo. Ovisno o tome koji kompajler imas i koju verziju kompajlera, dodas opciju koja mu kaze da kompajlira po novom standardu.

 

Ja npr. imam gcc 4.6.3 tako da moram ukljuciti podrsku za C++0x da bi mogao koristiti range-based for petlje - kompajliranje bih tada vrsio ovako (u terminalu):

gcc -Wall -std=c++0x main.c -o mojprogramPrimjeti boldano, s tim sam rekao kompajleru da zelim koristiti C++0x standard (s kojim onda gcc 4.6 kojeg imam podrzava takve for petlje).

Perhaps today IS a good day to die. PREPARE FOR RAMMING SPEED!
Poruka je uređivana zadnji put čet 26.12.2013 23:50 (1domagoj1).
12 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Zanima me zašto ovaj program ne radi ako maknem cin.ignore(1,'\n') liniju koda, što mi to predstavlja?

 

int main() 

 char imedatoteke[80]; char buffer[255]; 

 cout << "Ime datoteka: "; cin >> imedatoteke; cin.ignore(1,'\n'); 

 

 ofstream izlaz(imedatoteke); 

 // formiraj izlaznu datoteku 

 

 cout << "Otkucajte liniju teksta: "; 

 cin.getline(buffer,255); // dobavi tekst s tipkovnice 

 izlaz << buffer << "\n"; // i upiši u datoteku 

 izlaz.close(); // zatvori datoteku 

 

 ifstream ulaz(imedatoteke); // otvori za 

č

itanje 

 

cout << "\nU datoteci je upisan tekst: \n"; 

 // Dobavi i ispiši sadržaj datoteke na standardni izlaz 

 char ch; 

 while (ulaz.get(ch)) cout << ch; 

 cout << "\n***Kraj***\n"; 

 return 0; 

 
0 0 hvala 0
15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Problem je u ulaznom streamu i nedoslijednosti funkcija koje čitaju iz njega. Odnosno kada kombiniraš funkcije koje se različito ponašaju u radu sa streamom.

 

Kada stisneš tipku enter, u stream se doda tzv. newline znak ('\n'). Stream nije ništa drugo nego niz znakova. Funkcije iz njega čitaju znakove (ili nizove znakova) znak po znak koristeći newline kao oznaku završetka jedne linije teksta, i istovremeno iz streama uklanjaju svaki pročitani znak. Tu počinje zabavni dio. Neke funkcije dođu do newline znaka, pročitaju i njega, uklone ga iz streama i završe sa radom, dok druge dođu do njega i odmah završe sa radom (ne uklone ga).

 

'cin' ne uklanja newline iz streama i kada nakon njega koristiš 'getline' koji pokušava pročitati jednu liniju teksta (koja očigledno završava sa newline znakom) dobiješ jednu praznu liniju.

 

Rješenje je nakon poziva na 'cin' ručno ukloniti newline iz streama koji je cin ostavio unutra. I to postižeš upravo sa cin.ignore.

 

Postoje slične zavrzlame i u C-u samo što tamo nema standardnog rješenja za taj problem pa se često pribjegava ili korištenju getchar petlje ili korištenju fflush funkcije na ulaznom streamu (što je nedefinirano i neportabilno).

To understand what recursion is, you must first understand recursion.
17 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Samo da se nadovezem na rusta, da opisem postupak izvrsavanja, dakle kad se dode do:

cin >> imeDatoteke;ceka se sto ce korisnik upisati.

Neka korisnik npr. upise: mojadat.txt i pritisne enter.

U streamu ce se nalaziti:

mojadat.txt\n

 

Tada

cin >> imeDatotekeuzima znak po znak iz streama sve dok ne dode do razmaka. U racunarskoj znanosti to je bilo koji znak koji predstavlja bilo horizontalni, bilo vertikalni prazni prostor, dakle ukljucuje tabulare, novi redak, mali razmak (od jednog znaka) i sl.

 

Kao sto je rust vec rekao, neke funkcije/metode uklone \n, a neke ne. Cin ga ne uklanja, stoga nakon sto se izvrsi cin >> imeDatoteke, u streamu se sada nalazi:

\nOvaj tekst prije cin je pojeo i pospremio u polje imeDatoteke.

 

Tada dolazimo do:

cin.ignore(1, '\n');Prvi argument je broj znakova koje vadimo iz streama (i odbacujemo). Drugi argument je delimiter, vadimo znakove iz streama dok ne naletimo na njega (ili na EOF, ako nikad ne dodemo do delimitera), kad naletimo prestajemo vaditi i odbacivati znakove iz streama. Tako da ta linija zapravo vadi i odbacuje iz streama jedan znak, a delimiter je upravo taj jedan znak, tj. \n.

 

Nakon toga mozes dalje normalno koristiti ostale cin funkcije/metode.

 

Ovo sto je rust napomenuo za getchar petlju u C-u, ako kome zatreba, to izgleda ovako:

while((c = getchar()) != '\n' && c != EOF);Naravno, char c mora biti definiran prije.

Perhaps today IS a good day to die. PREPARE FOR RAMMING SPEED!
15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Malen offtopic, ali za vas koji koristite Code::Blocks, verzija 13.12 je dostupna za download. Dosta poboljšanja, pogotovo u GDB podršci i code completion parseru.

 

Naravno, pazite koju verziju skidate (sa kompajlerom ili bez njega) da ne bi opet bilo "code::blocks mi neće kompajlirati program" problema. :P

To understand what recursion is, you must first understand recursion.
14 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

da li mogu pomoću break-a jednostavno "ugasiti" rekurziju nakon što nađem rješenje?

Moj PC  
0 0 hvala 0
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Ne. Break se koristi u petljama a ne u rekurzijama.

Kada lajavci laju onda završe ovako: http://i471.photobucket.com/albums/rr77/toropreto/2012-07-0813_30_07.gif
17 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
etnes kaže...

da li mogu pomoću break-a jednostavno "ugasiti" rekurziju nakon što nađem rješenje?

Ne, break se koristi samo kod petlji (while, for...). Jednostavno vrati sto vratiti moras, ne znam kakav ti je kod, ali npr.:

int rek_funkcija(int a)
{
    if (a > 10) {
        return a;
    }
    a += rek_funkcija(a + 1);
   
    return a;
}

Perhaps today IS a good day to die. PREPARE FOR RAMMING SPEED!
14 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

imam još jedno pitanje. nazvao dvije matrice (vector<vector<int> >) "left" i "right" i complajler mi je vraćao grešku. s obzirom da to nisu ključne riječi u čemu je problem? biblioteke koje sam koristio su cstdlib, iostream, string, vector. da li je možda u njima postoji neka naredba left i right pa zato ne mogu kompajliratit il je nešto treće. inače kod je 100% ispravan. kad sam promjenio naziv tih matrica, program je radio skroz ok. 

 

EDIT: proguglo sam malo i našao da su to neke naradbe iz iostream-a

Poruka je uređivana zadnji put pon 30.12.2013 21:26 (etnes).
Moj PC  
0 0 hvala 0
15 godina
online
Re: Programiranje u C++-u - pitanja i odgovori
etnes kaže...

imam još jedno pitanje. nazvao dvije matrice (vector<vector<int> >) "left" i "right" i complajler mi je vraćao grešku. s obzirom da to nisu ključne riječi u čemu je problem? biblioteke koje sam koristio su cstdlib, iostream, string, vector. da li je možda u njima postoji neka naredba left i right pa zato ne mogu kompajliratit il je nešto treće. inače kod je 100% ispravan. kad sam promjenio naziv tih matrica, program je radio skroz ok. 

 

EDIT: proguglo sam malo i našao da imaju su to neke naradbe iz iostream-a

Napiši koju ti grešku kompajler daje.

 

EDIT: Tek sam sad vidio da si našao rješenje problema.

Poruka je uređivana zadnji put pon 30.12.2013 21:09 (captain_soap_McTawish).
11 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Postoji li neki pametan način za čitanje polja charova kao datoteku, liniju po liniju.

Sada trenutno koristim sscanf i onda čitam %d, %f, ... koristim i %[^\n] za čitanje stringova, cijelo polje od više redaka čitam u jednom sscanfu. Ali što kad mi se u retku ne nalazi ništa a tamo očekujem int? onda mi počne nešto dalje čitati u krivu varijablu, mogo bi napraviti funkciju koja vraća red po red u polja i postavlja pointer tamo gdje je stala s čitam (slično kad fscanf), ali mi se neda ako ima nešto pametnije.

 

 

 
0 0 hvala 0
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

fgets čita cijeli redak u char polje.

Kada lajavci laju onda završe ovako: http://i471.photobucket.com/albums/rr77/toropreto/2012-07-0813_30_07.gif
11 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

fgets čita samo iz datoteke, ja bi čitao iz polja charova. Odnosno čitam neke fileove s servera i onda ih čitam iz polja, ne želim stvarati nikakve tmp datoteke.

 
0 0 hvala 0
E-mail:
Lozinka:
 
vrh stranice