Zjednodušení kódu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Zjednodušení kódu – C / C++ – Fórum – Programujte.comZjednodušení kódu – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Sergei0
Newbie
15. 8. 2009   #1
-
0
-

Vymýšlel jsem program, který by měl vstupní řetězec string, v kterém je uložen název nějakého souboru rozpoznat, zda-li se jedná o obrázek, nebo ne.
Výsledný kód mi ovšem příjde příliš složitý a zdlouhoavý a příjde mi, že tam nepoužívám vůbec principy objektového programování.
Věřím, že je zde plno možností jak tento kód různě zkrátit a ačkoliv mi vzhledem k jeho funkčnosti nesejde na jeho zkracování, zajímalo by mě, co tam mám navíc nebo zbytečně.
Snažil jsem se postupovat logicky, tak jak rozpoznávám jestli je soubor obrázkem např. já:
1) hledám v řetězci znak tečky, který je předzvěstí, že následující znaky budou příponou (nemusí být ovšem pravda, ale já předpokládám se soubory názvu např. P89753734.jpg )
2) pak čtu následující znaky a porovnávám je se známými připonami obrázky
3) na základě shody rozhoduju, jestli je soubor obrázek, nebo ne.

#include <set>

#include <string>
#include <iostream>

using namespace std;

int main () {
set <char> tecka;
set <char> ::iterator iter2;

tecka.insert('.');

string text = "posrany obrazek.jpg";
cout << text << endl;


static char pripona[5] = { 'x' , 'x' , 'x' , 'x', '\0' }; //pole pripona ma 5 znaku a posledni je null .abc\0
bool bylatecka = false; //prepinac zda-li byla nactena tecka a jeho vychozi hodnota
for (int i = 0; i < text.size(); i++) {
iter2 = tecka.find (text.at(i));
if (iter2 == tecka.end() && bylatecka == false)
cout << text.at(i);
else {
bylatecka = true; //v retezci se objevila tecka tzn.. dalsi tri pismena jsou pripona souboru
//(jak se soubor bude jmenovat .torrent, nebo kaja.gott.jpg tak jsem v pyci)
cout << text.at(i);

static int poc_pripony = 0;
if (poc_pripony <= 3) { //postupne zpaisujem aktualni čtené pismenko do pole pripona (mělo by začínat znakem ".")
pripona[poc_pripony] = text.at(i) ;
poc_pripony++;
} //if (poc pripony)
} //else (byla tecka)

} //for (int i)

for (static int poc_pripony1 = 0; poc_pripony1 <= 3; poc_pripony1++) { //jen vypise nazev pripony
cout << pripona[poc_pripony1];
} //for (int poc pripony)

char pripona_jpg[] = ".jpg"; //zde je seznam siroce uzivanych pripon obrazkovych souboru
char pripona_bmp[] = ".bmp";
char pripona_pgn[] = ".pgn";
char pripona_gif[] = ".gif";
char pripona_tga[] = ".tga";
char pripona_TGA[] = ".TGA";
char pripona_JPG[] = ".JPG";
char pripona_BMP[] = ".BMP";
char pripona_PGN[] = ".PGN";
char pripona_GIF[] = ".GIF";
if (!strcmp(pripona, pripona_jpg) || !strcmp(pripona, pripona_JPG) || !strcmp(pripona, pripona_gif) || !strcmp(pripona, pripona_GIF) || !strcmp(pripona, pripona_pgn) || !strcmp(pripona, pripona_PGN) || !strcmp(pripona, pripona_tga) || !strcmp(pripona, pripona_TGA))
cout << endl << "pripona" << pripona << " JE obrazek";
else
cout << endl << "pripona" << pripona << " NENI obrazek";

cout << endl;
return 0;
} //int main


Nějaké návrhy na zjednodušení?

Nahlásit jako SPAM
IP: 62.129.41.–
Reklama
Reklama
Sergei0
Newbie
15. 8. 2009   #2
-
0
-

Nevím, jakým způsobem funguje x-scroll-bar u funkce [ code ] , ale nějak nepříjemně se mi to roztáhlo.... :D

Nahlásit jako SPAM
IP: 62.129.41.–
Matrix17
~ Anonymní uživatel
286 příspěvků
15. 8. 2009   #3
-
0
-

Já bych to udělal, takhle prošel bych si ten řetězec od konce a postupně si ukládal písmena do jinýho stringu. Jakmile bych narazil na tečku mám celou příponu. Teď musím ten string otočit jelikož se mi ta přípona uložila obráceně. No a teď když jí mám obrácenou jí jen porovnám a hotovo.

Nahlásit jako SPAM
IP: 78.156.128.–
Bald3rr0
Super člen
15. 8. 2009   #4
-
0
-

To Sergei : Problém s tečkou uvnitř názvu bych řešil tak, že bych jako příponu vzal poslední 3 písmena řetězce a uložil bych si je do nějaké proměnné. A porovnání přípon bych řešil tak, že bych si udělal buď dvourozměrné pole char nebo pole string a poté bych porovnával koncovku s jednotlivými indexy pole.

Nahlásit jako SPAM
IP: 82.100.0.–
don_Dominique0
Super člen
15. 8. 2009   #5
-
0
-

zjednodušit by se to dalo i tím, že si přípony uložíš do pole stringů, a to každou jednou a malými písmeny, pak je porovnáš se získanou příponou, na kterou uplatníš funkci tolower. A porovnání budeš provádot v cyklu.

Nahlásit jako SPAM
IP: 88.146.211.–
bukaj_0010
Věrný člen
15. 8. 2009   #6
-
0
-

Sergei
STL může sice stát za starou bačkoru, ale proč ji nevyužít a nevyužít správně, když tu je:

#include <iostream>

#include <string>
#include <set>

const char *allowed_exts[] = {"jpg", "gif", "png", NULL}; // na posledním místě musí být NULL

int main(int argc, char **argv)
{
// zkontrolujem argumenty
if (argc < 2) {
std::cerr << "usage: " << argv[0] << " <file>" << std::endl;
return -1;
}

// vytvoříme set s příponami
std::set<std::string> exts;
for (int i = 0; allowed_exts[i] != NULL; ++i)
exts.insert(std::string(allowed_exts[i]));

// zjistíme příponu
std::string filename = argv[1];

size_t period = filename.rfind('.'); // cokoli za poslední tečkou je přípona
if (period == std::string::npos) {
std::cerr << "žádná tečka :-*" << std::endl;
return -1;
}

std::string ext(filename, period + 1);

// ověříme, jestli je v množině povolených
if (exts.count(ext) > 0) {
std::cout << "jo, tak tohle vypadá jako obrázek" << std::endl;
return 0;
} else {
std::cout << "ne, tohle asi obrázek nebude" << std::endl;
return 1;
}
}


Důležité části jsou zvýrazněné. Podívej se na std::string[1] a std::set[2]. Dále by to chtělo přidat převod přípony na malá písmena – to snad zvládneš.

Ale jinak kontrolovat, jestli je něco obrázek, nedoporučuji přes příponu, protože se dá jednoduše podstrčit. Nejlépe kontrolovat podle obsahu souboru. Za inspiraci může sloužit UNIXová utilitka file[3].


[1] http://cplusplus.com/reference/string/string/
[2] http://cplusplus.com/reference/stl/set/
[3] http://en.wikipedia.org/wiki/File_%28Unix%29

Nahlásit jako SPAM
IP: 88.101.128.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 58 hostů

Podobná vlákna

Zjednodušení kodu — založil marpit

Zjednoduseni kodu — založil Mutagen

Zjednodušení kodu — založil Empty

Zjednodušení kódu — založil sXe

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý