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

Odwracanie tekstu

Cloud VPS
+1 głos
2,046 wizyt
pytanie zadane 29 maja 2018 w C i C++ przez Agnes Użytkownik (990 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 (23,120 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 (106,230 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 (23,120 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,830 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 (990 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 Mędrzec (158,980 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 12332112332121 Dyskutant (8,270 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 Ekspert (256,600 p.)
edycja 1 stycznia 2021 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ź 3,734 wizyt
pytanie zadane 4 marca 2018 w C i C++ przez bartez86 Nowicjusz (220 p.)
0 głosów
3 odpowiedzi 5,569 wizyt
0 głosów
1 odpowiedź 523 wizyt
pytanie zadane 12 grudnia 2016 w C i C++ przez ijo Nowicjusz (220 p.)

93,487 zapytań

142,423 odpowiedzi

322,773 komentarzy

62,908 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

Kursy INF.02 i INF.03
...