Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

dejot44

Błąd w programie[C++]

Rekomendowane odpowiedzi

Witam! Mam problem z pewnym prostym programem. Kod:

#define ss; system("clear")//na windows zmienić "clear" na "cls"
#include <iostream>
#include <cstdlib>
using namespace std;

void wybor();
char wielkosci_proporcjonalne();

int t;
char w;

int main()
{
   t=0;
   cout<<"\t\t\t\t/***menu***/\n\n";
   cout<<"1.Wielkości proporcjonalne\n"<<endl;
   cout<<"Wybierz temat: ";
   cin>>t;

   if(t==1) wielkosci_proporcjonalne();
   else
   {
       ss;
       cout<<"Zły wybór! Wybierz jeszcze raz!\n";
       main();
   }
}
char wielkosci_proporcjonalne()
{
   ss;
   float a, b, c;

   cout<<"Podaj c: ";
   cin>>c;
   cout<<"\nPodaj a: ";
   cin>>a;
   cout<<"\nPodaj b: ";
   cin>>b;

   c=c/(a+b);
   a=c*a;
   b=c*b;
   ss;

   cout<<"a= "<<a<<"\nb= "<<b<<"\n";
   wybor();
   return 0;
}

void wybor()
{
  cout<<"\n\n1.Powrót\n2.Wyjście\nWybór: ";
  cin>>w;
  if(w==1)
  {
      ss;
      main();
  }
  else if(w==2)
  {
      exit(0);
  }
  else
  {
      cout<<"Zły wybór! Spróbuj jeszcze raz!\n";
  }
}

Problem polega na tym, że po wybraniu "powrót" lub "wyjście" wyświetla się od razu "Zły wybór[...]". Pomoże mi ktoś znaleźć błąd?

PS: Nie wiem czy to istotne, ale używam Linux Ubuntu 14.04

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Program do restrukturyzacji.

 

Nigdy, przenigdy nie powinno się ręcznie wywoływać maina!

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Program do restrukturyzacji.

 

Nigdy, przenigdy nie powinno się ręcznie wywoływać maina!

W takim razie gdy zajdzie potrzeba to jak go wywołać, skoro nie można tego zrobić ręcznie?

PS: Postaram się poprrawić kod, aby tego maina nie wywoływał, dzięki ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

1) nie wywołujemy ręcznie maina

2) rekurencja nie jest zła, pod warunkiem, że panujemy nad tym ile poziomów maksymalnie będzie zagłebionych - tu tego nie wiadomo, co powinno dać do myślenia, jak problem rozwiązać inaczej

3) wywoływanie do czyszczenia ekranu operacją system nie jest najlepszym pomysłem, kiedyś wykonywało się operacje nowej strony (wypisanie '\f'), ale ponoć nie działa na wszystkich obecnych konsolach...

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Napisałem nowy kod, jednak znowu coś nie działa :( . Dopiero co przerabiam wskaźniki, ale postanowiłem je wykorzystać w programie, możliwe więc że to wnich tkwi błąd. Problem polega na tym, że funckja menu() cały czas stosuje rekurencję. Kod:

#define ss; system("clear")//na windows zmienić "clear" na "cls"
#include <iostream>
#include <cstdlib>
using namespace std;

char *m_;

void *menu(), proporcje();

int main()
{
   menu();
}
void *menu()
{
   m_= new char;
   ss;
   cout<<"\t\t\t/***Menu***/\n";
   cout<<"Tematy:\n";
   cout<<"[1]Proporcje\n";
   cout<<"[0]Wyjście\n\n";
   cout<<"Wybór: ";
   cin>>*m_;
   if(*m_==1)
   {
       proporcje();
   }
   else if(*m_==0)
   {
       exit(0);
   }
   else
   {
       menu();
   }
}
void proporcje()
{
   cout<<"Funkcja się uruchomiła!\n";
}

3) wywoływanie do czyszczenia ekranu operacją system nie jest najlepszym pomysłem, kiedyś wykonywało się operacje nowej strony (wypisanie '\f'), ale ponoć nie działa na wszystkich obecnych konsolach...

Chyba mi te /f nie działa, bo piszę to i program jakby to pomija :(

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Skąd ten wstręt do pętli? Póki nie zaprzyjaźnisz się z nimi i nie zaczniesz je intuicyjnie stosować możesz sobie dać spokój z nauką kolejnych rzeczy, w szczególności wskaźników.

 

Użycie wskaźników w takim programie jest zupełnie bez sensu. Program który podałeś działa inaczej niż chcesz, ponieważ używasz zmiennej znakowej (która służy do reprezentacji pojedynczych znaków "drukowalnych") i porównujesz ją nie ze znakiem którego szukasz, a wartością która reprezentuje inny znak. Rzuć okiem do tabeli ascii.

 

Uproszczony kod z pętelką:

#include <iostream>
using namespace std;

void proporcje()
{
   cout<<"Funkcja się uruchomiła!\n";
}

int main()
{
   int m_;

do
{
	cout<<  "\t\t\t/***Menu***/\n"
			"Tematy:\n"
			"[1]Proporcje\n"
			"[0]Wyjście\n\n"
			"Wybór: ";

	cin>> m_;

	if(m_==1)
	{
		proporcje();
	}

}while(m_ != 0);
}

 

Na obecnym etapie zrezygnowałbym z czyszczenia zawartości konsoli, gdyż nie istnieje w samym języku mechanizm który by do tego służył.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Skąd ten wstręt do pętli? Póki nie zaprzyjaźnisz się z nimi i nie zaczniesz je intuicyjnie stosować możesz sobie dać spokój z nauką kolejnych rzeczy, w szczególności wskaźników.

 

Użycie wskaźników w takim programie jest zupełnie bez sensu. Program który podałeś działa inaczej niż chcesz, ponieważ używasz zmiennej znakowej (która służy do reprezentacji pojedynczych znaków "drukowalnych") i porównujesz ją nie ze znakiem którego szukasz, a wartością która reprezentuje inny znak. Rzuć okiem do tabeli ascii.

 

Uproszczony kod z pętelką:

#include <iostream>
using namespace std;

void proporcje()
{
   cout<<"Funkcja się uruchomiła!\n";
}

int main()
{
   int m_;

do
{
	cout<<  "\t\t\t/***Menu***/\n"
			"Tematy:\n"
			"[1]Proporcje\n"
			"[0]Wyjście\n\n"
			"Wybór: ";

	cin>> m_;

	if(m_==1)
	{
		proporcje();
	}

}while(m_ != 0);
}

 

Na obecnym etapie zrezygnowałbym z czyszczenia zawartości konsoli, gdyż nie istnieje w samym języku mechanizm który by do tego służył.

Dzięki za pomoc, postaram się teraz przyswajać z pętlami ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jak się bawisz wskaźnikami, to uważaj gdzie i ile razy wywołujesz "new".

Globalna zmienna wskaźnikowa i new w pętli lub rekurencji to proszenie się o kłopoty:

-wyciek pamięci, ciągle alokujesz nową i nie zwalniasz jej, w tym programie niewielki problem, ale przy większym potrafi zaboleć (zwłaszcza jak ma działać w nieskończoność)

-gubienie wartości, która była przechowywana w zmiennej, tutaj znowu niewielki problem, ale w przypadku wykorzystywania zmiennej w kilku miejscach można doświadczyć nieprzyjemnych sytuacji

 

Postaraj się bardziej świadomie korzystać z elementów języka.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...