Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Programowanie w C++ niezrozumiałe funkcje

Darklimho 07 Kwi 2012 18:53 1959 20
  • #1 07 Kwi 2012 18:53
    Darklimho
    Poziom 14  

    Witam, mam taki szkielet kodu:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    I teraz moje pytania:

    1. Chciałbym, żeby utworzony na początku plik automatycznie był użyty w drugiej funkcji, czyli żeby w nim zapisano dane.
    2. Żebym mógł wczytać dane z wybranego pliku

    Nie wiem czy tan program nie jest zbyt skomplikowany jak dla takiego amatora jak ja :D

    0 20
  • #2 07 Kwi 2012 20:16
    quniq
    Poziom 21  

    Program jest banalny. Nie do końca rozumiem w czym widzisz problem, ale zdaje się, że cały czas korzystasz z pliku "bmi.txt". Powinieneś podmienić ten tekst "bmi.txt" na nazwę zmiennej (tzn filename). Chyba o to chodzi.
    Btw, ja tu nie widzę drugiej funkcji O.o

    edit: już widzę. Musisz przekazać do drugiej funkcji zmienną filename. Powinieneś wczytać nazwę pliku jeszcze przed wywołaniem pierwszej funkcji (np w mainie). Wtedy musisz przekazać tą zmienną (filename) do pierwszej funkcji. I jak już napisałem, cały czas korzystasz z pliku "bmi.txt", który jest na sztywno wpisany w kod programu.

    0
  • #3 07 Kwi 2012 20:21
    Darklimho
    Poziom 14  

    Właśnie zamiast pliku bmi.txt nie wiem jak wprowadzić zmienną fname, zrobiłem tak:

    ifstream ifile(fName); ale jakiś błąd wyskoczył, można w ogóle tak zrobić?

    0
  • #5 07 Kwi 2012 20:42
    Darklimho
    Poziom 14  

    Jak zmienić ze string na char już mi raz koledzy pomogli zrobić więc teraz postaram się tak zrobić i sprawdzę czy będzie jak chce :) dzięki za nakierowanie :)

    0
  • Pomocny post
    #6 07 Kwi 2012 20:43
    _alfred_
    Poziom 16  

    Darklimho napisał:
    ifstream ifile(fName); ale jakiś błąd wyskoczył, można w ogóle tak zrobić?

    Zrób tak
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Poza tym kolejnym razem przyjrzyj się dokładnie co wyświetla kompilator. U mnie wyświetlił coś takiego
    Cytat:
    main.cpp:15: error: no matching function for call to 'std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(std::string&)'

    Jak widać nie mógł znaleźć odpowiedniej funkcji dla podanych argumentów, wniosek - są złe. Tak jak napisał quniq.

    0
  • #7 08 Kwi 2012 19:38
    Darklimho
    Poziom 14  

    Podmieniłem ifstream ifile("bmi.txt"); na ifstream ifile(fName.c_str()); i wyskakuje:
    80 16 [Error] 'fName' was not declared in this scope

    A w ogóle zauważyłem, że w pierwszej funkcji nie tworzy mi pliku.

    0
  • Pomocny post
    #8 09 Kwi 2012 13:15
    _alfred_
    Poziom 16  

    To znaczy, że nie zadeklarowałeś zmiennej "fName". Chyba wiesz, że zmienne mają ograniczony zasięg? "Scope" = miejsce, zasięg, zakres.

    Poza tym wstaw CAŁY kod, od pierwszej linijki do ostatniej. Bo to co wkleiłeś to nie będzie działać tak jak byś chciał, brak wielu rzeczy.

    0
  • #9 09 Kwi 2012 21:01
    Darklimho
    Poziom 14  

    Tak na serio to jeszcze nie wiedziałem, że mają zasięg. Jestem w początkowej fazie programowania.
    To jest zrobione za pomocą funkcji switch i 1 case to jest nadanie nazwy pliku, wpisanie danych podanych po podaniu nazwy pliku i zapisanie ich tam, a 2 case pokazuje dane zapisane w danym pliku, najlepiej jak bym mógł wpisać nazwę pliku, a jeszcze lepiej jak by się dało wybrać plik strzałkami i zatwierdzić enterem :)

    Trochę masło maślane :)

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Dodano po 38 [minuty]:

    Aaa odkryłem, że wszystko było by (chyba) ok gdybym wiedział jak zamienić string na char :D koledzy pokazali jak zamienić string na double, a z char to nie działa :D

    0
  • Pomocny post
    #10 09 Kwi 2012 22:09
    _alfred_
    Poziom 16  

    1. Popraw formatowanie kodu.
    2. Kod się nie kompiluje, nie zgadzają się klamry zamykające/otwierające.
    3. Wywal tego while(1), czegoś takiego się nie robi, jest tu niepotrzebny.
    4. Etykietę "poczatek" daj po deklaracji zmiennych (przed wyświetleniem menu).
    5. Przenieś "fName" poza "switcha", wtedy będziesz mógł zamienić "bmi.txt" na tego "fName" podanego przez użytkownika.
    6. Stringa na *char zamienia się tak "string.c_str()", podawałem już dwa razy, a char bez gwiazdki to pojedynczy znak, string to łańcuch znaków i tu nie ma co zamieniać.

    0
  • #11 09 Kwi 2012 22:19
    Darklimho
    Poziom 14  

    Niby wszystko ok ale jak napiszę:

    ifstream ifile(fName);

    to

    wyskakuje błąd:

    [Error] no matching function for call to 'std::basic_ifstream<char>::basic_ifstream(std::string&)'

    Na pewno chodzi o to jak już było wcześniej, żeby zamienić string-fName na jakiegoś char, ale jak?

    Dodano po 1 [minuty]:

    Nie było 6 punktu jak odpisywałem

    0
  • Pomocny post
    #12 09 Kwi 2012 22:19
    _alfred_
    Poziom 16  

    Przeczytaj punkt 6! Pytasz o to już drugi raz.

    Darklimho napisał:
    Nie było 6 punktu jak odpisywałem

    Ale to już podawałem wcześniej 2 razy, powinieneś już wiedzieć, nawet tłumaczyłem co znaczy ten błąd zgłaszany przez kompilator.

    0
  • #13 13 Kwi 2012 15:50
    Darklimho
    Poziom 14  

    Wszystko już fajnie działa :)
    A da się zrobić teraz przeglądarkę plików, które zostały utworzone w tym programie?

    0
  • #14 13 Kwi 2012 16:16
    _alfred_
    Poziom 16  

    Wszystko się da :)

    Jeśli interesuje Ci lista utworzonych plików dla aktualnie uruchomionego programu (danej sesji) to wystarczy nowa zmienna, tablica stringów, która będzie przechowywać nazwy nowo tworzonych plików, i na żądanie ją wyświetlać.

    Jeśli chciałbyś przeglądać pliki tworzone podczas wielu uruchomień programu to musiałbyś przeglądać folder, gdzie są zapisywane te pliki i na podstawie rozszerzenia (+ jakaś weryfikacja czy to nasz prawidłowy plik) stworzyć taką listę i wyświetlić użytkownikowi.

    Później to już tylko wczytać wybrany przez użytkownika plik.

    0
  • #15 13 Kwi 2012 16:56
    Darklimho
    Poziom 14  

    Właśnie takie coś jak ta druga propozycja mnie interesuje :)
    Ale przyznam się, że nie mam pojęcia jak to zrobić :D
    Może jakieś przykłady? :D

    0
  • #16 13 Kwi 2012 20:25
    _alfred_
    Poziom 16  

    W tym celu zmieniłbym rozszerzenie tworzonych plików z txt na swój własny albo/i umieścił w pierwszej linii pliku jakąś sygnaturę (jakiś tekst) na podstawie której można by się upewnić, że to plik stworzony przez Twój program.

    Do znalezienia plików w folderze możesz użyć biblioteki dirent.h (dostępna w większości kompilatorów, brak jej w Microsoft Visual C++, ale dostępna jest jej implementacja dla tego kompilatora). Jednak lepszym wyjściem byłoby zastosowanie biblioteki Boost.Filesystem, trzeba tylko ją pobrać i dołączyć do projektu.

    0
  • #17 17 Kwi 2012 20:01
    Darklimho
    Poziom 14  

    Jak na razie sobie podaruję to :D
    Ale mam inną prośbę czy mógłby mi ktoś napisać krok po kroku co się robi w tym kodzie i dlaczego właśnie to się stosuje:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Nie potrafię zrobić głupiego programu matematycznego a zabieram się za nie wiem co.
    Np. zrobić program, żeby wypisał Ciąg Fibonacciego od zakresu do zakresu lub np. pierwsze 6 liczb.

    0
  • #18 17 Kwi 2012 22:19
    _alfred_
    Poziom 16  

    Funkcja główna, od niej rozpoczyna się wykonywanie programu

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Wypisanie tekstu w kosoli
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Deklaracja zmiennych typu int
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Wczytanie podanej w konsoli liczby do zmiennej a
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Wypisanie tekstu w konsoli i wczytanie podanej liczby (w konsoli) do zmiennej b
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Jeśli reszta z dzielenia liczby przechowywanej w zmiennej a przez 2 jest różna od 0 (zera) to do zmiennej a zapisujemy wartość tej zmiennej plus 1, czyli do a dodajemy 1
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Kopiujemy zawartość zmiennej a do zmiennej suma
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Póki wartość zmiennej a jest mniejsza lub równa tej w zmiennej b
    Kod: cpp
    Zaloguj się, aby zobaczyć kod
    wypisujemy w konsoli wartość zmiennej a i kończymy linię (wraz z opróżnieniem bufora)
    Kod: cpp
    Zaloguj się, aby zobaczyć kod
    do zmiennej a zapisujemy jej wartość powiększoną o 2 (do a dodajemy 2)
    Kod: cpp
    Zaloguj się, aby zobaczyć kod
    do zmiennej suma zostaje wpisana wartość tej zmiennej plus wartość w zmiennej a, czyli zwiększamy wartość sumy o a
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Darklimho napisał:
    i dlaczego właśnie to się stosuje:
    To sobie właśnie sam odpowiedziałeś (to zależy co program ma realizować, domyślam się, że chodzi o to co wspomniałeś)
    Darklimho napisał:
    Np. zrobić program, żeby wypisał Ciąg Fibonacciego od zakresu do zakresu lub np. pierwsze 6 liczb.

    A co to jest za ciąg masz wyjaśnione tutaj.

    A na przyszłość Link. Pod tym linkiem dowiesz się znaczenie więcej. Mam nadzieję, że na tym się zakończą tego typu pytania, na które w Internecie bez problemu można znaleźć odpowiedzi (wskazałem źródła, linki).

    0
  • #19 20 Kwi 2012 21:10
    Darklimho
    Poziom 14  

    _alfred_ napisał:
    do zmiennej suma zostaje wpisana wartość tej zmiennej plus wartość w zmiennej a, czyli zwiększamy wartość sumy o a

    Kod C++ - [zwiń]
    suma=suma+a;


    A powiedz mi tylko po co to jest dodane? Jakie to ma zadanie?

    0
  • #20 20 Kwi 2012 22:28
    _alfred_
    Poziom 16  

    Zadanie ma takie jak napisałem

    _alfred_ napisał:
    do zmiennej suma zostaje wpisana wartość tej zmiennej plus wartość w zmiennej a, czyli zwiększamy wartość sumy o a

    A po co to jest dodane? Nie wiem po co ktoś (Ty?) stworzył ten kod i jaki miał w tym cel. To jest zwykłe dodawanie do pierwszej liczby 2 aż będzie wynosiła ona tyle co druga podana liczba, a suma tu jest niepotrzebna, nic nie wnosi, jest zbędna.

    0
  • #21 20 Kwi 2012 22:30
    arnoldziq
    Moderator Programowanie

    3.1.17. Zabronione jest publikowanie wpisów obniżających ogólny poziom dyskusji, wynikających z lenistwa lub zawierających roszczeniowy charakter wypowiedzi.
    Wystarczy tego !

    0