Generowanie ostatniego alfabetycznie palindromu - nieproszone znaki na wyjściu

Odpowiedz Nowy wątek
2013-01-15 20:25
0

Witam,
napisałem program, który pobiera od użytkownika dowolny palindrom, następnie generuje jego ostatni alfabetycznie odpowiednik. Dla przykładu:
wejście: latootal wyjście: tolaalot
wejście: alaala wyjście: laaaal
Wszystko działa ok, przykładowe i wymyślone przeze mnie dane przechodzą bez problemu. Jednak z założenia ma być użyty kompilator G++ (taki jest na platformie uczelni), natomiast ja pisałem w IDE Dev C++, w którym jest Mingw port GCC. I na wyjściu w przypadku ciągu: latootal zamiast tolaalot otrzymuję dwa romby ze znakiem zapytania tolaDZalot. I tutaj niezbyt wiem jak się tego pozbyć, więc kieruję prośbę do Was o wskazówki, na kierunkowanie mnie co może być nie tak :)
Kod programu:

#include <cstring>
#include <algorithm>
#include <iostream>
#include <fstream>

using namespace std ;

char x[231];
int compare (const void * a, const void * b)
{
    return *(char*)a-*(char*)b;
}

void reverse(char word[])
{
    int len=strlen(word);
    for (int i=0;i<len/2;i++)
    {
        word[i]^=word[len-i-1];
        word[len-i-1]^=word[i]; 
        word[i]^=word[len-i-1];
    }
}

int main()
{
    char x2[231];
    char x3[231];
    scanf("%300s",x);

    if (strlen(x) % 2 == 0) 
    {
        strncpy(x2,x,strlen(x)/2);
        qsort (x2,strlen(x2),1,compare);
        reverse(x2);

        strncpy(x3,x,strlen(x)/2);
        qsort (x3,strlen(x3),1,compare);

        cout << x2 << x3;
    }
    else if (strlen(x) % 2 != 0) 
    {
    int lenght = strlen(x);
        int t1 = lenght/2;

        strncpy(x2,x,strlen(x)/2);
        qsort (x2,strlen(x2),1,compare);
        reverse(x2);

    strncpy(x3,x,strlen(x)/2);
        qsort (x3,strlen(x3),1,compare);

        cout << x2<<x[(strlen(x)/2)]<<x3;
    }
}

Pozostało 580 znaków

2013-01-16 11:06
0

źle: scanf("%300s",x); a masz x[231].
po co mieszasz C (scanf qsort) i STL z C++ (cout)? Zdecyduj się na jedno
strncpy nie dodaje kończącego zera na końcu jeśli nie kopiujesz całego c-stringa, więc to szczęście decyduje czy masz tam potrzebne zera czy nie - i stare gcc jest dla ciebie "szczęśliwe" - to tu jest twój błąd.

Radzę przepisać wszystko stosując STL (ja się zmieściłem w 15 liniach licząc puste linie przeznaczone na estetykę) (nie jest konieczne rozróżnianie przypadków o parzystej i nieparzystej długości).


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22, 2013-01-16 11:19

Pozostało 580 znaków

2013-01-16 16:14
1

K**wa, ale ludzi nie potrafią myśleć. Przecież to zadanie to tylko zakamuflowane: -posortuj podany napis nie rosnąco:

#include <iostream>
#include <algorithm>
using namespace std;

int main()
  {
   string s;
   cin>>s;
   sort(s.rbegin(),s.rend());
   cout<<s<<endl;
   return 0;
  }

</del>

w związku ze słuszną uwagą od @Endrju, muszą dojść dwa wiersze:

#include <iostream>
#include <algorithm>
using namespace std;

int main()
  {
   string s;
   cin>>s;
   size_t half=s.length()>>1; // length/2
   sort(s.begin(),s.begin()+half,greater<char>());
   sort(s.end()-half,s.end());
   cout<<s<<endl;
   return 0;
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2013-01-16 16:33
Pokaż pozostałe 6 komentarzy
Była taka dyskujsja, w którym Ci napisałem, że GCC obsługuje taką masę architektur, że nie mam bladego pojęcia w czym i na co Ty możesz pisać. :-P poza tym po co używać tych starych kompilatorów, skoro są nowsze? Takim samym rozumowaniem można by pisać bez żadnego standardu C ani C++ bo przecież były takie czasy, że go nie było. Albo wszystko na DOSa, bo przecież mam go gdzieś w szafce na dyskietkach. W końcu trzeba kiedyś skończyć z taką kompatybilnością wsteczną. - Endrju 2013-01-16 17:27
Chętnie przerobię wszystko co ten mój stały klient ma, na wersję kompilującą się pod GCC, z tym że on nie chce ponosić wydatków na to. - _13th_Dragon 2013-01-16 17:38
greater&lt;char&gt;() to nie jest przypadkiem wyrażenie lambda? Jeżeli tak, to argument "wciąż istnieją stare dziwne kompilatory bez optymalizacji" w tym wypadku nie ma sensu, bo o ile się nie mylę, to nie ma żadnego starego, dziwnego kompilatora C++, który obsługiwałby lambdy ;) - Patryk27 2013-01-16 17:42
Nie jest to lambda, jest to funkcja wzorcowa, która istnieje od początków C++. - _13th_Dragon 2013-01-16 17:44
Hm... no więc mój błąd (nie piszę na co dzień w C++). - Patryk27 2013-01-16 17:45

Pozostało 580 znaków

2013-01-16 18:19
0

Dziękuję serdecznie za pomoc. Myślałem, że i tak napisałem dość krótko, a tu widzę, że można nie tylko krócej ale i wielokroć poprawniej :) Jeszcze raz dzięki :)

Pozostało 580 znaków

2013-01-16 20:09
0

Nie chcąc zakładać nowego tematu, mam jeszcze pytanie odnośnie palindromów. Jak mogę przekształcić wyraz w dwa palindromy. Na wejściu zawsze będzie ciąg, z którego można stworzyć dwa identyczne palindromy. Np. będzie fraza laattool i chciałbym wyodrębnić po jednej sztuce każdego znaku. Tj w przypadku tego laattool do jednej zmiennej idzie po jednej literce (lato) a drugie lato do drugiej zmiennej. Próbowałem stringa jakoś posortować, lecz nie udaje mi się. Jakiej funkcji tu użyć?

Pozostało 580 znaków

2013-01-16 20:56
1
string s;
cin>>s;
bool tb[256]={false};
string half;
for(string::iterator i=s.begin();i!=s.end();++i) if(tb[*i]^=true) half+=*i;

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 2x, ostatnio: _13th_Dragon, 2013-01-16 20:57

Pozostało 580 znaków

2013-01-16 23:25
0

OK. Dziękuję bardzo. Korzystając z Waszych wskazówek rozwiązałem kolejne zadania - i utknąłem przy tworzeniu n-tego palindromu. Według mnie program działa w stu procentach, choć pewnie mnie znów zrugacie za zbyt długi i pokręcony kod. Starałem się jak mogłem. Ale mam do tego programu jedno ale: wysyłając zadanie na serwer, zdaje tylko 4/10 testów, przy reszcie dowiaduję się, że "zła odpowiedź". Gdybyście mogli rzucić okiem, co znowu schrzaniłem, byłbym wdzięczny :)

edytowany 1x, ostatnio: pablo7890, 2013-01-16 23:25

Pozostało 580 znaków

2013-01-19 20:00
0

Ponawiam pytanie z poprzedniego postu :)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0