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

C++ tablice wyrazowe (string,char)

Object Storage Arubacloud
0 głosów
1,579 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 (155,460 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 (155,460 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 (155,460 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 (155,460 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 572 wizyt
pytanie zadane 5 listopada 2017 w C i C++ przez paweljumper Obywatel (1,260 p.)
0 głosów
3 odpowiedzi 1,637 wizyt
pytanie zadane 14 października 2017 w C i C++ przez Shiro Stary wyjadacz (10,300 p.)
0 głosów
1 odpowiedź 298 wizyt
pytanie zadane 19 lipca 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,961 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...