Skocz do zawartości

Programowanie


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

#2911 lukaszSA Napisany 23 listopad 2017 - 23:45

lukaszSA

    Overall expert

  • Forumowicze
  • 21461 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
  • 32404 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
  • 1522 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
  • 9456 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
  • 21461 Postów:

Sam sobie wymyśl format i napisz parser


  • 0

#2916 Kurzy Napisany 15 luty 2018 - 18:32

Kurzy

    NIKOGO FORUMEK ENTUZJASTA

  • Forumowicze
  • 13843 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
  • 9456 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

    NIKOGO FORUMEK ENTUZJASTA

  • Forumowicze
  • 13843 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
  • 32404 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
  • 9456 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

  • Moderatorzy
  • 57020 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
  • 9456 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
  • 32404 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
  • 9456 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
  • 9456 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
  • 9456 Postów:
LOL
https://codegolf.sta...or-message-in-c
  • 0

#2927 lukaszSA Napisany 27 czerwiec 2018 - 06:45

lukaszSA

    Overall expert

  • Forumowicze
  • 21461 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
  • 9456 Postów:
rzeczywiscie, dziwne
  • 0

#2929 Holden Napisany 30 czerwiec 2018 - 18:48

Holden

    je m'appelle Ferdinand

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

#2930 fingus Napisany 01 lipiec 2018 - 11:29

fingus

    proud gaymer

  • Moderatorzy
  • 33717 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

#2931 Holden Napisany 30 sierpień 2018 - 17:19

Holden

    je m'appelle Ferdinand

  • Forumowicze
  • 9456 Postów:

Znacie sie na C?

Dlaczego ten kod dziala:

https://www.geeksfor...et-1-insertion/

A ten nie?

#include <stdio.h>
#include <stdlib.h>


typedef struct tree *T_tree;
struct tree {
    T_tree left;
    int key;
    T_tree right;
    int height;
    //int size = 0;
};
T_tree Tree (T_tree l, int k, T_tree r) {
    T_tree t = malloc(sizeof(*t));
    t-> left=l;
    t-> key=k;
    t->right = r;
    if (l==NULL &&  r == NULL) {
        t->height = 1;
    }
    /*
    else {
        t->height++;
    }*/
    return t;
}
//bigger of 2 integers:
int max(int a, int b) {
    if (a>=b) {
        return a;
    }
    else {
        return b;
    }
}
//actual height of tree
int height(T_tree t) {
    if (t==NULL)
        return 0;
    return t->height;
}



T_tree rightRotate(T_tree t) {
    T_tree t1 = t->left;
    T_tree t2 = t1->right;
    //rotation:
    t1->right = t;
    t->left = t2;
    //update heights:

    t->height = max(height(t->left), height(t->right))+1;
    t1->height = max(height(t1->left), height(t1->right))+1;

    return t1;
};
T_tree leftRotate(T_tree t) {
    T_tree t1 = t->right;
    T_tree t2 = t1->left;
    //rotation:
    t1->left = t;
    t->right = t2;
    //update heights:

    t->height = max(height(t->left), height(t->right))+1;
    t1->height = max(height(t1->left), height(t1->right))+1;

    return t1;
};
//get balance factor of node N
int getBalance(T_tree node) {
    if (node == NULL)
        return 0;
    return height(node->left) - height(node->right);
}

T_tree insert(int key, T_tree t) {
    if (t==NULL) {
        return Tree(NULL, key, NULL);  
    }
    if (key < (t->key)) {
        Tree(insert(key,t->left), t->key, t->right);
    }
    else if (key > t->key) {
        return Tree(t->left, t->key, insert(key, t-> right));
    }
    else return Tree(t->left, key, t-> right);
    //update height of this node
    t->height = 1 + max(height(t->left), height(t->right));
    //is node becomed unbalanced?
    int balance = getBalance(t);
    if (balance >1 && key< t->left->key)
        return rightRotate(t);

    if (balance <-1 && key > t->right->key)
        return leftRotate(t);

    if (balance>1 && key > t->left->key) {
        t->left = leftRotate(t->left);
        return rightRotate(t);
    }
    if (balance < -1 && key < t->right->key) {
        t->right = rightRotate(t->right);
        return leftRotate(t);
    }
    return t;
}
void preOrder(T_tree root)
{
    if(root != NULL)
    {
        printf("%d ", root->key);
        preOrder(root->left);
        preOrder(root->right);
    }
}


int main(int argc, char const *argv[])
{
    T_tree t1 = NULL;
    t1 = insert(10, t1);
    t1 = insert(20, t1);
    t1 = insert(30, t1);
    t1 = insert(40, t1);
    t1 = insert(50, t1);
    t1 = insert(15, t1);
    preOrder(t1);
    return 0;
}
 

Przez "nie dziala" rozumiem: nie wczytuje 15 jesli wstawiam nie po kolei, a preorder nie dziala tak jak powinien.

Pierwszy kod daje wynik:

  30 20 10 25 40 50

A moj:

10 20 30 40 50

moj kod rozni sie tylko ta bardzej "fancy" definicja wierzcholka


Ten post był edytowany przez Holden dnia: 30 sierpień 2018 - 17:23

  • 0

#2932 Holden Napisany 30 sierpień 2018 - 18:04

Holden

    je m'appelle Ferdinand

  • Forumowicze
  • 9456 Postów:
wiec roznica jest taka:
typedef struct tree *T_tree;
struct tree {
    T_tree left;
    int key;
    T_tree right;
    int height;
    //int size = 0;
};
T_tree Tree (T_tree l, int k, T_tree r) {
    T_tree t = malloc(sizeof(*t));
    t-> left=l;
    t-> key=k;
    t->right = r;
    if (l==NULL &&  r == NULL) {
        t->height = 1;
    }
    /*
    else {
        t->height++;
    }*/
    return t;
}
zamiast


struct Node
{
    int key;
    struct Node *left;
    struct Node *right;
    int height;
};
 
struct Node* newNode(int key)
{
    struct Node* node = (struct Node*)
                        malloc(sizeof(struct Node));
    node->key   = key;
    node->left   = NULL;
    node->right  = NULL;
    node->height = 1;  // new node is initially added at leaf
    return(node);
}

nie uzywam tych wskaznikow do struktury. Ech, chyba musze wiecej poczytac o typedef
  • 1

#2933 Holden Napisany 22 październik 2018 - 21:24

Holden

    je m'appelle Ferdinand

  • Forumowicze
  • 9456 Postów:
dlaczego cout<<obj3.getter()<<endl; zwraca 7, skoro obj3 = obj1, ktory obj1 zostal zrobiony konstruktorem bezparametrowym, ktory pozostawia a=5 w spokoju? Nie powinien wiec zwracac 5?

#include <iostream>
using namespace std;

class C1 {
    public:
        int a=5;
        C1() {
            cout<<"Class constructed"<<endl;
        }
        C1(const C1& object) {
            cout<<"Copy const called"<<endl;
            a=7;
        }
        int getter() {
            cout<<"Object printed: "<<endl;
            return a;
        }
};

int main() {
    C1 obj0();
    C1 obj1;
    C1 obj2(obj1);
    C1 obj3 = obj1;
    //obj0.getter();
    cout<<obj1.getter()<<endl;
    cout<<obj2.getter()<<endl;
    cout<<obj3.getter()<<endl;
}

Class constructed
Copy const called
Copy const called
Object printed: 
5
Object printed: 
7
Object printed: 
7


  • 1

#2934 Kurzy Napisany 22 październik 2018 - 21:32

Kurzy

    NIKOGO FORUMEK ENTUZJASTA

  • Forumowicze
  • 13843 Postów:
A to w tym przypadku nie jest tak, ze konstruktor kopiujący realizuje to samo co operator przypisania jeżeli nie jest to wskaźnik?
  • 1

#2935 Freeman Napisany 22 październik 2018 - 21:44

Freeman

    Dante

  • Forumowicze
  • 1422 Postów:

Dawno nie używałem C++(kilka lat), ale jak przekazujesz przez referencje to nadpisujesz ten pierwszy obiekt.

Czyli linijka C1 obj2(obj1); zmodyfikuje obiekt obj1.

Jakbyś teraz wywołał jeszcze raz cout<<obj1.getter()<<endl; to też wyrzuci 7. To tak z głowy piszę, więc pewności nie mam.


  • 1

#2936 Holden Napisany 22 październik 2018 - 21:54

Holden

    je m'appelle Ferdinand

  • Forumowicze
  • 9456 Postów:
heh no wlasnie nie, mi obj1.getter() drugi raz tez wyrzucilo 5
  • 0