Wochentage / Array / Ausgabe
-
Hallo zusammen,
ich wollte fragen, ob es in c++ möglich ist, wenn ich einen array habe, also
char weekdays[7]=[Sunday, Monday, Thusday, Wednesday, Thursday, Friday, Saturday]
und mir sage, dass sunday=0 ist monday=1 (wie initialisiere ich das???)
dass wenn ich nun nach einer division eine zahl bekomme, z.bsp. 3, dass ich dann irgendwie auf den array zugreifen kann (pointer?) und mir für die drei wednesday ausgegeben wird etc?
Danke für eure hilfe
-
Wie wäre es mit enum?
-
Hallo D,
sorry enmu (steht wohl für enumerate), diese kenn ich leider (noch) nicht?
Was müsste ich genau tun?
-
-
enum ist ein Aufzählungstyp, den man als Alternative für tausende const oder
define definitionen verwenden kann.z.B. Monate:
enum monat { JAN, FEB, MAR, APR, JUN, JUL, AUG, SEP, OKT, NOV, DEC };
Die Namen zwischen den Klammern werden als Tag bezeichnet. Der erste Tag
bekommt dabei standardmäßig den Wert 0. Die weiteren Werte werden jeweils um
eins inkrementiert. Das kann man aber auch ändern:enum Monat { JAN=1, FEB, MAR, APR, MAI=12 // ... }
(blödes Beispiel, ich weiß
)
Januar bekommt dabei den Wert 1, Februar 2, März 3, April 4 und Mai 12.
Du kannst sie ganz einfach jetzt im Code verwenden:
int blablabla = JAN; // blablabla bekommt den Wert 1
-
habe jetzt mal im code folgende anweisung vorgenommen
enum arrweekdays={Sunday, Monday, Thusday, Wednesday, Thursday, Friday, Saturday};
beim compilieren kommt aber immer:
te.C:78: error: use of enum `arrweekdays' without previous declaration
wieso? habe auch schon arrweekdays zuerst mal als array angelegt, aber dann kommt der fehler immer noch?
Sieht jemand das problem?
Frauke
-
Das Gleichheitszeichen ist überflüssig.
-
Wie wärs mit
enum arrweekdays {Sunday, Monday, Thusday, Wednesday, Thursday, Friday, Saturday};
ohne
=
. Dann gehts!
Kann man sonst noch helfen? Scheinst ja noch nicht so ganz sattelfest zu sein,
lg herbert
-
Merci, klar, jetzt seh ich es auch,
zu Herbert:
Ja, bin noch nicht so gut... aber ich lerne es schon.
Ja, hilfe könnte ich noch in zwei sachen gebrauchen:
1. Wenn ich nun dieses enum ding habe, also
enum arrweekdays {Sunday, Monday, Thusday, Wednesday, Thursday, Friday, Saturday};
und eine zahl zwischen 0-6 in einem int, zbsp. c=5.
Wie bringe ich nun das programm dazu, das es Friday ausspuckt.
Habe es mal mit einer for-Schlaufe und if versucht, aber der vergleich klappt nicht...
2. Wenn ich nun habe
int month std::cout << "The number of your month? "; std::cin >> month; } while (month <=0 || month >=13);
dann wird ja dem month eine zahl zwischen 1 und 12 zugewiesen, wie bringe ich nun mein programm dazu, dass es z.bsp. dem januar (month ist also eins) eine 0 zuzuweisen (also eigtl 0=1), dem februar (month ist in demfall 2) eine 3 etc.
zudem möchte ich ja später auf diese zahlen zurückgreifen, also wenn vom input kam 4 (April) soll dem April eine 6 zugewiesen werden, welche ich dann benutzen kann.
Geht das auch mit enum?
Lg Frauke
-
Ich glaube du suchst doch eher ein Array.
char* weekdays[7] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; for(int i = 0; i < 7; ++i) { std::cout << weekdays[i] << std::endl; }
-
Ja, aber mit array habe ichs auch schon versucht, aber das funktioniert eben auch nicht... hier gibt es gar keinen output, im fall unten möchte ich ja als output "Tuesday"...
#include <iostream> int main () { char* weekdays[7] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; int c = 2; for(int i = 0; i < 7; ++i) { if (c == *weekdays[i]) std::cout << weekdays[i] << " "; } return 0; }
Ist das denn wirklich so schwer?
-
#include <iostream> int main () { const char* weekdays[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; unsigned int sel(0); std::cin >> sel; if (sel < 12) std::cout << weekdays[sel - 1] << std::endl; }
Arrays ist der richtige Weg. Durch die Indexierung hast du eh eine feste ID einem Wert zugewiesen.
-
Hey D(Evil) Danke vielmals, das geht ja so wirklich...
jetzt fehlt mir nur noch das mit den Monaten und der zahlenzuweisung, ob ich das noch hinbringe?
Frauke
-
Wie? Also von Monatsnahmen zu Zahl?
unsigned char get_month(const char* str_month) { const char* month[] = { "January", "February", ..., "December" }; for (unsigned char i(0); i < 12; ++i) if (std::strcmp(month[i], str_month) == 0) return ++i; return 13; }
... wenn die Funktion dann 13 zurück gibt, war es wohl kein gültiger Monat
Ansonsten gibt die bei "December" z.B. 12 zurück.
std::strcmp
Header: <cstring>
Funktionskopf:int strcmp( const char *str1, const char *str2 );
Aufgabe: Vergleich zweier char-Arrays auf Äquivalenz.
unsigned char
POD 8 Bit
Wertebereich:assert(std::numeric_limits<unsigned char>::max() == 255);
=> 0 ... 255
-
Nein ich meinte nicht das, sondern, dass
Dem Januar 0 zugewiesen wird
Feb 3
März 3
April 6
Mai 1
Juni 4
Juli 6
August 2
Sept 6
Okt 0
Nov 3
Dez 5, wobei der jeweilige monat von std::cin >> month; kommt als month, also eine zahl ist, wobei month=1 (= Januar) ... month = 12 (Dezember)habs jetzt wie folgt gemacht, da ich month_value später wieder brauche...
// Monatszuweisung if (month ==1) month_value =0; else if (month ==2 || month==3 || month==11) month_value = 3; else if (month ==4 || month==7) month_value =6; else if (month ==5 ) month_value =1; else if (month ==6) month_value =4; else if (month ==8) month_value =2; else if (month==8) month_value = 2; else if (month==9 || month==12) month_value = 5; else if (month==10) month_value = 0;
umständlich, das prog funktioniert...
-
const char* arr_month[] = { "January", "February", ..., "December" }; unsigned char month_value[12] = {0, 3, 3 ,6, 1, 4, 6, 2, 6, 0, 3, 5 }; std::cout << "Wert " << 1 + 1 /* 0 indexiert */ << " ist der Monat " << arr_month[month_value[1]] << "zugewiesen!" << std::endl;
oder was willst du haben?
-
Also, soweit ich das sehe, hab ich ihn fertig...
muss als nächstes dann die bestimmten funktionen auslagern damit es nicht mehr so "lastig ist".
Ich will ja für ein gegebenes datum den wochentag berechnen, mit dem untenstehenden code geht es. Jetzt siehst du wohl auch (D)Evil für was ich das month und month_value zeugs brauche. Da ich mit arrays und pointer noch nicht so sattelfest bin, weiss ich eben nicht, wie ich dann genau denn monat weiter unten wieder einbau, der als input kam...
#include <iostream> int main() { int month; int day; int year; std::cout << "The number of your day in month? "; std::cin >> day; do{ std::cout << "The number of your month? "; std::cin >> month; } while (month <=0 || month >=13); do{ std::cout << "The number of the year (>= 1900)? "; std::cin >> year; } while (year <1900); // Berechnung der legalen Tage if (month == 2){ bool is_leap_year = ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0); if (is_leap_year == true){ if (day <1 || day >= 30) std::cout << "Your date is not correct."; } else { if (day <1 || day >= 29) std::cout << "Your date is not correct"; } } // Monate mit 31 Tagen if (month != 4 && month != 6 && month != 9 && month !=11 && month !=2){ if (day <1 || day >= 32) std::cout << "Your date is not correct"; } // Monate mit 30 Tagen if (month == 4 || month == 6 || month == 9 || month ==11){ if (day <1 || day >= 31) std::cout << "Your date is not correct"; } // Computation int HH = year/100; int YY = year%100; int DD = day; int month_value; int corrigendum; int leap_year_corr=0; // month assignement if (month ==1) month_value =0; else if (month ==2 || month==3 || month==11) month_value = 3; else if (month ==4 || month==7) month_value =6; else if (month ==5 ) month_value =1; else if (month ==6) month_value =4; else if (month ==8) month_value =2; else if (month==8) month_value = 2; else if (month==9 || month==12) month_value = 5; else if (month==10) month_value = 0; // correction if (HH%4==1) corrigendum=4; else if (HH%4==2) corrigendum=2; else if (HH%4==3) corrigendum=0; else if (HH%4==0) corrigendum=6; // Spec. correction if (month == 2 && day == 29){ bool is_leap_year = ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0); if (is_leap_year == true){ (leap_year_corr)++; } } int year_value = (YY+(YY/4))%7; int week_day= year_value+month_value + DD + corrigendum - leap_year_corr; week_day=week_day%7; // Output const char* entire_days[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; if (week_day < 12) std::cout << "Your given date has been evaluated as a " << entire_days[week_day] << ". "; return 0; }