Skocz do zawartości

Problem ze zleceniem.


Rekomendowane odpowiedzi

Witajcie. W niedzielę wykonałem pewne drobne zlecenie z C++. Zleceniodawca potrzebował programu na właśnie niedzielę, więc nie mogłem od razu dostać pieniędzy na konto bankowe. Więc poprosiłem o zrzut ekranu z informacją o rozpoczęcie wykonania przelewu. Jednak pieniądze nie przyszły na konto. Poinformowałem o tym zleceniodawcę i napisał mi, że dostał za program 0 pkt., bo albo się nie mógł skompilować, albo skompilował się z ostrzeżeniami. Przed rozpoczęciem pisania programu dwukrotnie pytałem się autora o dokładne wymagania co do programu i w nich nie podał mi, że między innymi program ma działać na Linuxie. A program pisałem pod Windowsem z użyłem nieprzenośnej biblioteki conio.h. Oczywiście poinformowałem go potem, że nie podał mi wszystkich potrzebnych informacji i napisał mi: "Sam mogłeś zapytać czy to ma być na Linuxie czy Windowsie. Windows nie jest domyślnym systemem.". Co z tym zrobić? Czy według Was to ja w czymś zawiniłem, że nie pytałem się gościa o to na jaki dokładnie system ma być program, choć wcześniej dwa razy zadałem ogólne pytanie o wymagania co do programu? Oto pytania jakie mu zadałem przed rozpoczęciem pisania programu w dwóch mailach: "Tylko wyślij mi opis tego co dokładnie program ma robić z tymi strukturami i plikami. Najlepiej wyślij dokładną treść zadania." oraz "Witam, proszę o dokładne określenie tego co ma ten program robić. Jakie ma mieć funkce, itp. Jeśli możesz wyślij treść zadania. ". Ktoś mi napisał, że źle zrobiłem używając biblioteki conio.h, bo nie jest częścią języka(choć jest w kompilatorze na Windowsa) oraz, że używanie jej to zła praktyka. Czy jakiś doświadczony programista C++ może się wypowiedzieć w tej kwestii?

Odnośnik do komentarza

Dołącz do nas za darmo i naucz się zarabiać!

  • Dostęp do darmowych poradników pokazujących krok po kroku jak zarabiać w Internecie
  • Sposoby zarabiania niepublikowane nigdzie indziej
  • Aktywna społeczność, która pomoże Ci rozwiązać problemy i doradzi
  • Profesjonalne treści na temat SEO, social media, afiliacji, kryptowalut i wiele więcej!

 

 

@sanderusMówisz o koncie na PayPal? Właśnie myślałem o tym, aby używać konta na PayPal do przyjmowania pieniędzy ze zleceń. Rozumiem, że przelew z jednego konta na PayPlau na inne konto na PayPalu będzie w każdy dzień szybki? No i ogólnie zamiast zaliczek to po prostu będę żądał całej kwoty za program i na dowód, że ja nie kantuję będę wysyłał film, na którym widać działanie programu.

Odnośnik do komentarza
4 godziny temu, AirBourne napisał:

Na paypalu praktycznie od razu dostajesz kase jeśli ktoś Ci wyślę.

Tak trochę zaśmiałem się pod nosem, bo równie szybko ktoś może tą kasę cofnąć z powrotem :D Polityka PP + chargeback na karcie i już. Bezpieczniej używać przelewów, do ekspresowych polecam bluecash (pieniądze w 5 min na Twoim koncie, a wysyłający nie może ich cofnąć).

  • Super 1
Odnośnik do komentarza

Zdecydowałem ostatecznie, że dam sobie spokój. Po prostu na przyszłość po pierwsze wysyłam program z kodem po otrzymaniu zapłaty, po drugie będę dużo dokładniej wypytywał się o szczegóły. Kod tego programu i treść zadania możecie zobaczyć tutaj:
 

Cytuj

Wiedza wymagana do realizacji zadań częściowo została zawarta w wytycznych umieszczonych na platformie, dlatego powinniście Państwo najpierw zapoznać się z nimi oraz ze źródłami literaturowymi. Następnie należy przeanalizować, zaprojektować i zaimplementować program rozwiązujący wymyślone przez siebie zadanie operujące na jednej strukturze, strumieniach plikowych, argumentach pobieranych z linii uruchomienia programu (nazwy plików) oraz przedstawiające opis pewnego fragmentu rzeczywistości. Wybrany fragment rzeczywistości i struktury nie mogą powtarzać się pomiędzy Państwem. W związku z tym na forum utworzony zostanie jeden wątek, w którym każdy musi poinformować pozostałych uczestników kursu o wybranym zagadnieniu. W przypadku powtórzonych prac wszystkie zostaną ocenione na 0 pkt.

Na zaliczenie modułu należy przesłać do oceny tylko plik źródłowy *.cpp, nazwany zgodnie z zasadami podanymi w opisie kursu. Wewnątrz pliku źródłowego w komentarzach należy opisać działanie każdej funkcji. Funkcja main() musi zawierać informacje dla użytkownika o sposobie korzystania z programu.

#include <iostream>
#include <fstream>
#include <vector>
#include <stdlib.h>//Potrzebne dla funckji zamieniających łańcuch znakowy na liczby.
#include <conio.h>//Potrzebne dla funckji getch()
using namespace std;
struct pracownik
{
    string imie;
    string nazwisko;
    int rok;
    string pesel;
    float pensja;
    int staz;
};
bool OdtworzBaze(vector<pracownik>&dane, fstream& plik, string nazwa);
bool PokazBaze(const vector<pracownik>&dane);
bool ZapisZmiany(const vector<pracownik>&dane, fstream& plik, string nazwa);
bool ZmodyfikujRekord(vector<pracownik>&dane);
bool UsunRekord(vector<pracownik>&dane);
bool DodajRekord(vector<pracownik>&dane);

int main(int argc, char** argv)
{
    if(argv[1]==NULL)//Sprawdzenie czy podano nazwe pliku.
    {
        cout<<"Nie podales nazwy pliku.\n";
        return 1;//Zwrócenie informacji o nieprawidłowym wykonaniu
    }
    char opcja=0;
    fstream plik;
    vector<pracownik>rekordy;//Przechowuje bazę, na której działają poszczególne funckje.
    string tmp=argv[1];
    OdtworzBaze(rekordy, plik, tmp.c_str());//Otworzenie pliku z bazą o nazwie podanej w linii poleceń.
    cout<<"Dostepne opcje:\n0-Zamkniecie programu.\n1-Pokazanie bazy.\n2-Zapisanie zmian.\n3-Zmodyfikowanie rekordu.\n4-Usuniecie rekordu.\n5-Dodanie rekordu.\n";
    do
    {
        cout<<"Wybierz opcje: ";
        opcja=getch();//Pobranie znaku identyfikującego opcję.
        cout<<"\n";
        switch(opcja)
        {
        case '0': return 0;
        case '1':
            PokazBaze(rekordy);
            break;
        case '2':
            ZapisZmiany(rekordy, plik, tmp);
            break;
        case '3':
            ZmodyfikujRekord(rekordy);
            break;
        case '4':
            UsunRekord(rekordy);
            break;
        case '5':
            DodajRekord(rekordy);
            break;
        default:
            cout<<"Nie ma takiej opcji w menu.\n";
        }

    }while(opcja!=0);//Działanie do momentu wybrania zera na klawiaturze.
    return 0;
}

bool OdtworzBaze(vector<pracownik>&dane, fstream& plik, string nazwa)
{
    dane.clear();
    string tmp;
    plik.open(nazwa.c_str(), ios::in|ios::out);//Otworzenie pliku z opcjami do zapisu i odczytu.
    if(!plik.is_open()) return 0;//Zakończenie pracy funckji, jeśli plik nie jest otwarty.
    for(int i=0;getline(plik, tmp);++i)//Wykonywanie dopóki program będzie mógł pobrać kolejene wiersze z pliku.
    {//Wczytywanie danych z pliku do dyncamicznej tablicy.
        switch(i%6)//Wybiera do jakiego pola wpisać zawartość pobranej linii.
        {
        case 0:
            dane.push_back(pracownik());
            dane[dane.size()-1].imie=tmp;
            break;
        case 1:
            dane[dane.size()-1].nazwisko=tmp;
            break;
        case 2:
            dane[dane.size()-1].rok=atoi(tmp.c_str());//atoi zmienia łańcuch znakowy na liczbę całkowitą.
            break;
        case 3:
            dane[dane.size()-1].pesel=tmp;
            break;
        case 4:
            dane[dane.size()-1].pensja=atof(tmp.c_str());//atof zmienia łańcuch znakowy na liczbę zmiennoprzecinkową.
            break;
        case 5:
            dane[dane.size()-1].staz=atoi(tmp.c_str());
            break;
        }
    }
    return 1;
}
bool PokazBaze(const vector<pracownik>&dane)
{
    for(size_t i=0;i<dane.size();++i)//Wyświetlenie zawartości wszystkich komórek dynamicznej tablicy, która przechowuje w pamięci ram bazę.
    {
        cout<<"Rekord nr. "<<i<<":\n";
        cout<<"Imie: "<<dane[i].imie<<"\n";
        cout<<"Nazwisko: "<<dane[i].nazwisko<<"\n";
        cout<<"Rok: "<<dane[i].rok<<"\n";
        cout<<"Pesel: "<<dane[i].pesel<<"\n";
        cout<<"Pensja: "<<dane[i].pensja<<"\n";
        cout<<"Staz: "<<dane[i].staz<<"\n\n";
    }
    return 1;
}
bool ZmodyfikujRekord(vector<pracownik>&dane)
{
    unsigned int rekord=0;
    char wiersz=0;
    string tmp;
    cout<<"Wybierz numer rekordu: ";
    cin>>rekord;
    if(rekord>=dane.size())//Sprawdzenie czy użyto poprawnego indexu tablicy.
    {
        cout<<"Nie ma takiego rekordu.\n";
        return 0;//Zwrócenie fałszu w przypadku złego indexu.
    }
    cout<<"Wybierz wiersz do modyfikacji(0-imie, 1-nazwisko, 2-rok, 3-pesel, 4-pensja, 5-staz: ";
    wiersz=getch();//Pobranie jednego znaku bez konieczności zatwierdzania enterem.
    cout<<"Wpisz zawartosc wiersza: ";
    cin>>tmp;
    switch(wiersz)//Wybranie pola jakie chce zmienić użytkownik.
    {
    case '0':
        dane[rekord].imie=tmp;
        break;
    case '1':
        dane[rekord].nazwisko=tmp;
        break;
    case '2':
        dane[rekord].rok=atoi(tmp.c_str());
        break;
    case '3':
        dane[rekord].pesel=tmp;
        break;
    case '4':
        dane[rekord].pensja=atof(tmp.c_str());
        break;
    case '5':
        dane[rekord].staz=atoi(tmp.c_str());
        break;
    }
    return 1;
}
bool ZapisZmiany(const vector<pracownik>&dane, fstream& plik, string nazwa)
{
    plik.close();
    plik.open(nazwa.c_str(), ios::in|ios::out|ios::trunc);//Zamknięcie i otwrcie pliku z dodatkową falgą ios::trunc w celu wyczyszczenia jego zawartpści.
    for(size_t i=0;i<dane.size();++i)//Pętla działa na wszystkich elementach tablicy.
    {
        plik<<dane[i].imie<<"\n";//Zapis zawartości komórek dynamicznej tablicy do pliku.
        plik<<dane[i].nazwisko<<"\n";
        plik<<dane[i].rok<<"\n";
        plik<<dane[i].pesel<<"\n";
        plik<<dane[i].pensja<<"\n";
        if(i==dane.size()-1) plik<<dane[i].staz;//Zapobiegnięcie zapisania pustej linii do pliku.
        else plik<<dane[i].staz<<"\n";
    }
    plik.close();
    cout<<"Zapisano.\n";
    return 1;
}
bool UsunRekord(vector<pracownik>&dane)
{
    unsigned int rekord=0;
    cout<<"Wpisz rekord do skasowania: ";
    cin>>rekord;
    if(rekord>=dane.size())//Sprawdzenie czy użyto poprawnego indeksu tablicy.
    {
        cout<<"Nie ma takiego rekordu\n";
        return 0;
    }
    dane.erase(dane.begin()+rekord);//Usunięcie danego elementu z tablicy.
    return 1;
}
bool DodajRekord(vector<pracownik>&dane)
{
    dane.push_back(pracownik());//Utowrzenie nowego elementu w tablicy.
    cout<<"Podaj imie: ";//Pobranie danych od użytkownika do nowego rekordu.
    cin>>dane[dane.size()-1].imie;
    cout<<"Podaj nazwisko: ";
    cin>>dane[dane.size()-1].nazwisko;
    cout<<"Podaj rok: ";
    cin>>dane[dane.size()-1].rok;
    cout<<"Podaj pesel: ";
    cin>>dane[dane.size()-1].pesel;
    cout<<"Podaj pensje: ";
    cin>>dane[dane.size()-1].pensja;
    cout<<"Podaj staz: ";
    cin>>dane[dane.size()-1].staz;
    return 1;
}
Odnośnik do komentarza
45 minut temu, amb00 napisał:

Po prostu na przyszłość po pierwsze wysyłam program z kodem po otrzymaniu zapłaty

Jednak radzę nie być zbyt stanowczym oraz nie narzekać za dużo przy następnym zleceniu tego typu :)  tak od siebie tylko dodaję, bo sam korzystałem z takich usług jak i później takie oferowałem. Możesz napisać, że wyślesz krótkie wideo które prezentuje, że program działa a następnie dasz znać, że w tym momencie czekasz na przelew :)

Odnośnik do komentarza

@AveremPrzed wysłaniem kodu pytałem się czy wysłać wideo z tego jak działa program, ale zleceniodawca nie napisał, że to chce. Ale przy swoim pierwszym zleceniu, które było pełnoprawną okienkową aplikacją, to cały czas wysyłałem filmy z postępów i wszystko dobrze się ułożyło.

Odnośnik do komentarza

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Ta strona korzysta z ciasteczek aby świadczyć usługi na najwyższym poziomie. Dalsze korzystanie z witryny oznacza zgodę na ich wykorzystanie. Polityka prywatności .