• Здраво и добредојдовте на форумот на IT.mk.

    Доколку сеуште не сте дел од најголемата заедница на ИТ професионалци и ентузијасти во Македонија, можете бесплатно да се - процесот нема да ви одземе повеќе од 2-3 минути, а за полесна регистрација овозможивме и регистрирање со Facebook и Steam.

[C++] Помош за ENUMERATION

  • Ја почнал/а темата
  • #1

HHH

Intern
20 февруари 2008
35
0
Nesto ne mi izlaga kodot, pisuva deka kaj for ciklusot "no `operator ++(int)' declared for postfix `++`, trying prefix operator instead.
Koj moze neka pomogne,
inace kompajliran so DEV-C++


#include <iostream>
using namespace std;
#include <stdio.h>
enum months { JAN = 1, FEB, MART, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC };
int main(){
enum months month;
const char *imeNaMesec[]={"", "januari", "februari", "mart", "april", "maj", "juni",
"juli", "avgust", "septemvri", "oktomvri", "noevmri", "dekemvri"};
for (month = JAN; month <= DEC; month++ )
printf("%2d%11s\n",month,imeNaMesec[month]);
cin.get();
}
 
  • Ја почнал/а темата
  • #3

HHH

Intern
20 февруари 2008
35
0
Nema sansi da e taka. Mora da stoi enum months month, bidejki se raboti za enumeration (nabrojuvanje). Greskata mi e vo for ciklusot, ova ++ mi pravi izgleda problemi.
J dont see the way out.
 
  • Ја почнал/а темата
  • #4

HHH

Intern
20 февруари 2008
35
0
Ako vo for ciklusot stavime obicna standardna promenliva int i;
togas ke go dobijam rezultatot sto go baram, no fintata e vo for ciklusot
da se iskoristi nekako for (month = JAN; month <= DEC; month++ )
Vaka bi izgledalo so i:
#include <iostream>
using namespace std;
#include <stdio.h>
enum months { JAN = 1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC };
int main(){
enum months month;
const char *imeNaMesec[]={"", "januari", "februari", "mart", "april", "maj", "juni",
"juli", "avgust", "septemvri", "oktomvri", "noevmri", "dekemvri"};
for (int i = 1; i <= 12; i++)
printf("%2d%11s\n",i,imeNaMesec);
cin.get();
}
 

MetalGear

On your way to fame
14 април 2007
2,997
510
www.ibiz.mk
a zosto ja kompliciras rabotata
ova moze da se resi so mnogu pomalko kod i so podobra optimizacija
neznam zosto ja kompliciras rabotata ili pak taka ti treba togas ok
 

Spion

Intern
25 септември 2007
48
4
#include <iostream>
using namespace std;
#include <stdio.h>
enum months {
JAN = 1, FEB, MART, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC
};

enum months operator ++ (enum months &x, int)
{
enum months r = x;
x = (enum months)((int)x + 1);
return r;
}

int main(){
enum months month;
const char *imeNaMesec[]={"", "januari", "februari", "mart",
"april", "maj", "juni",
"juli", "avgust", "septemvri",
"oktomvri", "noevmri", "dekemvri"};
for (month = JAN; month <= DEC; month++ )
printf("%2d%11s\n",month,imeNaMesec[month]);
cin.get();
}
 
  • Ја почнал/а темата
  • #8

HHH

Intern
20 февруари 2008
35
0
Odlicno, bas toa e pravoto resenie, t.e da se upotrebi enum month vo vid na brojac.
Znaci treba da se primeni operator overloading kaj enum vo vid na funkcija.
Fala so it-sorabotkata.
 

Spion

Intern
25 септември 2007
48
4
minimoog, за разлика од C, C++ има многу по стриктен type safety. Секој дефиниран тип компајлерот го третира како посебен.
 

minimoog

Intern
14 јули 2007
317
16
Не мислев на тоа, добра знам што е type safety.

Enum C++ го третира имплицитно како int и како посебен тип.

На пример земи го твоето „правилно“ решение (има неколку грешки).

Код:
printf("%2d%11sn",month,imeNaMesec[month]);
Што е imeNaMesec[month]? month што е? Enum на months. Тогаш зошто month го третира како int? Ме разбираш што сакам да кажам?
 
  • Ја почнал/а темата
  • #12

HHH

Intern
20 февруари 2008
35
0
Month go tretira kako int zasto po definicija
enum (enumeration) e nabrojuvanje na proizvolni identifikatori na koi default vrednostite im se od tipot int.
Po pravilo treba da se pocnuvaat od 0 no bidejki prviot clen na enumeracijata months mi e 1, toa znaci deka vrednostite se dvizat od 1-12 i vo ovoj slucaj se koristi kako brojac.
Kako sto gledas malku pogore istiot kod go ima so int i vo for ciklusot i raboti sovrseno.
Ime na mesec e pointer na niza od tipot konstanten karakter.
If you dont have a deeper knowledge of pointers you cant comprehed this exercise.
 

Spion

Intern
25 септември 2007
48
4
Не мислев на тоа, добра знам што е type safety.

Enum C++ го третира имплицитно како int и како посебен тип.

На пример земи го твоето „правилно“ решение (има неколку грешки).

Што е imeNaMesec[month]? month што е? Enum на months. Тогаш зошто month го третира како int? Ме разбираш што сакам да кажам?
Затоа што enum може имплицитно да се конвертира во int, НО int неможе имплицитно да се конвертира во enum (затоа не работи инкремент операторот ниту пак работи nekojenum = nekojenum + 1; //nekojenum + 1 e int, int неможе да се конвертира во тип enum, грешка)

Зошто е тоа вака направено?

Затоа што не е type-safe да конвертираш int со вредност 15 во enum month - не постои 15-ти елемент во енумерацијата (има само 12 месеци). ОК?
 

minimoog

Intern
14 јули 2007
317
16
Сакаш да кажеш дека enum не е typesafe, штом може имплицитно да се конвертира во int. Така?
 

Spion

Intern
25 септември 2007
48
4
Не. Сакам да кажам дека

конвертирање на enum во int е сосема безбедно (type-safe) бидејќи int ги опфаќа сите вредности на enum-oт (затоа има имплицитно конвертирање), меѓутоа

конвертирање на int во enum не е безбедно (не е type-safe) бидејќи int може да има вредност која е недефинирана во enum-от (во случајот со enum months пример 13, month со вредност 13 не е дефиниран)

се надевам е јасно сега
 

Spion

Intern
25 септември 2007
48
4
A ако не е јасно, ќе направам мала демонстрација преку operator overloading функцијата со некои измени:

enum months operator ++ (enum months &x, int)
{
enum months r = x;

//ok, dve eksplicitni konverzii
x = (enum months)((int)x + 1);

//ok, eksplicitna konverzija od int vo enum
//implicitna konverzija od enum vo int kaj x+1
x = (enum months)(x + 1);

//error, obid za implicitna konverzija
//od int vo enum, nedozvolivo bidejki
//x+1 e veke implicitno konvertiran vo int
x = x + 1;

return r;
}
 

minimoog

Intern
14 јули 2007
317
16
Јасно е. Ама мора од двете страни на конверзијата да е typesafe за да е вистински typesafe.

Муабетот ми е, многу лоша пракса е enum да се користи за индексирање, прашање на момент е кога ќе се упуцаш самиот себе.

Од пракса, најчесто enum се користи при повикување функција (при пренесување параметри), ама никојпат не сум видел да се користи како индексер, ниту е моја препорака да се користи како индексер.

Overload operator на enum ретко кој знае, целиот enum во C++ е hack. Подобро е да се направиш класа која би била слична на enum.
 
  • Ја почнал/а темата
  • #18

HHH

Intern
20 февруари 2008
35
0
Stom sme kaj prefix/postfix overloaded functions eve eden dobar primer, samo ne znam kako da go ispecatam rezultatot, sigurno ke mi treba nova public funkcija:

#include <iostream>
using namespace std;

class number{
int n;
public:
number(int x):n(x){};
number operator++();
};
number number::eek:perator++(){
n++; return *this;}
main(){
number one(10); //one.n = 10
++one; //one.n = 11
cin.get();
}
 

Spion

Intern
25 септември 2007
48
4
ostream, операторот <<.

Код:
#include <iostream>

using namespace std;

class number{
                int n;
        public:
                number(int x):n(x){};
                number operator++();
                const int get() const { return n; }
};

number number::operator++()
{
        n++; return *this;
}

ostream& operator << (ostream& s, const number& x)
{
        s << x.get();
        return s;
}

main(){
        number one(10); //one.n = 10
        ++one; //one.n = 11
        cout << one << endl;
        cin.get();
}
 

Нови мислења

Последни Теми

Статистика

Теми
43,570
Мислења
823,613
Членови
28,075
Најнов член
GGPPkorcula
На врв Дно