Silentbob
Anmeldungsdatum: 7. August 2007
Beiträge: 287
|
Hallo Leute, ich habe ein kleines Zeiterfassungsprogramm in c geschrieben, das ich gerne mit euch teilen möchte. Es nennt sich schlicht und einfach "Stundenrechner" und läuft brav im Terminal. Dort könnt ihr dann eine Aufgabe, beispielsweise für ein Projekt oder Heimarbeit, eingeben und die Startzeit, Stopzeit und verstrichene Zeit werden euch dann angezeigt und in einer Textdatei "aufgaben.txt" im Programmordner gespeichert. Nebenbei könnt ihr die gemessene Zeit auch pausieren (war das ne Arbeit). Ursprünglich habe ich das Programm für meine Freundin geschrieben, die von zu Hause aus arbeitet und immer vergessen hat ihre Stunden für die Abrechnung zu notieren. Nun habe ich es ein bisschen allgemeiner gehalten und möchte es als kleines Zeichen meiner Dankbarkeit für alles, mit der Ubuntu-Community teilen. Es ist nichts weltbewegendes, hat mich als angehender c-Programmierer aber jede Menge Zeit gekostet, bis alles bugfrei funktionierte. Man kann dies und das sicher noch verbessern und für Lob und konstruktive Kritik (Feedback ist bekanntlich das Brot des Künstlers) bin ich gerne zu haben. Falls es Verbesserungsvorschläge gibt würde es mich auch freuen, jedoch muss ich dann mal schauen, ob meine Zeit und Kenntnisse für eine Umsetzung ausreichen. Kurz noch zur Zeitmessung, es werden lediglich Start- und Stopeinträge gespeichert. Es läuft also keine weitere Uhr im Hintergrund, von daher macht sich das geöffnete Programm kaum in den Ressourcen bemerkbar. Nun folgt der Quelltext, den ihr nach Bedarf verändern oder verwenden könnt. Im Anhang befindet sich dann noch das kompilierte Programm (32bit) und der Vollständigkeit halber das gleiche nochmal für windows als .exe.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220 | /*
* Stundenrechner
* Version: 1.3
*
* by Silentbob
* www.sourcetech.de
*
* main.c
* Copyright (C) SourceTech 2009
*
* main.c is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* main.c is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
FILE *textfile;
struct tm *zeit1, *zeit2;
time_t sekunde, start, stop;
double diff=0;
double add_time=0;
double sek=0;
double min=0;
double std=0;
double std_dez=0;
char auswahl=0;
char aufgabe [200];
char string[80];
char *ptr;
void final () {
textfile = fopen("aufgaben.txt", "a+");
time (&sekunde);
stop=time(NULL);
zeit2 = localtime(&sekunde);
strftime(string, 80,"%A, %d/%m/%Y, %H:%M:%S",zeit2);
fprintf(textfile, "Stop Mission: \"%s\" @ %s\n",aufgabe, string);
diff=difftime(stop=time(NULL),start);
diff=diff+add_time;
std_dez=diff;
while (diff>=60) {
min++;
diff=diff-60;
}
while (min>=60) {
std++;
min=min-60;
}
std_dez=(std*3600)+(min*60);
std_dez=(std_dez/60)/60;
fprintf(textfile,"Attended Time: %.0fh %.0fm %.0fs (%.2fh)\n\n",std, min, diff, std_dez);
fclose(textfile);
printf("\nStopzeit gespeichert\n\n");
printf ("Attended Time: %.0fh %.0fm %.0fs (%.2fh)\n\n",std, min, diff, std_dez);
}
void elapsed_time () {
time (&sekunde);
stop=time(NULL);
diff=difftime(stop,start);
diff=diff+add_time;
sek=diff;
std_dez=diff;
while (sek>=60) {
min++;
sek=sek-60;
}
while (min>=60) {
std++;
min=min-60;
}
std_dez=(std*3600)+(min*60);
std_dez=(std_dez/60)/60;
}
int main() {
printf("\n-Stundenrechner v1.3-");
textfile = fopen("aufgaben.txt", "a+");
printf ("\n\nWelche Aufgabe liegt an?\n");
printf ("\nAufgabe: ");
fgets (aufgabe, 120, stdin);
ptr = strrchr (aufgabe, '\n');
*ptr = '\0';
time (&sekunde);
zeit1 = localtime(&sekunde);
start=time(NULL);
strftime(string, 80,"%A, %d/%m/%Y, %H:%M:%S",zeit1);
fprintf(textfile, "Start Mission: \"%s\" @ %s\n",aufgabe, string);
fclose(textfile);
printf("\nZeitmessung gestartet");
do {
printf ("\n\n(1) Zwischenzeit anzeigen\n");
printf ("(2) Zeitmessung pausieren\n");
printf ("(3) Zeitmessung beenden");
printf ("\n\nAuswahl: ");
scanf ("%c",&auswahl);
getchar();
switch (auswahl) {
case '1':
elapsed_time ();
printf ("\nElapsed Time: %.0fh %.0fm %.0fs (%.2fh)",std, min, sek, std_dez);
sek=0;
min=0;
std=0;
break;
case '2' :
elapsed_time ();
printf ("\nAttended Time: %.0fh %.0fm %.0fs (%.2fh)\n\n",std, min, sek, std_dez);
do {
printf ("(1) Zeitmessung fortsetzen\n");
printf ("(0) Speichern & beenden");
printf ("\n\nAuswahl: ");
scanf ("%c",&auswahl);
getchar();
switch (auswahl) {
case '1':
start=time(NULL);
add_time=diff;
sek=0;
min=0;
std=0;
printf ("\nZeitmessung wird fortgesetzt");
break;
case '0':
start=time(NULL);
add_time=diff;
sek=0;
min=0;
std=0;
final ();
return EXIT_SUCCESS;
break;
default: printf ("\nFalsche Eingabe\n\n");
}
} while ( (auswahl!='1') && (auswahl!='0') );
break;
case '3' :
final ();
break;
default: printf ("\nFalsche Eingabe");
}
} while ( (auswahl!='3') && (auswahl!='2') );
do {
printf ("(4) Neue Aufgabe\n");
printf ("(0) Programm beenden");
printf ("\n\nAuswahl: ");
scanf ("%c",&auswahl);
getchar();
switch (auswahl) {
case '4':
printf ("\nPress ENTER to restart\n");
do {fgets (aufgabe, 120, stdin);} while ( getchar() != '\n' );
//getchar();
main ();
break;
case '0':
return EXIT_SUCCESS;
break;
default: printf ("\nFalsche Eingabe\n\n");
}
} while ( (auswahl!='0') && (auswahl!='4') );
}
|
Viel Spaß damit, ich würde mich schon freuen, wenn es nur ein einziger von euch gebrauchen könnte. ☺ Grüße,
Silentbob
Moderiert von user unknown: Ich habe mir erlaubt den Quellcode nicht einfach als Code, sondern als C-Code zu markieren, wodurch Syntaxhighlightening aktiviert wird.
- Stundenrechner_Linux (13.8 KiB)
- Download Stundenrechner_Linux
- Stundenrechner_Windows (199.2 KiB)
- Download Stundenrechner_Windows
|
stfischr
Anmeldungsdatum: 1. März 2007
Beiträge: 19197
|
Hi. Nice, was mich wundert, die Ausgabe ist mal deutsch, mal englisch "Attended Time" hat das nen tieferen sinn?
|
Silentbob
(Themenstarter)
Anmeldungsdatum: 7. August 2007
Beiträge: 287
|
Ups erwischt. Ja indirekt, weil Windows einen anderen Zeichensatz nutzt und dort ohne weiteres keine Umlaute funktionieren. Zudem hatte ich noch gedacht, bereits schonmal ein wenig Englisch herein zu bringen, weil ich das Programm irgendwann mal (in ferner Zukunft) komplett in Englisch auf meine Homepage stellen will. edit: Stimmt natürlich, das Attended muss natürlich Elapsed heißen. Ich aktuallisiere das gleich mal.
|
Saddy
Anmeldungsdatum: 2. Mai 2006
Beiträge: 1148
|
Erfüllt seinen Zweck. Vllt. solltest du noch falsche Eingaben abfangen oder die Befehle gleich einzelnen Tasten zuordnen. (zB Pause == "p" usw.)
|
Silentbob
(Themenstarter)
Anmeldungsdatum: 7. August 2007
Beiträge: 287
|
Okayyy....es spricht jetzt komplett englisch, sowohl im Quelltext, als auch in den Ausgaben. Und es nennt sich nun Timer v.1.4 und die Textdatei heißt jetzt nicht mehr "aufgaben.txt", sondern "projects.txt". Verbesserungsverschläge zur Übersetzung oder zu der groß/kleinschreibung nehme ich gerne an. Wegen der Steuerung muss ich mir morgen mal Gedanken zu machen. Eventuell gibt es dann noch ein weiteres update. Besten Dank erstmal für das Feedback. Hier der Quelltext und im Anhang die kompilierten Dateien:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219 | /*
* Timer
* Version: 1.4
*
* by Silentbob
* www.sourcetech.de
*
* main.c
* Copyright (C) SourceTech 2009
*
* main.c is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* main.c is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
FILE *textfile;
struct tm *zeit1, *zeit2;
time_t second, start, stop;
double diff=0;
double add_time=0;
double sec=0;
double min=0;
double hour=0;
double hour_dec=0;
char choice=0;
char project [200];
char string[80];
char *ptr;
void final () {
textfile = fopen("projects.txt", "a+");
time (&second);
stop=time(NULL);
zeit2 = localtime(&second);
strftime(string, 80,"%A, %d/%m/%Y, %H:%M:%S",zeit2);
fprintf(textfile, "Stop Project: \"%s\" @ %s\n",project, string);
diff=difftime(stop=time(NULL),start);
diff=diff+add_time;
hour_dec=diff;
while (diff>=60) {
min++;
diff=diff-60;
}
while (min>=60) {
hour++;
min=min-60;
}
hour_dec=(hour*3600)+(min*60);
hour_dec=(hour_dec/60)/60;
fprintf(textfile,"Elapsed Time: %.0fh %.0fm %.0fs (%.2fh)\n\n",hour, min, diff, hour_dec);
fclose(textfile);
printf("\nSaved\n\n");
printf ("Elapsed time: %.0fh %.0fm %.0fs (%.2fh)\n\n",hour, min, diff, hour_dec);
}
void elapsed_time () {
time (&second);
stop=time(NULL);
diff=difftime(stop,start);
diff=diff+add_time;
sec=diff;
hour_dec=diff;
while (sec>=60) {
min++;
sec=sec-60;
}
while (min>=60) {
hour++;
min=min-60;
}
hour_dec=(hour*3600)+(min*60);
hour_dec=(hour_dec/60)/60;
}
int main() {
printf("\n-Timer v1.4-");
textfile = fopen("projects.txt", "a+");
printf ("\n\nChoose your project: ");
fgets (project, 120, stdin);
ptr = strrchr (project, '\n');
*ptr = '\0';
time (&second);
zeit1 = localtime(&second);
start=time(NULL);
strftime(string, 80,"%A, %d/%m/%Y, %H:%M:%S",zeit1);
fprintf(textfile, "Start Project: \"%s\" @ %s\n",project, string);
fclose(textfile);
printf("\nTiming started");
do {
printf ("\n\n(1) Show meantime\n");
printf ("(2) Pause timing\n");
printf ("(3) Stop timing");
printf ("\n\nYour choice: ");
scanf ("%c",&choice);
getchar();
switch (choice) {
case '1':
elapsed_time ();
printf ("\nElapsed time: %.0fh %.0fm %.0fs (%.2fh)",hour, min, sec, hour_dec);
sec=0;
min=0;
hour=0;
break;
case '2' :
elapsed_time ();
printf ("\nElapsed time: %.0fh %.0fm %.0fs (%.2fh)\n\n",hour, min, sec, hour_dec);
do {
printf ("(1) Continue timing\n");
printf ("(0) Save & quit");
printf ("\n\nYour choice: ");
scanf ("%c",&choice);
getchar();
switch (choice) {
case '1':
start=time(NULL);
add_time=diff;
sec=0;
min=0;
hour=0;
printf ("\nTiming continued");
break;
case '0':
start=time(NULL);
add_time=diff;
sec=0;
min=0;
hour=0;
final ();
return EXIT_SUCCESS;
break;
default: printf ("\nWrong entry\n\n");
}
} while ( (choice!='1') && (choice!='0') );
break;
case '3' :
final ();
break;
default: printf ("\nWrong entry");
}
} while ( (choice!='3') && (choice!='2') );
do {
printf ("(4) New project\n");
printf ("(0) Exit");
printf ("\n\nYour choice: ");
scanf ("%c",&choice);
getchar();
switch (choice) {
case '4':
printf ("\nPress ENTER to restart\n");
do {fgets (project, 120, stdin);} while ( getchar() != '\n' );
//getchar();
main ();
break;
case '0':
return EXIT_SUCCESS;
break;
default: printf ("\nWrong entry\n\n");
}
} while ( (choice!='0') && (choice!='4') );
}
|
Viele Grüße,
Silentbob
- timer_v1.4_linux (13.8 KiB)
- Download timer_v1.4_linux
- timer_v1.4_windows (199.2 KiB)
- Download timer_v1.4_windows
|
dilo
Anmeldungsdatum: 15. März 2008
Beiträge: 852
|
Hi Bob, findest du nicht auch, dass dieser Thread im Forum "Projekte" besser aufgehoben wäre? gruß, dilo
|
Silentbob
(Themenstarter)
Anmeldungsdatum: 7. August 2007
Beiträge: 287
|
Hallo dilo! Du hast Recht, der Thread wäre dort wirklich ganz gut aufgehoben. Vorher ist mir der Projekte-Bereich irgendwie immer entgangen (ich weiß auch nicht warum), obwohl dort auch sehr interessante Projekte aufzufinden sind. Also nehme ich das Angebot gerne an, alles ist bereits fertig gepackt für einen möglichen Umzug. ☺ Viele Grüße,
Silentbob
|
dilo
Anmeldungsdatum: 15. März 2008
Beiträge: 852
|
|
Silentbob
(Themenstarter)
Anmeldungsdatum: 7. August 2007
Beiträge: 287
|
|
Niveau
Anmeldungsdatum: 17. März 2009
Beiträge: 883
Wohnort: Braunschweig
|
welche codierung verwendet widows denn??? bestimmt nichts das mit UTF oder ISO beginnt?
|
Silentbob
(Themenstarter)
Anmeldungsdatum: 7. August 2007
Beiträge: 287
|
Ok, soweit ich weiß verwendet Windows den Ansi-Zeichensatz (weiß jetzt nicht, ob es in der Windowskonsole der selbe ist), der auch Umlaute enthält. Allerdings könnte ich die Umlaute nicht so einfach ins printf schreiben, weil die Umlaute, in der Windowskonsole, nicht korrekt dargestellt werden würden. Zudem möchte ich ganz gerne ein und den selben Quelltext für die Linux und die Windows-Version behalten. Rein theoretisch könnte man auch eine Präprozesseordirektive nutzen, um den Quelltext für die WIndows-Versionen per #define an den bei den Umlauten umzuschreiben. Das funktioniert in c aber leider auch nicht immer so ohne zu mucken. Mitunter deswegen ist der Quelltext nun auch komplett auf Englisch. Grüße,
Silentbob
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Was meinst Du mit "Was verwendet Windwos"? In einer Datei verwendet Windows das, was der Editor verwendet, den man konfigurieren kann oder nicht. Für Dateinamen ist es wohl festgelegt, und müßte nicht unerheblich vom Dateisystem abhängen. Dieses hängt partiell vom Windossystem ab, sprich: Für FAT und Windows95 u.ä. wirst Du Cp497 oder Cp4852 oder sowas verwenden, Xp und anderes Systeme mit NTFS kennen m.W. UTF-8. In den Dateien ist es ganz Dein Ding, was Du benutzt, aber andere Programme sind vielleicht festgelegt. UTF-8 ist wohl mittelfristig zukunftssicher. Dateinamen sollten überhaupt keine Sonderzeichen oder Umlaute enthalten außer '-_.', zumindest nicht, wenn Du mal in einem internationalen Forum um Hilfe bittest, und die Leute das runterladen, und dann das Zeichen nicht tippen können, weil ihre Tastatur das nicht hat.
|
Lunar
Anmeldungsdatum: 17. März 2006
Beiträge: 5792
|
@Silentbob: Es gibt keinen "ANSI"-Zeichensatz. Moderne Windows-Systeme (iirc ab Windows 2000) verwenden UTF-16 als Standardzeichensatz für die graphische Oberfläche und die Konsolenausgabe. NTFS und FAT (mit langen Namen) verwenden intern ebenfalls UTF-16. Ein wirklich plattformunabhängiges Programm verwendet intern keine Byte-Zeichenketten, sondern Unicode-Zeichenketten, die dann vor der Ausgabe entsprechend kodiert werden. Hilfsmittel dafür findet man in der GLib oder in ICU. Zumindest die GLib ist eigentlich immer sinnvoll, weil sie viele andere nützliche Funktionen bietet. @user unknown: Mit UTF-8 hat Windows selbst nichts zu tun. Für NTFS und meines Wissens auch für FAT ist UTF-16 als Zeichensatz spezifiziert. Im Gegensatz zu Unix-Systemen enthalten Dateinamen unter Windows wirklich Zeichen und nicht einfach nur Bytes. Daher gibt es zumindest unter Windows auch keine objektiven technischen Nachteile an Sonderzeichen in Dateinamen. Gleiches gilt auch für Linux, seit sich UTF-8 als Standardkodierung durchgesetzt hat.
|
stfischr
Anmeldungsdatum: 1. März 2007
Beiträge: 19197
|
Lunar schrieb: Daher gibt es zumindest unter Windows auch keine objektiven technischen Nachteile an Sonderzeichen in Dateinamen.
Ähm, da muss ich dir widersprechen, versuche mal unter Linux nen Dateinamen mit Fragezeichen oder so zu erstellen, ihn auf NTFS zu kopieren und dann in Windows irgendwas damit zu machen. Ist mir schon öfter passiert, da hilft nur Linux starten und Datei umbenennen.
|
Lunar
Anmeldungsdatum: 17. März 2006
Beiträge: 5792
|
@stfischr: Naja, mal langsam. Das sind ein Einschränkungen der Windows-API, genauer gesagt des Win32-Subsystems. Der Systemkern und das POSIX-Subsystem neuerer Windows-Varianten unterliegt den selben Regeln wie Linux. Man muss daher nicht Linux bemühen, um Dateien mit problematischen Sonderzeichen zu löschen. Zudem sind nicht nur Sonderzeichen in dieser Hinsicht problematisch, sondern auch bestimmte Dateinamen wie con oder nul , die keinerlei Sonderzeichen enthalten, aber Gerätenamen darstellen. Außerdem zeigt der Windows Explorer eine ausführliche Fehlermeldung, wenn man eine derartige Datei anlegen möchte, und in der Welt von Microsoft legt man außerhalb von Microsoft-Programmen keine Dateien an 😉 Aber ja, Du hast recht, im Bezug auf Windows sollte man auf bestimmte Sonderzeichen verzichten, an die damit verbundenen Probleme habe ich einfach nicht gedacht. Allerdings betrifft das ja nur eine Handvoll Zeichen, gegen einen normalen Umlaut ist imho nichts einzuwenden.
|