[C/C++] Obraceni retezce

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod PepaH 6. 3. 2006 12:44

Potrebuju co nejefektivnejsi algoritmus na obraceni retezce. Staci funkce ktera ma jako parametr retezec a vraci ho obraceny pozpatku. Diky za jakykoliv namet....

//adams: upraven název threadu.
PepaH
Junior

Odeslat příspěvekod PepaH 6. 3. 2006 12:49

Tak uz to mam

void obrret(char s[])
{
int c,i,j;
for(i=0,j=strlen(s)-1;i<j;i++,j--)
{ c=s[i];s[i]=s[j];s[j]=c;}
}


snad je to ten nejefektivnejsi zpusob....
PepaH
Junior

Odeslat příspěvekod badger 6. 3. 2006 12:53

riesenim by mohlo byt aj pouzit funkciu strrev(...);
badger
Junior
Uživatelský avatar

Odeslat příspěvekod baran 6. 3. 2006 13:08

Kód: Vybrat vše
#define SWAPTCHAR(a,b) { TCHAR t; t = (a); a = b; b = t; }

TCHAR *invstr(TCHAR *str)
{
   TCHAR *forward = str;
   TCHAR *backward = str + _tcslen(str) - 1;
   TCHAR temp;

   while (backward > forward)
   {
      SWAPTCHAR(*forward, *backward);

      forward++;
      backward--;
   }

   return str;
}


//adams: doplněn tag code.
baran
Kolemjdoucí

Odeslat příspěvekod 2ge 6. 3. 2006 14:01

nie je nahohou najlepsie pouzit fciu schar *strrev(char *s); ako uz bolo hore poznamenane ? Ta by mala byt najrychlejsia a aj co sa tyka prehladnosti v programe najlepsie riesenie
SubDownloader - stahuj a nahravaj titulky k filmom pomocou opensource programu z OpenSubtitles.org
2ge
Junior
Uživatelský avatar

Odeslat příspěvekod adams 6. 3. 2006 14:28

pánové, používejte tag code !

stačí jen před celý blok kódu doplnit tag [code] a na konec bloku dopsat [/code]

rozdíl mezi ošetřenou a neošetřenou částí je propastný:



while (backward > forward)
{
SWAPTCHAR(*forward, *backward);

forward++;
backward--;
}


Kód: Vybrat vše
   while (backward > forward)
   {
      SWAPTCHAR(*forward, *backward);

      forward++;
      backward--;
   }



zápis vypadá takto:

Kód: Vybrat vše
[code]
   while (backward > forward)
   {
      SWAPTCHAR(*forward, *backward);

      forward++;
      backward--;
   }

[/code]
-
adams
VIP uživatel
Uživatelský avatar

Odeslat příspěvekod zdenak(smazano) 6. 3. 2006 14:41

PepaH píše:Potrebuju co nejefektivnejsi algoritmus na obraceni retezce. Staci funkce ktera ma jako parametr retezec a vraci ho obraceny pozpatku. Diky za jakykoliv namet....


Kód: Vybrat vše
#include <string>



int main() {

    typedef std::string string_t;
   
    string_t s1("nejaky retezec");
    //obraceni:
    string_t s2(s1.rbegin(), s1.rend());

   
    return 0;
}
zdenak(smazano)
Kolemjdoucí

Odeslat příspěvekod PepaH 6. 3. 2006 14:59

Diky panove, akorat jsem zapomnel poznamenat ze jsem nemohl pouzit zadnou knihovni funkci, maximalne funkci pro delku retezce :-)
PepaH
Junior

Odeslat příspěvekod Chichi 6. 3. 2006 22:51

a co takhle jak prevest retezec velkych pismen na malá dá se to udelat jednou funkcí???? (bez cyklů)
Nick: Chichi; Povolání: Nosič dříví do lesa; Zájmy: Hledání dříví
Chichi
Junior
Uživatelský avatar

Odeslat příspěvekod zdeneks 6. 3. 2006 23:30

Udelate za me nekdo semestralni prace? Bez naroku na honorar, samozrejme ;-) Chci se jen par tydnu flakat :-P
zdeneks
Junior

Odeslat příspěvekod khihihi 7. 3. 2006 01:23

PepaH píše:Tak uz to mam
Kód: Vybrat vše
void obrret(char s[])
{
int c,i,j;
for(i=0,j=strlen(s)-1;i<j;i++,j--)
{ c=s[i];s[i]=s[j];s[j]=c;}
}

snad je to ten nejefektivnejsi zpusob....


praca s indexami [] je pre cpu rychlejsia nez s pointrami (aspon ak som dobre pochopil tipy pre programovanie od amd), lenze v kazdej iteracii cyklu nanovo spocitavas strlen... co ma teda k efektivite daleko ;)
// edit: slepota, bodkociarku som si zle vsimol :mrgreen: beriem spat

Chichi píše:a co takhle jak prevest retezec velkych pismen na malá dá se to udelat jednou funkcí???? (bez cyklů)l/quote]

jednou funkciou sa to da, lenze ta si bude musiet cely retazec preliezt po znakoch tak ci tak..
Naposledy upravil khihihi dne 7. 3. 2006 12:52, celkově upraveno 1
Moderátor diskusného fóra Živě.cz ve výslužbě
khihihi
VIP uživatel
Uživatelský avatar

Odeslat příspěvekod IgorK 7. 3. 2006 03:41

PepaH píše:Tak uz to mam

void obrret(char s[])
{
int c,i,j;
for(i=0,j=strlen(s)-1;i<j;i++,j--)
{ c=s[i];s[i]=s[j];s[j]=c;}
}


snad je to ten nejefektivnejsi zpusob....


toto je sice pekne, ale neuchovava to zdrojovy retazec. ja by som to riesil napr. takto:
Kód: Vybrat vše
#include <string>
#include <iostream.h>

using namespace std;

int main(void)
{
  char retazec[] = "a obratime poradna.net";
  int velkost = strlen(retazec);
  char* reverse = new char[velkost+1];
  for(int i=0,rev=velkost-1; i<velkost; i++,rev--)
  {
    reverse[rev] = retazec[i];
  }
  reverse[i] = retazec[i]; // ukoncime retazec znakom '\0'
  cout << reverse << endl;
  delete[] reverse;
  return 0;
}
Naposledy upravil IgorK dne 8. 3. 2006 20:25, celkově upraveno 1
I own all your code - pay me all your money!
IgorK
Junior
Uživatelský avatar

Odeslat příspěvekod Lemur 7. 3. 2006 18:52

khihihi píše:... praca s indexami [] je pre cpu rychlejsia nez s pointrami ...

To je pravda, ale v C jsou ukazatele i indexty to same, takze predkladac by mel prevadet oboji na stejny kod.
Lemur
VIP uživatel
Uživatelský avatar

Odeslat příspěvekod naomy.developer 9. 3. 2006 01:47

Ja bych zcela jiste postupoval takto a to u pro sto megabajtove zpracovani:

Kód: Vybrat vše
Label1->Caption = "ABCDEFGHCHIJKLMNOPQRSTUVWXYZ";

int iStrLen= Label1->Caption.Length();
int iSteper= 0;

unsigned char *bSourceString = new char [iStrLen + 1];
unsigned char *bTargetString = new char [iStrLen + 1];

strcpy(bSourceString, Label1->Caption.c_str());

// CYKLUS
for (int i = iStrLen; i > 0; i --)
{
    bTargetString[iSteper] = bSourceString[i-1];
    iSteper++;
}

Label2->Caption = AnsiString((char*)bTargetString, iStrLen);


delete [] bSourceString;
delete [] bTargetString;

Normal Standard Central Europe Human
naomy.developer
Junior
Uživatelský avatar

Odeslat příspěvekod naomy.developer 9. 3. 2006 02:11

A jeste lepe by to bylo prepsat do ASM a svapovat bajty tak jako to bylo nahore popsane, ale o tom az jindy ...
Normal Standard Central Europe Human
naomy.developer
Junior
Uživatelský avatar

Další stránka

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků