Potrójny wskaźnik i tablica dynamicznie się powiększająca

Odpowiedz Nowy wątek
2020-04-14 12:43

Rejestracja: 3 lata temu

Ostatnio: 3 miesiące temu

0

Cześć, wykładowca wymaga ode mnie (1 rok), abym zastosował w moim projekcie potrójny wskaźnik oraz dynamicznie powiększaną tablicę, problem w tym, że mój program to przechowywacz haseł, czy password manager (po prostu dodajemy, usuwamy i wyświetlamy hasła, które potem są zapisywane do pliku txt). Nie mam zielonego pojęcia jak się do tego zabrać
Plik nagłówkowy Dane.h

#include <string>
using namespace std;

    class Dane {
    private:
        string strona;
        string login;
        string haslo;
    public:
        //przeciazenie
        Dane();
        Dane(string Strona, string Login, string Haslo);
        Dane(const Dane& pobranie);
        void zapis();
        void zapis(string Strona, string Login, string Haslo);
        void wyswietl();
        string get_strona();
        string get_login();
        string get_haslo();
    };

Dane.cpp

#include "pch.h"
#include <iostream>
#include "Dane.h"
#include <string>
using namespace std;

//zapis danych do pliku z klawiatury
void Dane::zapis() {
    cout << "Podaj strone: " << endl;
    cin >> Dane::strona;
    cout << "Podaj login: " << endl;
    cin >> Dane::login;
    cout << "Podaj haslo: " << endl;
    cin >> Dane::haslo;
}
//zapis danych do pliku z argumentów (np. jak juz jest cos w pliku, ze zmiennej)
void Dane::zapis(string Strona, string Login, string Haslo){
    this->strona = Strona;
    this->login = Login;
    this->haslo = Haslo;
}

Dane::Dane() {}
//lista inicjalizacyjna
Dane::Dane(string Strona, string Login, string Haslo): strona(Strona), login(Login), haslo(Haslo) { }

//konstruktor kopiujący
Dane::Dane(const Dane& pobranie) {
    this->zapis(pobranie.strona, pobranie.login, pobranie.haslo);
}

void Dane::wyswietl() {
    cout << Dane::strona << ": " << Dane::login << " " << Dane::haslo << endl;
}

// metody zwracajaca wartosci (wartosci sa  ogolnie prywatne, a przez to czesciowo staja sie publiczne), prywatne dla bezpieczenstwa
// nie modyfikuja wartosci, tylko wyswietlaja
string Dane::get_strona() {
    return Dane::strona;
}
string Dane::get_login() {
    return Dane::login;
}
string Dane::get_haslo() {
    return Dane::haslo;
}

oraz main

//Sejf Haseł
#include "pch.h"
#include <iostream>
#include <string>
#include <fstream>
#include "Dane.h"
using namespace std;

bool wczytywanie(string &strona,string &login,string &haslo,istream &file) {

    //wczytuje hasla (jesli juz jakies sa np)
            getline(file, strona);
            if (strona == "") return false;
            getline(file, login);
            getline(file, haslo);
            return true;
}
void add(Dane* hasla, int& ilosc_wpisow) {

    hasla[ilosc_wpisow].zapis();
    ilosc_wpisow++;
}
void view(Dane* hasla, int& ilosc_wpisow) {

    for (int j = 0; j < ilosc_wpisow; j++) {

        hasla[j].wyswietl();

    }
}
void save(Dane* hasla, int& ilosc_wpisow) {

    ofstream file;
    file.open("hasla.txt");
    for (int j = 0; j < ilosc_wpisow; j++) {
        //nie modyfikuja wartosci, tylko wyswietlaja
        file << hasla[j].get_strona() << endl << hasla[j].get_login() << endl << hasla[j].get_haslo() << endl;

    }

    file.close();
    delete[] hasla;
}
//dynamiczne rozszerzanie tablicy nie działa
/*void plustab(Dane* hasla, int& rozmiar) {

    Dane* tablica = new Dane[rozmiar + 1];
    for (int i = 0; i < rozmiar; i++) {

        tablica[i] = Dane(hasla[i]);
    }
    delete[] hasla;
    hasla = new Dane [++rozmiar];
    hasla = tablica;
    for (int i = 0; i < rozmiar; i++) {

        hasla[i] = Dane(tablica[i]);

    } 
    delete[] tablica;
}*/

int main() {
    // tworzenie tablicy obiektów na maks 20 haseł
    int rozmiar = 0;
    int i = 0;
    bool flag = true;
    Dane*** hasla = new Dane**[1];
    hasla[0] = new Dane* [1];
    hasla[0][0] = new Dane[20];
    ifstream file;
    file.open("hasla.txt");
    string strona;
    string login;
    string haslo;

    if (file.is_open()) {
        while (flag) {
            flag = wczytywanie(strona, login, haslo, file);
            if (flag) {
                //plustab(hasla, rozmiar);
                hasla[0][0][i].zapis(strona, login, haslo);
                i++;
            }
        }
    }
        file.close();

        //referencja
        int& ilosc_wpisow = i;
        char operacja;
        while (1) {
            cout << "Co chcesz zrobic?" << endl;
            cout << "a - dodac haslo " << endl;
            cout << "v - wyswietlic hasla " << endl;
            cout << "s - wyjsc i zapisac " << endl;
            cin >> operacja;

            switch (operacja) {
                //dodawanie haseł
            case 'a':

                add(**hasla,ilosc_wpisow);
                //plustab(hasla, rozmiar);
                break;

                //wyswietlanie hasel
            case 'v':
                view(**hasla, ilosc_wpisow);
                break;

                //zapis i zamkniecie
            case 's':
                save(**hasla, ilosc_wpisow);
                return 0;
            }
        }
}

w mainie mam zakomentowane dynamiczne rozszerzanie tablicy, lecz nie działa, może ktoś z tym także pomoże? Tak samo potrójny wskaźnik - został użyty, ale nie ma zastosowania, więc prowadzący się doczepił.
Dzięki z góry :)

Pozostało 580 znaków

2020-04-20 15:22

Rejestracja: 15 lat temu

Ostatnio: 3 minuty temu

2
Codedemens napisał(a):

Mam lepszą propozycje ...

Jedzie kowboj po prerii i nagle zostaje otoczony przez indian.
- No to już po mnie. Pomyślał.
I tu słyszy w głowie głos: - Jeszcze nie! Podejdź do wodza i pluń mu w twarz!
Podszedł, plunął.
A głos w głowie: - Dopiero teraz, po tobie.

@Codedemens, to ty byłeś tym głosem?


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2020-04-20 15:23
Pokaż pozostałe 26 komentarzy
A po kiego Ci grzyba tym kontekście sprawdzać wszystkie wyniki f(x)? SPOJ sprawdza dużo danych, ale nie nieskończenie wiele. - Codedemens 2020-04-22 22:27
I od kiedy kwestie algorytmiczne są to kwestie (w kontekście programowania), które nie mają limitu na komputerach i w których każdy komputer używa liczb. W konkteście aktualnym, każdy komputer ma swój limit. I sprawdzanie danych powyżej jakichś astronomicznych limitów - nie ma sensu. - Codedemens 2020-04-22 22:29
Poza tym, jeżeli chcesz stworzyć model bardziej uniwersalny algorytmu, na poziomie teorii - przecież po to one są, aby je formułować. I to też nie wyklucza testów, używasz i jednego i drugiego. - Codedemens 2020-04-22 22:34
Chodzi mi tylko o prosty przykład np zaimplementujesz metodę znajdująca punkt przecięcia prostej z plaszczyzna, wejscie to 2 wektory po 3 liczby rzeczywiste wynik to punkt przecięcia. Możesz napisać kilka unity testów ale wystarczy jeden edge case i rozwiązanie może mieć blad pomimo zielonych testow - xxx_xx_x 2020-04-22 22:35
Albo taki przyklad, masz wektor kamery i chcesz uzyskać pozostałe dwa wektory pionowy i prostopadły. Zwykle robi sie cross z (0, 1, 0) i cross tego z frontem. Edge case o którym matematycznie trzeba wiedzieć to problem gdy kamera patrzy w górę. Testy jednostkowe zmniejszają szansę błędu ale nie gwarantują że rozumiesz cały problem domeny - xxx_xx_x 2020-04-22 22:39

Pozostało 580 znaków

2020-04-20 15:35

Rejestracja: 1 rok temu

Ostatnio: 2 miesiące temu

Lokalizacja: Yuri' Command Center

0
_13th_Dragon napisał(a):
Codedemens napisał(a):

Mam lepszą propozycje ...

Jedzie kowboj po prerii i nagle zostaje otoczony przez indian.
- No to już po mnie. Pomyślał.
I tu słyszy w głowie głos: - Jeszcze nie! Podejdź do wodza i pluń mu w twarz!
Podszedł, plunął.
A głos w głowie: - Dopiero teraz, po tobie.

@Codedemens, to ty byłeś tym głosem?

Sigma Male never dies, Comrade General.


Kiedy pieć zmysłów i rozum są trzeźwe,
A powód samoistnie leży w ciszy,
Wtedy rozpocznie się lepsza ścieżka.
-Katha Upanishad

Pozostało 580 znaków

2020-04-20 15:49

Rejestracja: 1 rok temu

Ostatnio: 11 godzin temu

3

Pominę na razie moją opinię o trolowaniu i "buractwie" i spróbuję jeszcze raz...

@Kaytec - Twoim "zadaniem" było przygotowanie szczegółowej specyfikacji tego jak program ma działać z punktu widzenia użytkownika i ewentualni wymogów "formalnych". Zamiast tego po trzech dniach pojawiło sie jedno zdanie w którym pomieszałeś wymagania z instrukcjami jak je zaimplementować... Może nie do końca zrozumiałeś o co mi chodziło - więc spróbujmy inaczej.

  1. Wyobraź sobie, że masz worek dolarów. Duży.
  2. Nie masz pojęcia jak zrobić to zadanie, więc postanawiasz je zlecić.
  3. Na świecie jest tylko jeden programista który może to zrobić - na szczęście jest to "idealny" programista, który za pierwszym razem dostarczy Ci bezbłędny program napisany idealnie zgodnie z Twoją specyfikacją
  4. Problem polega na tym, że za swoje usługi programista żąda całego worka dolarów

Masz tylko jedną szansę na opisanie funkcjonalności programu. Dostaniesz dokładnie to co opisałeś, bez żadnego zgadywania co miałeś na myśli. Ponieważ programista jest idealny i dostarcza Ci dokładnie to co zamówiłeś - nie ma szans na żadne poprawki ani reklamacje.
Jak sądzisz - czy na podstawie tego co do tej pory opisałeś jest szansa, że dostaniesz sensowny program ?

Ten scenariusz jest oczywiście nierealny w praktyce. Nie ma ani idealnych programistów ani perfekcyjnej specyfikacji wymagań.
Dlaczego zatem w ogóle o tym piszę? Bo bez opisu co dokładnie chcesz osiągnąć nie będziemy w stanie Ci pomóc. Podekreślam - co a nie jak - wybacz nasze "buractwo", ale my najprawdopodobniej lepiej od Ciebie wiemy jak to zrobić. Twoja jedyna "przewaga" polega na tym, że masz jakąś wizję efektu końcowego.

Jeśli będziemy dokładnie wiedzielu co chcesz zrobić, to być może pojawi się pomysł gdzie w takim projekcie wpleść potrójny wskaźnik, tak żeby to miało choćby śladowy sens.

Jak na razie - z mojego punktu widzenia dostałeś w tym wątku dwie dobre odpowiedzi (od @TomaszLiMoon i @Pebal). W obu przypadkach - problemem jest znalezienie sensownego zastosowania dla tego typu kodu w Twoim projekcie.

Nie wypowiadałem się negatywnie o nikim innym z tego wątku, oprócz wcześniej wymienionego jegomościa, przykro mi, jeśli Cię uraziłem. Wiem, że tym postem oczekujesz ode mnie po prostu opisanie projektu jako programista, w sposób obiektywny, treściwy i skrajnie logiczny - ale ja tego nie potrafię, nie myślę jak programista (w końcu nim nie jestem), "tak o" sobie coś wymyśliłem i zacząłem realizować ten program ze wszystkimi wymogami prowadzącego. Doskonale już rozumiem o co Ci chodzi, ale nie nauczyłem się jeszcze myśleć w ten sposób (kto wie, czy kiedykolwiek :P). - Kaytec 2020-04-20 20:32

Pozostało 580 znaków

2020-04-20 15:53

Rejestracja: 15 lat temu

Ostatnio: 3 minuty temu

4

Uprzedzam że absolutnie nigdy nie należy tego robić w ten sposób (ponieważ jest totalnie bez sensu), ale:

#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;

void append(char ***tb,size_t *count,const char *str)
{
   size_t index=(*count)++;
   *tb=(char**)realloc(*tb,*count*sizeof(char*));
   size_t size=strlen(str)+1;
   char *copy=(char*)malloc(size);
   memcpy(copy,str,size);
   (*tb)[index]=copy;
}

void print(char **tb,size_t count) { while(count--) cout<<*(tb++)<<endl; }

int main()
{
   char **tb=0;
   size_t count=0;
   append(&tb,&count,"Ala");
   append(&tb,&count,"ma");
   append(&tb,&count,"kota");
   print(tb,count);
   return 0;
}

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 2x, ostatnio: _13th_Dragon, 2020-04-20 16:13
Pokaż pozostałe 4 komentarze
Nie wolno doceniać tego paskustwa!!! - _13th_Dragon 2020-04-20 20:25
Kliknąłem lajka. Oj tam. Masz te 5 pkt czy tam ile reputacji. - Codedemens 2020-04-22 00:22
To anti-wzorzec, powinno bez lajków zostać - _13th_Dragon 2020-04-22 17:22
moje oczy krwawią ;p - xxx_xx_x 2020-04-22 17:23
I właśnie dla tego nie należy tego doceniać! Bo jakiś noob może pomyśleć że tak się robi ... - _13th_Dragon 2020-04-22 17:55

Pozostało 580 znaków

2020-04-20 15:59

Rejestracja: 1 rok temu

Ostatnio: 2 miesiące temu

Lokalizacja: Yuri' Command Center

1

@MarekR22:

Uniwersalne, bez znaczenia czy wykładowca, czy współpracownik, czy komandos.


Kiedy pieć zmysłów i rozum są trzeźwe,
A powód samoistnie leży w ciszy,
Wtedy rozpocznie się lepsza ścieżka.
-Katha Upanishad
edytowany 1x, ostatnio: Codedemens, 2020-04-20 16:00
Pokaż pozostałe 17 komentarzy
Do tego typu projektu przydałby się jeszcze jakaś forma testu jednostkowego lub innego testu, żeby sprawdzić czy na pewno memory is fine. - Codedemens 2020-04-22 00:33
To jest napisane na poziomie tak abstrakcyjnym, że nie wiadomo w jakim konkteście te dane rzeczy zrobić. Być może dowolnym. - Codedemens 2020-04-22 00:34
Brakuje etapu 1, na pewno coś tam jest jak ta aplikacja ma wyglądać, bez etapu 1 wykonanie tego zadania jest niewykonalne. - Codedemens 2020-04-22 00:36
Idea potrójnego pointera na studiach jest prosta, daje 100% gwarancji że student rozumie jak to działa, a nie ctrl-C + ctrl-V z internetu i lecimy. Jak widzisz przyszedł na forum żeby mu ktoś pomógł to zrozumieć. W praktyce pewnie już tego nie zobaczy no chyba ze wyląduje w jakimś IoT - xxx_xx_x 2020-04-22 17:28

Pozostało 580 znaków

2020-04-21 22:24

Rejestracja: 3 miesiące temu

Ostatnio: 2 miesiące temu

1

Wow gwiazdeczki hurey XD.
Czy mój program spełnia wymogi wykładu przerób na C++ powiedz, że zaimplemnetowałeś algorytm half Triangel piramide printer XD.
Propozycja 1: hasło w 3d wpakuj i zapisz jako binarke jako prostą funkcje do hash haseł ;p, tylko jakoś magicznie np. że pierwsza linia będzie miała indexy odczytu hasła, a ostatnia hasło tak przestawione.
Propozycja 2: zaimplementuj liste i tam wpakuj tablice 3d ;p, co program robi przechowuje *** gwiazdeczki XD, nie wiem czy tylko to przejdzie hehe.

https://4programmers.net/Forum/1672187
https://code.sololearn.com/cjt2HFLwPvu2/#c

edytowany 2x, ostatnio: invisiblehat, 2020-04-21 22:29
Chryste panie, ten kod. IKS-DE. - Codedemens 2020-04-22 00:06

Pozostało 580 znaków

2020-04-22 00:42

Rejestracja: 1 rok temu

Ostatnio: 2 miesiące temu

Lokalizacja: Yuri' Command Center

0

@Kaytec
Podaj całą treść zadania, podaj etap 1 (bo nawet jeżeli coś napisałeś, to primo: Nie wiemy czy jest to zgodne z etapem 1, secundo: nie wiemy w ogóle jak ma się etap 1 do etapów 2 i 3)
I jeżeli są etapy po 3, podaj je również. Podaj w jednym poście wszystko co jest wymagane do tego zadania. Bo aktualnie, to my musimy rozszyfrowywać puzle.
Proponuję też, że jeżeli jest to triple raw-pointer, dorzucić do tego rozwiązania zadania jakiegoś rodzaju test, aby sprawdzić, czy na pewno alokacja przebiegła prawidłowo. Nie trzeba tego testu dawać dla mocodawcy, bo ten test jest tylko po to, aby sprawdzić, czy na pewno zadanie jest rozwiązane prawidłowo.
Oprócz treści zadania podaj też kontekst wszystkiego co jest związane z tymi etapami. Etap 3 odgórnie narzuca mechanizmy które wszyscy znamy, ale nie wiemy w jakich konktekstach (Bo napisane jest - w odpowiednich kontekstach na czerwono)

Wykonanie tego zadania (z wyłączeniem metod brute-force) jest niewykonalne w obecnej formie.

Edit:

Proponuję abyś zapisał to w formie:

[zwięzły opis tego co musisz zrobić, na poziomie czysto teoretycznym/abstrakcyjnym]

[ETAP 1 - zdjęcie]
[ETAP 2 - zdjęcie]
[ETAP 3 - zdjęcie]
[Inne etapy jeżeli są]

[Opis zadania / Twoja narracja na temat tego co wykładowca mówił na temat tego zadania.]

[Sformatowany kod źródłowy tego co udało Ci się stworzyć]

[Inne informacje - jaką masz spontaniczność/poziom wolności do użycia swoich własnych rzeczy/pomysłów do tego projektu; jakie są konteksty podane w etapie 3 (czy ich nie ma? czy musisz sam je dopasować odpowiednio); co odgórnie musisz zrobić]


Jeżeli ktoś ma pomysł na lepszą formę, niech napisze własnego posta, albo do mnie na PW / napisze komentarz to zedytuję tego posta.


Kiedy pieć zmysłów i rozum są trzeźwe,
A powód samoistnie leży w ciszy,
Wtedy rozpocznie się lepsza ścieżka.
-Katha Upanishad
edytowany 4x, ostatnio: Codedemens, 2020-04-22 01:21
Jak on to wszystko zrobi jak napisałeś to zostanie mu max 30 min pracy do zakończenia projektu. - _13th_Dragon 2020-04-23 22:58

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0