You are not logged in.

  • Login

1

Saturday, February 23rd 2008, 4:45pm

Ermittlung ganzzahliger Vektor-Beträge

Hiho @all,

Im Rahmen einer 5.Komponente (eine Art optionale Abschlussarbeit fürs Abitur) hab ich beschlossen einen Treiber für meinen Scanner zu programmieren. Bisher hab ich keine Ahnung wie realistisch es ist dies in einem Jahr zu schaffen, aber selbst wenn ich scheitere hab ich auf dem Weg eine Menge gelernt.

Der erste Schritt ist also sich mit C zu beschäftigen. Damit habe ich angefangen (Buch: C von A bis Z - openbook).

So nun zu meinem kleinen Programm:

Mein Mathelehrer erwähnte letztens, dass ihm ein Schüler ein Programm zur Berechnung aller ganzzahligen Vektorenbeträge in einem bestimmten Rahmen geschrieben hat. Da sich die aufgabe interessant anhörte habe ich mich mal rangesetzt und folgendes Programm geschieben...

C/C++ Quellcode

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
/************************
Das Programm dient der Berechnung aller
ganzzahligen Vektor-Beträge (Längen) bis:
"durch den User bestimmt"
 
by Christian Klopp
************************/
 
#include <stdio.h>
#include <math.h>
#include <limits.h>
 
double berechne(int a, int b, int c);
void Berechnung_Ausgabe();
unsigned int Eingabe();
 
 
int main() {
	Berechnung_Ausgabe();
	return 0;
}
 
/***********************
berechnet den Betrag eines Vektors 
und gibt das Ergebnis zurück
***********************/
double berechne(int a, int b, int c){
	double ergebnis = a*a + b*b + c*c;
	ergebnis = sqrt(ergebnis);
	return ergebnis;
}
/***********************
Erhöht nacheinander die Variablen a, b und c
und überprüft das Ergebnis auf ganzzahligkeit, d.h.
der durch modf() ermittelte Nachkommateil wird auf Gleichheit mit
0 überprüft. Wenn das Ergebnis ganzzahlig ist werden die Komponenten des Vektors
zusammen mit dem Ergebnis ausgegeben.
***********************/
void Berechnung_Ausgabe(){
    double fuerModf; //wird nur gebraucht um modf() einen Pointer zu stellen
	unsigned int a, b, c, max; //Komponenten des Verktors
    max = Eingabe();
 
 
    for (a = 1; a <= max; a++){
    	if (modf(berechne(a, b, c),&fuerModf) == 0){
    		printf("%u - %u - %u = %i\n", a,b,c,(int)berechne(a, b, c));
   	 }
 
   	 for (b = 1; b <= max; b++){
   		 if (modf(berechne(a, b, c),&fuerModf) == 0){
   		 	printf("%u - %u - %u = %i\n", a,b,c,(int)berechne(a, b, c));
   		 }
 
   		 for (c = 1; c <= max; c++){
      			 if (modf(berechne(a, b, c),&fuerModf) == 0){
   			 		printf("%u - %u - %u = %i\n", a,b,c,(int)berechne(a, b, c));
   				}
   		 } //3. For-Schleife 
   	 } //2. For-Schleife    
	} //1. For-Schleife 
}
 
unsigned int Eingabe(){
	unsigned int a;
    printf("Bitte den maximalen Wert eingeben: ");
    scanf("%u", &a);
    return a;
 
 
}


Zur Erklärung ein Vektor besteht aus 3 Komponenten (Höhe, Breite, Tiefe) und der Betrag (also die Länge) wird mit der Formel

Länge = wurzel_aus(a²+b²+c²)

berechnet.

--------------------------------------------------------------
So nun kommt auch mal ne Frage^^

Ich will, dass die Eingabe überprüft wird ob sie den maximalen integer Wert übersteigt oder kleiner Null ist und sollte das der Fall sein so soll die Eingabe Wiederholt werden.

Folgendes hatte ich probiert und feststellen müssen, dass es nicht funzt (was ich nach 10minütigen starren auf den Bildschirm erst begriffen habe)

Source code

1
2
3
4
5
6
7
8
unsigned int Eingabe(){
	unsigned int a;
    	do{
    printf("Bitte den maximalen Wert eingeben: ");
    scanf("%u", &a);
    	}while (a > UINT_MAX || a =< 0);
    return a;
}


zusätzlich war dann auch die Header-Datei limits.h eingebunden (für UINT_MAX)

vlt. kann mir ja einer erklären wie man solch eine Fehlerprüfung durchführt...

ps: Hoffe das Proggy ist nicht zu poplig um hier gepostet zu werden

ps2: Wenn ich den Arrayteil in meinem Tutorial durchhab werden auch noch ähnliche Ergebnisse aussortiert. z.B.:

1 - 2 - 2 = 9
2 - 1 - 2 = 9
2 - 2 - 1 = 9

ps3: Feedback zu meinem Projekt;) ist immer willkommen

greetz gunn1

2

Saturday, February 23rd 2008, 11:54pm

Also bei deinem Code

C/C++ Quellcode

1
2
3
4
5
6
7
8
unsigned int Eingabe(){
	unsigned int a;
    	do{
    printf("Bitte den maximalen Wert eingeben: ");
    scanf("%u", &a);
    	}while (a > UINT_MAX || a =< 0);
    return a;
}


Sind mir mal 2 Sachen aufgefallen:

1) a ist ein unsigned int, daher macht es wenig Sinn ihn auf <=0 zu prüfen (er ist immer größer!)
2) a > UINT_MAX a kann logischerweise auch nicht größer Sein als der Maximale wert den ein unsigned int annehmen kann ;)

2 Lösungsvorschläge:

1) Du ließt einen Wert mit größerem Wertebereich ein (z.B. long long falls dein Compiler C99 kann), da long long signed ist sollten deine Überprüfungen wieder funktionieren und auch > UINT_MAX macht wieder Sinn. Du kannst dann trotzdem unsigned int zurückgeben
2) Ich arbeite primär mit C++ aber scanf() sollte das globale error-flag setzen wenn ein Fehler beim lesen aufgetreten ist, danach könntest du warscheinlich sehen und entsprechend reagieren

3

Sunday, February 24th 2008, 11:47am

Quoted

1) a ist ein unsigned int, daher macht es wenig Sinn ihn auf <=0 zu prüfen (er ist immer größer!)
2) a > UINT_MAX a kann logischerweise auch nicht größer Sein als der Maximale wert den ein unsigned int annehmen kann ;)
Das Waren die zwei Dinge die mir auch, nachdem ich 10min auf den Bildschirm geguckt habe aufgefallen sind^^

Zu Lösungsvorschlag 1:

Quoted


1) Du ließt einen Wert mit größerem Wertebereich ein (z.B. long long falls dein Compiler C99 kann), da long long signed ist sollten deine Überprüfungen wieder funktionieren und auch > UINT_MAX macht wieder Sinn. Du kannst dann trotzdem unsigned int zurückgeben
Hiermit behebe ich mein Problem ja nicht wirklich. Es wird lediglich dafür gesorgt, dass die Eingabe die zum Programmabbruch führt größer sein muss. Oder irre ich mich, dass das Programm auch abbstürtzt wenn das Longmaximum überschritten (bzw. Minimum unterschritten) wird ?

Zu Lösungsvorschlag 2:

Werd ich mir mal ansehen, kann nur @mom nicht viel damit anfangen

4

Monday, February 25th 2008, 3:45pm

Also irgendwie weiß ich nicht was du mit einem "globale error-flag" meinst. Wäre duft wann du mir mal nen Denkanstoß geben könntest.

So ich hab jetzt nochmal versucht etwas auszuprobieren: Da scanf() die Anzahl der eingelesenen Elemente zurückgibt und für den Fall einer falschen Eingabe "0", hab ich mir gedacht, dass ich mein Problem so lösen könnte. Allerdings musste ich schnell feststellen, dass scanf() nur wenn es einen Zahlenwert erwartet und man einen String eingibt "0" returned. Also ist mir damit auch nicht geholfen.

5

Wednesday, March 5th 2008, 11:29am

Du kommst wohl nicht drumrum, den eingabestring mittels strlen, strcspn und strcmp zu überprüfen.

Similar threads

Social bookmarks