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

Odwracanie tekstu

+1 głos
823 wizyt
pytanie zadane 29 maja 2018 w C i C++ przez Agnes Użytkownik (970 p.)

Mógłby ktoś ocenić poniższy kod i napisać, czy i jak dałoby się to napisać tak, by funkcja była bardziej uniwersalna/efektywna/prostsza/lepsza pod jakimś innym względem?

void zadanie()
{
	const int n = 6;
	char tekst[n] = { 'a', 'b', 'c', 'd', 'e', 'f' };
	char rev[n];
	

	for (int i = 0; i < n; i++)		
	{								
		rev[i] = tekst[(n - 1) - i];
	}
	for(int i = 0; i < n; i++)
		cout << rev[i];
}

 

komentarz 29 maja 2018 przez Jakub 0 Pasjonat (21,080 p.)
1. Po pierwsze lepiej kiedy tekst do odwrócenia będzie podawany jako argument dla funkcji ( możesz użyć tradycyjnych łańcuchów z C lub z std::string jeżeli piszesz to w c++ )

2. Co do samego tekstu, nie lepiej by był on w formie łańcucha? Tzn. dodajesz na koniec tekstu znak '\0' czyli nul, wtedy też nie będziesz musiał wypisywać tego tekstu w pętli for, lecz za pomocą np. printf()

3. Zamiast wyświetlać tekst w funkcji zwróć wskaźnik na niego ( jeżeli ma być to łańcuch jak w C to rzecz jasna musisz zrobić dynamicznie alokowaną tablice char'ów )
komentarz 29 maja 2018 przez draghan VIP (105,900 p.)

Zamiast wyświetlać tekst w funkcji zwróć wskaźnik na niego

O, a w jakim celu wskaźnik? :)

Dodałbym do listy po prostu skorzystanie z std::reverse()... :P

komentarz 29 maja 2018 przez Jakub 0 Pasjonat (21,080 p.)

Dodałbym do listy po prostu skorzystanie z std::reverse()... :P

Pisanie czegoś samemu zamiast korzystać z gotowych metod chyba bardziej uczy

O, a w jakim celu wskaźnik? :)

chodzi mi o funkcję:

char* zadanie(const char* str); //zwróci odwróconą wersje 

oczywiście było by prościej użyć std::string

komentarz 29 maja 2018 przez Hiskiel Pasjonat (22,850 p.)

Tak właściwe to po co to pisać? Po co wyważać drzwi od nowa? laugh

 

PS sam nie ogarniał tych nowostek, nie jesteś sam

komentarz 29 maja 2018 przez Agnes Użytkownik (970 p.)

Pisanie czegoś samemu zamiast korzystać z gotowych metod chyba bardziej uczy ;)

Też, ale główna przyczyna jest taka, że po prostu  takie mamy zadanie domowe.

 

2 odpowiedzi

0 głosów
odpowiedź 29 maja 2018 przez mokrowski VIP (146,420 p.)

Nie no... można... 

#include <iostream>

void revStr(char * msg, std::size_t n) {
    char * end = msg + n - 2;
    while(msg < end) {
        char c = *end;
        *end-- = *msg;
        *msg++ = c;
    }
}

int main() {
    char msg[] = "Ala ma kota";
    revStr(msg, sizeof(msg));
    std::cout << msg << '\n';
}

Ale to takie kruche że ... lepiej nie... 

0 głosów
odpowiedź 31 grudnia 2020 przez AizoOz Początkujący (490 p.)

Podpinam się pod temat .

Dlaczego nie wczytuje mi pierwszego słowa ? 

#include <iostream>
#include <string>


int main() {
    
    const int ile = 2;
    
    std::string napis[ile];
    int dlugosc[ile];
    
    std::cout << "Podaj wyraz : ";
    std::cout << std::endl;
    
    for (int i = 0; i <= ile; i++)
    {
        std::cin >> napis[i];
        dlugosc[i] = napis[i].length();
    }
    
    
    for (int i = 0; i <= ile; i++)
    {
        std::cout << "Napis nr : " << i+1 << " to " << napis[i] << std::endl << dlugosc[i] << std::endl;
    }
    
    return 0;
}

 

komentarz 31 grudnia 2020 przez KumberTwo Dyskutant (8,260 p.)
Nie wiem czy na pewno problem jest w tym, ale deklarujesz 2 stringi a w pętli wczytujesz 3 razy - i=0, i=1, i=2. Dokładnie to samo jest w drugiej pętli
komentarz 31 grudnia 2020 przez AizoOz Początkujący (490 p.)
Dziękuję za nakierowanie.

String gdy zmieniłem na 3 to wczytywał napis 4 razy ( od 0 do 3 ) , więc wtedy usunąłem '=' z for i problem rozwiązało :)
komentarz 31 grudnia 2020 przez VBService VIP (136,750 p.)
edycja 1 stycznia przez VBService

@AizoOz, wink

#include<iostream>
#include<string.h>
#include<stdio.h>
 
int main() {     
    const int MAX_CHAR_PROCESSING = 100;
    char sentence[MAX_CHAR_PROCESSING], * word;
    
    std::cout << "Podaj zdanie (max. dlugosc: " << MAX_CHAR_PROCESSING << " znakow):\n";
    std::cin.getline(sentence, MAX_CHAR_PROCESSING);
    
    int length_ = strlen(sentence);
    std::string line = "+-----------+-----------------+---------+\n";
    
    printf("%s", line.c_str());
    printf("| Wyraz nr. |  Wyraz (fraza)  | Dlugosc |\n");
    printf("%s", line.c_str());

    int count_word = 0;
     
    word = strtok(sentence, " ");
     
    while (NULL != word) {
        count_word++;
        printf("|%6d%5c|%12s%5c|%5d%4c|\n", count_word, 32, word, 32, (int)strlen(word), 32);
        word = strtok(NULL, " ");
    }
   
    printf("%s", line.c_str());
    std::cout << "  Ilosc zankow: " << length_ << " (wszyskie + spacje)\n";
    std::cout << "    Ilosc slow: " << count_word;

    return 0;
}

Podobne pytania

0 głosów
1 odpowiedź 1,409 wizyt
pytanie zadane 4 marca 2018 w C i C++ przez bartez86 Nowicjusz (220 p.)
0 głosów
3 odpowiedzi 3,216 wizyt
0 głosów
1 odpowiedź 271 wizyt
pytanie zadane 12 grudnia 2016 w C i C++ przez ijo Nowicjusz (220 p.)
Porady nie od parady
Komentarze do pytań nie służą do odpowiadania, od tego jest wydzielona sekcja odpowiedzi. Funkcją komentarzy jest natomiast możliwość uzyskania dodatkowych informacji na temat samego posta.Komentarze

85,698 zapytań

134,499 odpowiedzi

298,513 komentarzy

56,625 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...