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

C++ tablice wyrazowe (string,char)

Cloud VPS
0 głosów
1,928 wizyt
pytanie zadane 12 listopada 2017 w C i C++ przez Nordzixd Nowicjusz (160 p.)
edycja 12 listopada 2017 przez Eryk Andrzejewski

Witam, mam problem, gdyż stworzyłem tablicę z wyrazem "MAMA" i tablica wypisywała mi wszystkie 24 kombinacje z tych 4 liter chciałem by kombinacje, które powtarzają się nie ukazywały się ale nie dałem rady. Kod zamieszczam poniżej, liczę na pomoc:
 

#include <iostream>
#include <string.h>
using namespace std;
char napis[5]="MAMA";
int main()
{
    int i1, i2, i3, i4 ;
    for(i1=0; i1<4;i1++)
    {
              for (i2=0; i2<2; i2++)
              {
                  if(i1==i2) continue;
                  for(i3=0; i3<4; i3++)
                  {
                            if(i3==i1 || i3==i2) continue;
                            i4=6-i1-i2-i3;
                            cout << napis[i1]<<napis[i2]<<napis[i3]<<napis[i4]<<endl;
                            }
                  }
                  if(napis[1]==napis[2] || napis[3]==napis[1] || napis[3]==napis[2] || napis[4]==napis[1] || napis[4]==napis[2] || napis[4]==napis[3] || napis[1]==napis[5] || napis[2]==napis[5] || napis[3]==napis[5] || napis[4]==napis[5] )
                  {
                   cout << "POWTARZA SIE!!!!" ;
      }
}
                  system("pause");
                  return 0;
}

 

komentarz 12 listopada 2017 przez mokrowski Mędrzec (158,840 p.)
A to ma być C czy C++? Bo teraz to ... sam nie wiem...
komentarz 12 listopada 2017 przez Nordzixd Nowicjusz (160 p.)
C++
komentarz 12 listopada 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)
Kod źródłowy proszę umieszczać w bloczku.

I radzę nie używać system()..., szczególnie wtedy, gdy istnieją lepsze rozwiązania. W twoim przypadku, zamiast system("pause"), lepiej będzie użyć std::cin.get(). Takie rozwiązanie pozwoli na przenośność programu (będzie go można uruchomić na innych systemach, np. Linux, macOS, BSD).

I jeśli piszesz w C++ to includuj nagłówki z C++. Czyli jak już to <cstring>, nie <string.h>.

2 odpowiedzi

0 głosów
odpowiedź 12 listopada 2017 przez Nordzixd Nowicjusz (160 p.)
Próbowałem wyżej zrobić w if z  napisami by nie powtarzało tych samych kombinacji literowych ale to nie działa :(
0 głosów
odpowiedź 12 listopada 2017 przez mokrowski Mędrzec (158,840 p.)

A masz jakiś powód by "kopać się z koniem" w postaci surowych tablic i jednoliterowych nazw zmiennych?

Nie lepiej tak?

#include <string>
#include <iostream>
#include <algorithm>
#include <unordered_set>

int main() {
    std::string message = "MAMA";
    std::unordered_set<std::string> unique_permuted;

    do {
        unique_permuted.insert(message);
    } while(std::next_permutation(message.begin(), message.end()));
    unique_permuted.insert(message);

    // I prezentacja...
    for(const auto& val: unique_permuted) {
        std::cout << val << '\n';
    }
}

 

komentarz 12 listopada 2017 przez Nordzixd Nowicjusz (160 p.)
Nie mogę musze podobnie jak wyżej tylko zamiast tego ifa możesz coś wstawić ( mam do szkoły i nie mogę takiego rozwiniętego)
komentarz 12 listopada 2017 przez Nordzixd Nowicjusz (160 p.)
Proszę o pilną pomoć jeśli jest taka możliwość
komentarz 12 listopada 2017 przez mokrowski Mędrzec (158,840 p.)

Zacznij od kodu prawidłowego generowania permutacji:


#include <iostream>
#include <cstring>

void swap_values(char *val1, char *val2) {
    char tmp;
    tmp = *val1;
    *val1 = *val2;
    *val2 = tmp;
}

void permute(char *msg, size_t first, size_t last) {
    if(first == last) {
        std::cout << msg << '\n';
    }
    else {
        for(size_t idx = first; idx <= last; ++idx) {
            swap_values(msg + 1, msg + idx);
            permute(msg, first + 1, last);
            swap_values(msg + 1, msg + idx);
        }
    }
}

int main() {
    char msg[] = "MAMA";
    permute(msg, 0, strlen(msg) - 1);
}

Teraz wystarczy dodać gromadzenie ich w kontenerze (jeśli się upierasz może to być tablica). Później zwrócić jedynie unikalne. Dla 4 literowego napisu nie ma sensu optymalizować w locie przeszukiwania unikalnych. 

komentarz 12 listopada 2017 przez Nordzixd Nowicjusz (160 p.)
Dziękuję, ale mógłby Pan przerobić mój program, gdyż  niestety musze mieć na wzorcu tego co dodałem w opisie :/ . Może Pan wywalić ifa tego długiego i coś zamiast niego. Bo innego kodu nie mogę oddać w szkole
komentarz 12 listopada 2017 przez mokrowski Mędrzec (158,840 p.)
To jest wzorzec!!!?

Nie nie mógłbym. Powodów jest kilka. Moim zdaniem to antywzorzec programowania. Drugi powód (najważniejszy). Mam wrażenie że nie chcesz się czegoś nauczyć a jedynie "zaliczyć zadanie". Mogę Ci tylko podpowiedzieć że napisy "w takim stylu" porównuje się z użyciem strcmp.

Podobne pytania

+1 głos
2 odpowiedzi 766 wizyt
pytanie zadane 5 listopada 2017 w C i C++ przez paweljumper Obywatel (1,260 p.)
0 głosów
3 odpowiedzi 2,113 wizyt
pytanie zadane 14 października 2017 w C i C++ przez Shiro Stary wyjadacz (10,300 p.)
0 głosów
1 odpowiedź 805 wizyt
pytanie zadane 19 lipca 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

93,469 zapytań

142,404 odpowiedzi

322,716 komentarzy

62,852 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
...