Problem z programem – kompiluje się, jednak nie działa jak należy

0

edit: problemy tutaj zostały rozwiązane, jeszcze jeden post z pytaniem dodałem i dlatego temat "odkopany" ;)

Witam,

mam problem z zadankiem. Ogólnie do podanego pliku nagłówkowego miałem utworzyć funkcje oraz zawrzeć je w main(), jednak z jakiegoś względu mimo poprawnej kompilacji program nie działa jak należy. Mógłbym prosić o spojrzenie co może być nie tak? Z góry dziękuję za pomoc!

Plik nagłówkowy golf.h

#ifndef GOLF_H_
#define GOLF_H_

const int len = 40;

struct golf
{
	char fullname[len];
	int handicap;
};

void setgolf(golf & g, const char * name, int hc);
int setgolf(golf & g);
void handicap(golf & g, int hc);
void showgolf(const golf & g);

#endif

Plik z funkcjami golf.cpp

#include "golf.h"
#include <iostream>
#include <cstring>

using namespace std;

void setgolf(golf & g, const char * name, int hc)
{
	strcpy(g.fullname, name);
	g.handicap = hc;
}

int setgolf(golf & g)
{
	cout << "Podaj imie: ";
	cin.get(g.fullname, len);
	if ((g.fullname)[0] == '\0')
	{
	    cin.clear();
        return 0;
	}
    else
    {
	cout << "Podaj handicap: ";
	cin >> g.handicap;
    return 1;
    }
}

void handicap(golf & g, int hc)
{
	g.handicap = hc;
}

void showgolf(const golf & g)
{
	cout << "Imie: " << g.fullname << endl;
	cout << "Handicap: " << g.handicap << endl;
}

main.cpp

#include <iostream>
#include "golf.h"
#include <ctype.h>

using namespace std;

int main()
{
	cout << "Ilu golfistow chcesz dodac: ";
	int golfisci;
	cin >> golfisci;
	const char miszcz[7] = "Mistrz";
	golf zaw[golfisci];
	int wprowadzeni = 0;
	for (int i = 0; i < golfisci; i++)
	{
	    if (i == 0)
        {
            setgolf(zaw[i], miszcz, 10);
            wprowadzeni++;
        }
        else
        {
		setgolf(zaw[i]);
		if ((zaw[i].fullname)[0] == '/0')
			break;
		wprowadzeni++;
        }
	}
	cout << "Pokazuje wszystkich zawodnikow: " << endl;
	for (int i = 0; i < wprowadzeni; i++)
	{
		cout << "Zawodnik " << i << ":" << endl;
		showgolf(zaw[i]);
		cout << endl;
	}

	cout << "Czy chcesz zmienic handicap zawodnika?(T/N): ";
	char odp[1];
	cin.get(odp, 1);
	toupper(odp[0]);
	while (odp[0] != 'N')
    {
        if (odp[0] == 'T')
        {
            cout << "Podaj numer zawodnika do zmiany: ";
            int num;
            cin >> num;
            while (num > wprowadzeni || num < 0)
            {
                cout << "Nie ma takiego zawodnika, wybierz poprawny numer: ";
                cin.clear();
                cin >> num;
            }
            cout << "Podaj handicap: ";
            int handi;
            cin >> handi;
            handicap(zaw[num], handi);
            "Czy chcesz zmienic handicap kolejnego zawodnika?(T/N): ";
            cin.get(odp, 1);
            toupper(odp[0]);
        }

        else
        {
            cout << "Bledny wybor, sprobuj ponownie: ";
            cin.get(odp, 1);
            toupper(odp[0]);
        }
    };


	return 0;
}

2

Nie napisałeś dokładnie w czym problem, ale widzę w kodzie taki zapis który jest niepoprawny i golfisci powinno być wyrażeniem stałym i znanym w czasie już kompilacji programu.

  golf zaw[golfisci];
0

Są problemy z pobieraniem wartości i zapętlaniem się programu. W załączniku widać efekt

2
char odp[1];
cin.get(odp, 1);

Zobacz sobie to: http://www.cplusplus.com/reference/istream/istream/get/

Korzystasz aktualnie z wersji 2.

A null character ('\0') is automatically appended to the written sequence if n is greater than zero, even if an empty string is extracted.

0

Oki dzięki za wskazówkę :) Zaraz się biorę dalej za kombinowanie

0

Czemu to ma tag c?

0

@enedil C++ chyba bardziej dla obiektowości już czyli klasy, ewentualnie cstring. Ale jeżeli jestem w błędzie to pokornie proszę o wybaczenie :)

Miałbym jeszcze dwa pytania do jednej części kodu (pozostała część została poprawiona bez problemów):

  1. Koniec końców zamieniłem zmienną odp z char na string. Jak mógłbym zrobić ten kod poprawnie używając opcji char?
  2. W momencie w którym dodawałem zawodnika i chciałem wyjść z programu opcją n/N nie działało poprawnie dla pętli while. Po dodaniu warunku (powtórzenia tego co w while) wszystko jest ok. Z czego może to wynikać? (Zakomentowana część kodu) dla wygodniejszej nawigacji :)
	cout << "Czy chcesz zmienic handicap zawodnika?(T/N): ";
	string odp;
	cin >> odp;
	while (odp != "N" || odp != "n")
    {
        if (odp == "T" || odp == "t")
        {
            cout << "Podaj numer zawodnika do zmiany: ";
            int num;
            cin >> num;
            while (num > wprowadzeni || num < 0)
            {
                cout << "Nie ma takiego zawodnika, wybierz poprawny numer: ";
                cin >> num;
            }
            cout << "Podaj handicap: ";
            int handi;
            cin >> handi;
            handicap(zaw[num], handi);
            cout << "Czy chcesz zmienic handicap kolejnego zawodnika?(T/N): "; // <--- Do pytania 2giego
            cin >> odp;
        }
        else if(odp != "N" || odp != "n") // <--- do pytania 2giego
            break;

        else
        {
            cout << "Bledny wybor, sprobuj ponownie: ";
            cin >> odp;
        }
    };

0

Temat można zamknąć. Spierdzieliłem pętlę i się dziwiłem czemu to nie działa :D

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