Skocz do zawartości

Programowanie


  • Zaloguj się by odpowiedzieć
2929 odpowiedzi na ten temat

#2911 lukaszSA Napisany 23 listopad 2017 - 23:45

lukaszSA

    Overall expert

  • Forumowicze
  • 20642 Postów:

Opcję 1 Holden chyba od początku znał :hmmm:

 

Od początku uznałem, że pytanie brzmi "Jak zamienić tablice na stringa?". Chyba za bardzo komplikuję proste rzeczy. Nie nadaję się na nauczyciela :ok:


  • 0

#2912 Ryan Napisany 24 listopad 2017 - 14:49

Ryan

    Dominik D.

  • Administratorzy
  • 32401 Postów:
Nie wiem, czy znał całą opcję pierwszą. Normalny for - no raczej. Ale range based for nie jest taki zły w tym wypadku. Opcja 3 to typówka i nie nazwałbym tego pornografią (choć oczywiście, jak to w C++, boilerplate prawie jak w Javie). Opcja 2 to najbardziej idiomatyczne, jednolinijkowe rozwiązanie, które morduje kotka. No ale nie każdy kocha koty.

Ten post był edytowany przez Ryan dnia: 24 listopad 2017 - 14:49

  • 0

#2913 krak2610 Napisany 28 grudzień 2017 - 16:38

krak2610

    Dante

  • Forumowicze
  • 1412 Postów:

chce chociaz staz, dajcie mi staz :sciana: a przy tym seks z co najmniej srednio atrakcyjna ciapka

Jakie masz wykształcenie?
  • 0

#2914 Holden Napisany 15 luty 2018 - 17:35

Holden

    je m'appelle Ferdinand

  • Forumowicze
  • 9228 Postów:
w jaki sposob wpisac w strukture dane z pliku tekstowego?
mam strukture
typedef struct przedmiot {
char nazwa[50];
char prowadzacy[50];
int liczba_studentow;
int liczba_grup;
} Przedmiot; 
Powiedzmy, ze mamy tablice z 10 przedmiotami. I jak mam napisac ten plik tekstowy, dane dla 1 przedmiotu w jednej linijce? Czy dane dla kazdego .nazwa .prowadzacy w osobnej? I jak syntax ma wygladac ifstream << getline <<tablica[i].nazwa ??? Czy cos takiego?
  • 0

#2915 lukaszSA Napisany 15 luty 2018 - 18:00

lukaszSA

    Overall expert

  • Forumowicze
  • 20642 Postów:

Sam sobie wymyśl format i napisz parser


  • 0

#2916 Kurzy Napisany 15 luty 2018 - 18:32

Kurzy

    NIKT MNIE NIE LUBI

  • Forumowicze
  • 13711 Postów:
W C++ masz odczytywanie w bibliotece do plików funkcje czytania po linijce. Wiec iteracyjnie do bufora char* czyli tablicy znaków (załóż sobie jakaś wielkość) wczytujesz linijkę. I później przechodzisz po tablicy i sprawdzasz znaki. Jak natrafiam na znak separatora to kończysz i wiesz, ze to pierwsza właściwość struktury np. Dodatkowo sprawdzasz, konwwertujesz itp. W C++ niezła rzeźnia. W innych językach o wiele fajniej.

Zaznaczam, ze prawdopodobnie mogę pisać głupoty jeśli chodzi o C++.

Ten post był edytowany przez Kurzy dnia: 15 luty 2018 - 18:33

  • 0

#2917 Holden Napisany 15 luty 2018 - 19:07

Holden

    je m'appelle Ferdinand

  • Forumowicze
  • 9228 Postów:
W tym wypadku potrafi wyrzucic po kolei linijki w cout, ale nie potrafi przyporzadkowac rekordom tablica[i].bla odpowiednich wartosci
 
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

struct przedmiot {
string nazwa;
string prowadzacy;
int liczba_studentow;
int liczba_grup;
};


int main() {



int liczba = 5;
przedmiot tablica[liczba];
ifstream file_("test.txt");
string a[liczba];
string b[liczba];
int c[liczba];
int d[liczba];
if (file_.is_open()) {

for (int i=0;i<liczba;i++) {

		while (file_ >> a[i] >>   b[i] >>  c[i] >> d[i]) {
		
		cout << a[i] << " " <<   b[i] << " " <<  c[i] << " " <<   d[i] << "\n";
			tablica[i].nazwa = a[i];
			tablica[i].prowadzacy = b[i];
			tablica[i].liczba_studentow = c[i];
			tablica[i].liczba_grup = d[i];
		}
	file_.close();
}

}

for (int z=0; z<liczba;z++ ) {
	cout << tablica[z].nazwa << endl;
	cout << tablica[z].prowadzacy << endl;
	cout << tablica[z].liczba_studentow << endl;
	cout << tablica[z].liczba_grup << endl; 
}
return 0;

}

Tak wyglada plik tekstowy
 
Polski Sloboda 24 3
Matma Maslanka 28 2
Geografia Plomyk 21 5
Angielski Kaszu 26 4
Niemiecki Kulka 22 3  
tak wyglada kompilacja

wqtNKwd.png
  • 0

#2918 Kurzy Napisany 15 luty 2018 - 19:19

Kurzy

    NIKT MNIE NIE LUBI

  • Forumowicze
  • 13711 Postów:
Jakiś dziwny ten while masz...jak pamietamsqoje gownoprogramy w c++ to było wczytywanie linijki pliku w inny sposób a tutaj to wyglada tak prostu u Ciebie jakby to nie C++ było:p
  • 0

#2919 Ryan Napisany 16 luty 2018 - 15:36

Ryan

    Dominik D.

  • Administratorzy
  • 32401 Postów:
Nie używaj mutowalnej zmiennej do określania rozmiaru tablicy. Tzn. "const int liczba = 5;" dobrze, "int liczba = 5;" źle. I ogólnie nie używaj polskich nazw zmiennych. ;)

Po drugie: naucz się debugować kod. Gdybyś przestepował, zobaczyłbyś, że while (zgodnie z intencją) kręci się tak długo, jak długo są dane w pliku. Więc przy i == 0 do a[i], b[i]... i do tablica[i] wrzucisz kolejno dane ze wszystkich linii. Po czym while się skończy, wrócisz do fora (i==1) ale while się nie wykona (masz już EOF), więc znowu for dla i==2, i tak dalej. To znaczy byłoby tak, gdybyś nie miał close() wewnątrz fora (więc w pierwszym przebiegu pętli zamkniesz plik).

Ten while jest tam kompletnie zbędny, to jedno (albo for zbędny - jak kto woli). Zamknięcie pliku powinno być po forze, to drugie. Nie wiem po co Ci SoA jak chcesz wszystko trzymać w AoS (wyjaśnię dalej). A ogólnie to za używanie strumieni do czytania pliku (bez żadnej walidacji danych) zasługujesz na jakiegoś chińskiego wirusa.
 
int main() {
	const unsigned liczba = 5;
	przedmiot tablica[liczba];
	ifstream file_("test.txt");

	if (!file_.is_open())
		return 1;

	for (unsigned i = 0; i < liczba; i++)
		file_ >> tablica[i].nazwa >> tablica[i].prowadzacy >> tablica[i].liczba_studentow >> tablica[i].liczba_grup;
	file_.close();

	for (unsigned i = 0; i < liczba; i++) {
		cout << tablica[i].nazwa << endl << tablica[i].prowadzacy << endl;
		cout << tablica[i].liczba_studentow << endl << tablica[i].liczba_grup << endl;
	}

	return 0;
}
O co chodzi z AoS (array of structures), SoA (structure of arrays)? Masz już swoje "przedmiot tablica[liczba];" zdolne do przechowania wszystkich dancyh. To tablica struktur (AoS). Po co Ci do tego zbiór czterech zmiennych zdolnych do przechowania wszystkich wartości z poszczególnych pól struktury (gdybyś a, b, c i d wrzucił w strukturę - którą tu jest de facto wycinek stosu - miałbyś SoA, rozwiązanie często bardziej wydajne przy nieliniowym, wybiórczym dostępie do danych).

Poza tym potwornie mieszasz style kodu. Z czego się uczysz, z (tfu!) symfonii? To byłby kompletnie walidny (choć kiepski - wszystkie dane trzymasz na stosie) kod w C, gdyby nie to, że używasz stringa, ifstream i couta (ok, gówno i meh). Ale sensownym kodem C++ to też nie jest, bo nie tylko trzymasz na stosie dane, to jeszcze w plain old arrays zamiast jakimś kontenerze.

Powyższy kod "działa", ale nie rozwiązuje szeregu problemów: 1) alokacji, 2) na sztywno zapisanej liczby przedmiotów, 3) walidacji danych i obsługi niepoprawnego formatu pliku. I jeszcze kilku, których na szybko nie widzę.

Ten post był edytowany przez Ryan dnia: 16 luty 2018 - 15:38

  • 2

#2920 Holden Napisany 16 luty 2018 - 15:50

Holden

    je m'appelle Ferdinand

  • Forumowicze
  • 9228 Postów:
dziekuje :bowdown: Ucze sie z google ;) Polecasz jakas ksiazke do c++?
cos jest nie tak ze <string>? char slowo[50] jest lepsze z jakiegos powodu?
Dlaczego zawsze od poczatku ludzie sie tak martwia przepelnieniem pamieci? Czy po wyjsciu poza funkcje main pamiec nie jest czasem automatycznie czyszczona? Sorry, jesli pisze glupote

Ten post był edytowany przez Holden dnia: 16 luty 2018 - 15:50

  • 0

#2921 Schrodinger Napisany 16 luty 2018 - 15:52

Schrodinger

    PS4PRO + LG OLED 55B7V

  • Moderatorzy
  • 55539 Postów:
Jak uczysz się z Google to wiesz że książki są przereklamowane, zamiast tego jeśli jakimś cudem do tej pory nie trafiłeś to polecam ten link: https://stackoverflow.com/
  • 0

#2922 Holden Napisany 16 luty 2018 - 15:56

Holden

    je m'appelle Ferdinand

  • Forumowicze
  • 9228 Postów:
tak, jasne ze znam, po prostu jak juz kopiuje kod to szukam rozwiazania prostego i zrozumialego ;) I odpowiedzi so nie zawsze mi pasuja
  • 0

#2923 Ryan Napisany 19 luty 2018 - 14:12

Ryan

    Dominik D.

  • Administratorzy
  • 32401 Postów:

dziekuje :bowdown: Ucze sie z google ;) Polecasz jakas ksiazke do c++?

Szczerze? Nie wiem. C++ jest kosmicznie złożonym (przekomplikowanym) językiem i istniejące, dobre książki będą niezrozumiałe, a zrozumiałe książki nie będą zbyt dobre. :|
 

cos jest nie tak ze <string>?

Nie, tak jak napisałem ("stringa, ifstream i couta (ok, gówno i meh)") string jest ok.

 

Dlaczego zawsze od poczatku ludzie sie tak martwia przepelnieniem pamieci?


Nie chodzi o przepełnienie pamięci, tylko nadpisanie pamięci. Podasz do tego programu plik z 10 liniami i aplikacja wybuchnie. Nie z powodu braku pamięci, a błędnego zarządzania nią. Poza tym w programowaniu zawsze trzeba sobie wyrabiać jak najlepsze nawyki. Pisząc kod na szybko (np. POC) możesz iść na skróty. Ale jak wszystko, tak i cięcie zakrętów powinno być robione świadomie. To znaczy że zasady można ignorować wyłącznie świadomie, a nie z niewiedzy. A Twój kod nie przejawia się jako "wiem co robię" tylko "spróbuję tak, może wyjdzie".

 

Czy po wyjsciu poza funkcje main pamiec nie jest czasem automatycznie czyszczona? Sorry, jesli pisze glupote


Tak i nie. System zwalnia pamięć, ale nie musi zwalniać innych zasobów (handle do plików, sockety i tego typu zasoby mogą się utrzymywać zależnie od systemu, sprzętu, itd.) więc lepiej sobie wyrobić nawyk sprzątania po sobie. Robienie syfu uniemożliwia też wykorzystanie narzędzi typu vargrind (bo jak nie ma cleanupu to wszystko wygląda jak wyciek). Jest taki paradygmat programowania, w którym jeśli coś poszło krytycznie źle, to sam wysadzasz w powietrze program, żeby minimalizować dalsze straty (czasem ciężko się wnioskuje w kodzie co trzeba zrobić, żeby "czysto" wyjść z programu po pojawieniu się błędu); ewentualnie jeśli wiesz, że program nie ma żadnego nowego stanu i został zamknięty przez użytkownika, to możesz wyskoczyć z niego bez czyszczenia (w końcu nie masz nic do zapisania, nie), ale to raczej skrajne podejście. :)

A, co do trzymania danych na stosie - stos ma bardzo ograniczony rozmiar. Ponadto skok do funkcji z gigantycznym stosem (main() to też funkcja ;]) jest kosztowny.

Ten post był edytowany przez Ryan dnia: 19 luty 2018 - 14:14

  • 1

#2924 Holden Napisany 17 czerwiec 2018 - 18:42

Holden

    je m'appelle Ferdinand

  • Forumowicze
  • 9228 Postów:
jprdole jak zamienic rekursywna funkcje na iteratywna, mam cos takiego
(define (recur n)
	    (if (< n 3) n
	    (+ (recur (- n 1)) (* (recur (- n 2)) 2) (* (recur (- n 3)) 3))))
edit dobra juz wiem, tylko musze sie nauczyc jak sie indeksuje w scheme

Ten post był edytowany przez Holden dnia: 18 czerwiec 2018 - 04:23

  • 0

#2925 Holden Napisany 23 czerwiec 2018 - 22:52

Holden

    je m'appelle Ferdinand

  • Forumowicze
  • 9228 Postów:
dlaczego jesli usune z argumentow konstruktorow (tych argumentow, ktore powtarzaja sie w dziedziczonych klasach) usune const reference& i uzyje samego typu to przestanie dzialac? w sumie domyslam sie dlaczego ale moze wy wiecie lepiej



#include <iostream>
using namespace std;

class Zwierze {
	protected:
		double masa;
		int wiek;
	public:

	Zwierze(const double& masa_in, const int& wiek_in) {
        masa=masa_in;
        wiek=wiek_in;

}

	void wypisz() const;
        };

class Pies : public Zwierze {
	protected:
		string rasa;
	public:
		Pies(const string& rasa_in, const double& masa_in, const int& wiek_in) : Zwierze(masa_in, wiek_in) {
        rasa=rasa_in;
}
		void wypisz() const;
};
class PiesDomowy : public Pies {
	protected:
		string imie;
	public:
		PiesDomowy(string imie_in, const string& rasa_in, const double& masa_in, const int& wiek_in) : Pies(rasa_in, masa_in, wiek_in)
        {
            imie = imie_in;
        }
		void wypisz() const;
};







void Zwierze::wypisz() const {
	cout << masa << " " << wiek << " " << endl;
	}

void Pies::wypisz() const {

    cout << "KOLEJNA GRUPA: " << endl;
	Zwierze::wypisz();
	cout << rasa << " ";
}
void PiesDomowy::wypisz() const {
	cout << endl;
	Pies::wypisz();
	cout << " " << imie << endl;
}




int main() {
Zwierze p(3.5, 10);
Pies ps("bokser", 3.5, 10);
PiesDomowy po("Reksio", "bokser", 3.5, 10);
p.wypisz();
ps.wypisz();
po.wypisz();
return 0;
}



  • 0

#2926 Holden Napisany 27 czerwiec 2018 - 01:45

Holden

    je m'appelle Ferdinand

  • Forumowicze
  • 9228 Postów:
LOL
https://codegolf.sta...or-message-in-c
  • 0

#2927 lukaszSA Napisany 27 czerwiec 2018 - 06:45

lukaszSA

    Overall expert

  • Forumowicze
  • 20642 Postów:

Nie znam się na C/C++, ale jak usuwałem u siebie const i & z konstruktorów to wszystko się kompiluje.

 

Co pokazuje kompilator? A może kompiluje się, ale wypisują się głupoty?

 

Ticket rejected. Insufficient symptoms.


  • 1

#2928 Holden Napisany 27 czerwiec 2018 - 14:10

Holden

    je m'appelle Ferdinand

  • Forumowicze
  • 9228 Postów:
rzeczywiscie, dziwne
  • 0

#2929 Holden Napisany 30 czerwiec 2018 - 18:48

Holden

    je m'appelle Ferdinand

  • Forumowicze
  • 9228 Postów:
juz rozumiem :cf:
kvAifNy.jpg?1
  • 0

#2930 fingus Napisany 01 lipiec 2018 - 11:29

fingus

    proud gaymer

  • Moderatorzy
  • 33206 Postów:
W OO opartym o prototypy, jak javascript, modyfikacja bazowego waifu wpływa również na Twoje waifu. W opartym o klasy, jak C++/C#/Java, to dłubanie w jednej instancji nie wpłynie na pozostałe ani na klasę, ale zmiana klasy wpływa na wszystkie instancje. W dziedziczeniu zmiana klasy bazowej ma wpływ na wszystkich pochodne, ale dłubanie w pochodnych nie wpływa na bazową. Zatem nie do końca dobre to wyjaśnienie.
  • 2