• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ Proste zadanie na char problem

VPS Starter Arubacloud
0 głosów
532 wizyt
pytanie zadane 25 listopada 2018 w C i C++ przez Padoski Użytkownik (990 p.)

Hejka, chciałem napisać program na charach, który będzie użytkownika prosił o wpisanie dowolnego zdania, a następnie będzie przekształcał je w taki sposób ze usunie spacje oraz zapisze to zdanie używając tylko duże litery, np: Ala ma kota zwróci ALAMAKOTA. Napisałem coś takiego:

Pytanie 1. Chcę uniknąć by for leciał po wszystkich znakach( czyli nie przez 1024 znaki). Jak zapisać ten warunek, że dopóki spotka to 0 ? Czy zrobiłem to dobrze?

Pytanie 2. W 12 linii wyskakuje mi błąd undefined referance to 'zamiana(char)'

I ogolnie prosiłbym o poprawienie tego kodu i wytluamczenie.

I jeszcze jedno pytanko czy jest funkcja na stringach która usuwa spacje? Łączy wyrazy ? bo nie moge jej nigdzie znaleźć na necie. Pozdrawiam

#include <iostream>

using namespace std;

void zamiana(char);

int main()
{
    char zdanie[1024];
    cout << "Podaj dowolne zdanie: ";
    cin.get(zdanie,1024);
    zamiana(zdanie[1024]);
}
void zamiana(char x[1024])
{
    for(int i=0; i!='0'; i++)
    {
        if((x[i] >=97) && (x[i] <=122))
        {
            x[i]=x[i]-32;
            cout <<x[i];
        }
        else
        {
            if(x[i] == 32) {}
            else cout<<x[i];
        }
    }
}

 

3 odpowiedzi

+1 głos
odpowiedź 25 listopada 2018 przez RafalS VIP (122,820 p.)
wybrane 25 listopada 2018 przez Padoski
 
Najlepsza

Sygnatura funkcji (parametry i nazwa) musza byc takie same w definicji i deklaracji:

void zamiana(char[1024]);

void zamiana(char[1024])
{
   //code
}
  1. Prawie dobrze. Porównujesz z '0', które jest znakiem zero a chcesz porównywać ze znakiem o kodzie 0, który oznacza null - '\0' lub nawet z liczba 0
  2. char zdanie[1024];
    zamiana(zdanie[1024]);

    próbujesz przesłać pojedynczyu char do funkcji przyjmujacej tablice 1024 charow. Popraw na:
     

    zamiana(zdanie);
    

Czego nie rozumiesz w tym kodzie? Do tablicy na 1024 znaki wczytujesz z konsoli napis. W funkcji zamiana sprawdzasz czy litera jest mala - jesli tak to zamieniasz na duza w przeciwnym wypadku upewniasz sie czy nie jest spacja - jesli nie jest to ją wypisujesz - w przeciwnym wypadku ignorujesz.

Co do funkcji usuwającej spacje to możesz wykorzystać std::replace z <algorithm>:

    string s = "Polska dla polakow! Ziemia dla ziemniakow!";
    s.erase(std::remove(s.begin(), s.end(), ' '), s.end());

Wymaga to jednak troche wiedzy o iteratorach i obycia algorytmami STL.

Kilka rzeczy mozna uprosić w Twoim kodzie:

  1. Zamiast porównywania x[i] z kodami ascii mozesz porownac je z charem:
    if(x[i] >= 'a' && x[i] <= 'z')

    A najlepiej uzyc funkcji islower(char):

    if(islower(x[i]))
  2. Ten kawalek kodu:
    		else
    		{
    			if (x[i] == 32) {}
    			else cout << x[i];
    		}

    mozna uproscic tak:

    		else if(x[i] != ' ')
    		{
    			cout << x[i]
    
komentarz 25 listopada 2018 przez Padoski Użytkownik (990 p.)

To poprawiłem go w taki sposob i teraz nie dziala. Ten '\0' nie powinno byc tak "\n" ? Nic teraz nie wypisuje. Poprawiłbys go? Bede mega wdzieczny. Kod rozumiem, no ale nie wiem co teraz w nim nie tak?

#include <iostream>

using namespace std;

void zamiana(char  x[1024]);

int main()
{
    char zdanie[1024];
    cout << "Podaj dowolne zdanie: ";
    cin.get(zdanie,1024);
    zamiana(zdanie);
}
void zamiana(char x[1024])
{
    for(int i=0; i!='\0'; i++)
    {
        if((x[i] >=97) && (x[i] <=122))
        {
            x[i]=x[i]-32;
            cout <<x[i];
        }

    else if(x[i] != ' ')
        {
            cout << x[i];
        }
    }
}

 

komentarz 25 listopada 2018 przez RafalS VIP (122,820 p.)
for (int i = 0; x[i] != '\0'; i++)

 

komentarz 25 listopada 2018 przez Padoski Użytkownik (990 p.)
Dzieki wielkie ! :)
+1 głos
odpowiedź 25 listopada 2018 przez adrian17 Ekspert (344,100 p.)

Chcę uniknąć by for leciał po wszystkich znakach( czyli nie przez 1024 znaki). Jak zapisać ten warunek, że dopóki spotka to 0 ? Czy zrobiłem to dobrze?

Technicznie dobrze, ale można lepiej. Biblioteka standardowa ma strlen() która zwróci Ci długość tekstu.

Natomiast to wciąż C - najlepiej by użyć c++owego std::string.

Pytanie 2. W 12 linii wyskakuje mi błąd undefined referance to 'zamiana(char)'

Na górze zadeklarowałeś funkcję `zamiana` biorącą znak, niżej zdefiniowałeś funkcję `zamiana` biorącą (wskaźnik na) tablicę znaków.

I jeszcze jedno pytanko czy jest funkcja na stringach która usuwa spacje? Łączy wyrazy?

Nie w bibliotece standardowej. Usuwanie spacji można zrobić kombinując z string::erase+std::remove, natomiast nie jest to zbyt wygodne.

komentarz 25 listopada 2018 przez Padoski Użytkownik (990 p.)
Dalej nie za bardzo rozumiem jak poprawic kod w linii nr 12 . Jakbys mogl go poprawic, to bede bardzo wdzieczny :) Bo teraz tego jakos nie widze.
+1 głos
odpowiedź 25 listopada 2018 przez Colossus Mądrala (6,410 p.)
#include <iostream>

using namespace std;

void zamiana(char []);

int main()
{
	char zdanie[1024];
	cout << "Podaj dowolne zdanie: ";
	cin.getline(zdanie, 1024);
	zamiana(zdanie);
	system("pause");
	return 0;
}

void zamiana(char x[]) {
	for (int i = 0; x[i] != '\0'; i++)
	{
		if (x[i] != ' ') {
			if ((x[i] >= 'a') && (x[i] <= 'z'))
			{
				x[i] = x[i] - ('a' - 'A');
			}
			cout << x[i];
		}
	}
}

 

komentarz 25 listopada 2018 przez Padoski Użytkownik (990 p.)

Super, dzieki wielkie mam pytanie, a co oznacza ta linia kodu ?

x[i] = x[i] - ('a' - 'A');

 

x[i] staje się x[i] minus ???

komentarz 25 listopada 2018 przez Colossus Mądrala (6,410 p.)
to jest odległość litery 'a' od litery 'A' czyli 32 w twoim kodzie

Podobne pytania

+1 głos
3 odpowiedzi 240 wizyt
pytanie zadane 13 stycznia 2021 w C i C++ przez Adamek185wp Obywatel (1,280 p.)
0 głosów
2 odpowiedzi 3,001 wizyt
pytanie zadane 1 stycznia 2019 w C i C++ przez Drax658 Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 492 wizyt
pytanie zadane 24 czerwca 2017 w C i C++ przez BinaryMan Stary wyjadacz (12,620 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...