problem z if else

problem z if else
EM
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 10 lat
  • Postów:271
0

cześć wszystkim jestem nowym użytkownikiem jest to mój pierwszy post na tym forum. Od niedawna uczę się c++ i trafiłem na problem który pewnie dla wielu z was jest banalny jednak ja za nic w świecie nie mogę dostrzec błędu dlatego proszę o pomoc. Problem lezy w instrukcji if else ponieważ program zachowuje sie tak jakby nie widział wewnętrzego ifa sprawdza czy znak jest cyfra i wyswietla ciag znakow bez cyfr to jest ok ale dlaczego jezeli znak nie jest cyfra nie przechodzi do wewnatrz i nie zamienia liter? osobno te funkcje dzialaj dobrze problem zaczyna sie w polaczeniu sprawdzania czy jest to cyfra i jezeli nie to zamieniania na małe / duże litery dodam ze kompilator nie wyrzuca żadnego błędu oto kod:

Kopiuj
  
#include <iostream>
#include <fstream>
#include <cctype>
#include <cstdlib>
using namespace std;

int main()
{
    cout<< "Podaj tekst ";
    
    char znak;
    cin.get(znak);
    while (znak != '@')
    {
          if (znak != isdigit(znak))
          {                            
                                  
          if (islower(znak))
          {
                             znak = toupper(znak);
                             cout<< char (znak);
                             
                             }
                             
          else
          {
                             znak = tolower(znak);
                             cout<< char (znak);
                             
                             }
                             
          }
          else                                              
              cin.get(znak);
              
              }
    
    
    
    system("PAUSE");
}
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:5 dni
1

Jak sformatujesz kod po ludzku to natychmiast sam zobaczysz w czym problem.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
LN
  • Rejestracja:około 16 lat
  • Ostatnio:około rok
  • Postów:1398
0

Masz tu sformatowany kod:

Kopiuj
#include <iostream>
#include <fstream>
#include <cctype>
#include <cstdlib>
using namespace std;
 
int main() {
    cout<< "Podaj tekst ";
 
    char znak;
    cin.get(znak);
    while (znak != '@')  {
          if (znak != isdigit(znak)) {                            
              if (islower(znak))  {
                  znak = toupper(znak);
                  cout<< char (znak);
              } else {
                   znak = tolower(znak);
                   cout<< char (znak);
              }
          } else cin.get(znak);
 
     }
 system("PAUSE");
}
edytowany 1x, ostatnio: [losowa nazwa]
EM
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 10 lat
  • Postów:271
0

Kod który podałeś uwzględnia zamiane liter na małe / duże za to nie bierze pod uwage cyfr i wyświetla je razem z literami zamiast je odrzucać więc jeszcze gdzieś musi być błąd

wiem ze to banał ale naprawde nie rozumiem dlaczego jeżeli wczytany znak to cyfra to nie odrzuca jej w warunku i nie przechodzi do else wczytujac kolejny znak tylko go wyswietla

Kopiuj
if (znak != isdigit(znak))
edytowany 1x, ostatnio: emacs
byku_guzio
Przecież to jest dokładnie taki sam kod, jaki Ty podałeś, tyle, że sensownie sformatowany...
byku_guzio
zastanów się co zwraca funkcja isdigit i co siedzi w znak...
byku_guzio
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 7 lat
0

Masz tu poprawione i pamiętaj, że formatowanie kodu to nie jest wymysł jakiegoś szalonego typa.
Ten Twój warunek w pierwszym if if (znak != isdigit(znak)) jest totalnie bez sensu, bo praktycznie zawsze będzie prawdziwy.

Kopiuj
#include <iostream>

using namespace std;

int main()
{
	cout<< "Podaj tekst ";

	char znak;
	cin.get(znak);
	while (znak != '@')
	{
		if (!isdigit(znak))
		{                            
			if (islower(znak))
			{
				znak = toupper(znak);
				cout<< char (znak);
			}

			else
			{
				znak = tolower(znak);
				cout<< char (znak);
			}
		}                                          
		
		cin.get(znak);
	}

	cin.sync();
	cin.get();
}

EM
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 10 lat
  • Postów:271
0

teraz wszystko działa jak powinno dzieki za zainteresowanie bede zwracał uwage na to jak formatuje kod jeszcze raz dzieki!

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:5 dni
0

A tak naprawdę chodziło o to:

Kopiuj
#include <iostream>
#include <cctype>

using namespace std;
 
int main()
  {
   cout<< "Podaj tekst (do znaku @): ";   
   for(int znak;((znak=cin.get())!= '@')&&(znak!=EOF);)
     {
      if(islower(znak)) znak=toupper(znak);
      else if(isupper(znak)) znak=tolower(znak);
      else continue;
      cout<<(char)znak;
     }
   cin.sync();
   cin.get();
   return 0;
  }

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.