| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen | 
	
	
		| Autor | Nachricht | 
	
		| qbay 
 
 
 Anmeldungsdatum: 08.06.2008
 Beiträge: 84
 
 
 | 
			
				|  Verfasst am: 02.01.2013, 21:20    Titel: Grundlagen-Eletronik -> Problem mit meinem kleinen Progra |   |  
				| 
 |  
				| Hi Leute und ein frohes neues Jahr.
 Hab schon lange nichts mehr gemacht im Bereich Programmierung,
 aber heute habe ich spontan angefangen und das ist dabei raus gekommen.
 
 
 
  	  | Code: |  	  | 
 Dim As Integer  I, R, U, P
 Dim As String auswahl
 
 Do
 Cls
 Print "U = Spannung"
 Print "I = Strom"
 Print "R = Widerstand"
 Print "P = Leistung"
 Print
 Print
 Input "Auswahl: "; auswahl
 Print
 
 Select Case UCase(auswahl)
 Case "U"
 Input "Spannung in Volt = ", U
 Case "I"
 Input "Strom in Ampere = ", I
 Case "R"
 Input "Widerstand in Ohm = ", R
 Case "P"
 Input "Leistung in Watt = ", P
 End Select
 
 U = R*I
 U = P/I
 I = U/R
 I = P/U
 R = U/I
 P = U*I
 P = (U^2)/R
 
 Print "U = "; U
 Print "I = "; I
 Print "R = "; R
 Print "P = "; P
 Sleep
 Loop
 
 
 | 
 
 
 Es funktioniert aber nicht so wie ich es will.
 Mein Programm soll, wenn ich ein Wert nach dem anderen eingegeben habe, im Hintergrund die restlichen Werte ausrechnen.
 
 Ich verstehen allerdings nicht warum es nicht funktioniert.
 
 Hoffe ihr könnt mir helfen...[/code]
 |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4710
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 02.01.2013, 21:23    Titel: |   |  
				| 
 |  
				| Hmm ... wenn ich U eingebe, ist ja I und R noch 0 ... und wenn ich dann U = R*I berechne, ist U auch wieder 0 ... _________________
 Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
 |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| qbay 
 
 
 Anmeldungsdatum: 08.06.2008
 Beiträge: 84
 
 
 | 
			
				|  Verfasst am: 02.01.2013, 21:32    Titel: |   |  
				| 
 |  
				| Na ich dachte es mir so das man einen Wert eingibt, das Programm sich diesen Wert merkt und dann und im nächsten Durchlauf, wenn ich einen anderen Wert eingebe, ein neuer Wert ausgerechnet wird. 
 Ich muss dazu sagen das ich in letzter Zeit sehr viel in SPS programmiert habe.
 Meinst du nemored das die Reihenfolge falsch ist??
 |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| MisterD 
 
  
 Anmeldungsdatum: 10.09.2004
 Beiträge: 3071
 Wohnort: bei Darmstadt
 
 | 
			
				|  Verfasst am: 02.01.2013, 22:27    Titel: |   |  
				| 
 |  
				| du darfst den eingegebenen wert halt nicht sofort wieder mit dem aus den restlichen (noch nicht eingegebenen) werten berechneten wert überschreiben, dann funktioniert das auch. _________________
 "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
 Edsger W. Dijkstra
 |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| qbay 
 
 
 Anmeldungsdatum: 08.06.2008
 Beiträge: 84
 
 
 | 
			
				|  Verfasst am: 03.01.2013, 20:51    Titel: |   |  
				| 
 |  
				| ok habs verändert funktioniert aber noch nicht
 ich denke es liegt an denn Variabelntypen
 habs aber auch schon versucht
 was denkt ihr?
 
 
  	  | Code: |  	  | 
 Dim As Single  I, R, U, P
 Dim As String auswahl
 
 Do
 Do
 auswahl = ""
 Cls
 Print "U = Spannung"
 Print "I = Strom"
 Print "R = Widerstand"
 Print "P = Leistung"
 Print
 Print "X = Eingabe beenden"
 Print
 Input "Geben Sie ihre Werte an: "; auswahl
 Print
 Select Case UCase(auswahl)
 Case "U"
 Input "Spannung in Volt = ", U
 Case "I"
 Input "Strom in Ampere = ", I
 Case "R"
 Input "Widerstand in Ohm = ", R
 Case "P"
 Input "Leistung in Watt = ", P
 Case Else
 Print "Ungueltige Angabe!"
 End Select
 Loop Until UCase(auswahl) = "X"
 
 Do
 Cls
 If U > 0 And I > 0 Then R = U/I And P = U*I
 If I > 0 And R > 0 Then U = R*I
 If R > 0 And U > 0 Then I = U/R And P = (U^2)/R
 If P > 0 And I > 0 Then U = P/I
 If U > 0 And P > 0 Then I = P/U And R = (U^2)/P
 Loop Until U > 0 And I > 0   And R > 0 And P > 0
 
 Print "U = "; U
 Print "I = "; I
 Print "R = "; R
 Print "P = "; P
 Sleep
 Loop
 
 
 | 
 |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| Jojo alter Rang
 
  
 Anmeldungsdatum: 12.02.2005
 Beiträge: 9736
 Wohnort: Neben der Festplatte
 
 | 
			
				|  Verfasst am: 03.01.2013, 21:01    Titel: |   |  
				| 
 |  
				| Verstehst du überhaupt, was du für einen Mist da programmiert hast? Du bist schon seit über vier Jahren im Forum dabei und hast schon über 80 Posts. Irgendwie kann ich nicht verstehen, wie du mit diesem "Vorwissen" ein so offensichtlich falsches Programm schreiben kannst. Was soll denn z.B. deiner Meinung nach der DO...LOOP-Block tun?
 _________________
 » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 
  |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| qbay 
 
 
 Anmeldungsdatum: 08.06.2008
 Beiträge: 84
 
 
 | 
			
				|  Verfasst am: 03.01.2013, 21:07    Titel: |   |  
				| 
 |  
				| wow jojo, es tut mir leid wenn ich dir kopfschmerzen bereite damit aber ich glaube es zwingt dich niemand mir zu antworten.
 oder überhaupt mein thema zu lesen
   
 ja ich bin seit 4 jahren hier aber habe mich, leider, niemals ernsthaft mit dem programmieren beschäftigt und meistens lagen monate zwischen meinen projekten. Deswegen bin ich immernoch ein Amateur.
 
 Aber trotzdem vielen vielen dank jojo
  |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| Jojo alter Rang
 
  
 Anmeldungsdatum: 12.02.2005
 Beiträge: 9736
 Wohnort: Neben der Festplatte
 
 | 
			
				|  Verfasst am: 03.01.2013, 21:14    Titel: |   |  
				| 
 |  
				| Lernen wirst du trotzdem hauptsächlich aus eigenen Fehlern. Also versuch mal deinen eigenen Code zu verstehen, vor allem die DO...LOOP-Schleife, die macht gar keinen Sinn. Schreibt dir hin (in Deutsch), was dein Programm Schritt für Schritt tun soll, und dann überlege, wie du diesen Ablauf in FB formulieren würdest. Das ist wesentlich hilfreicher, als einfach nur eine fertige Antwort abzuwarten. _________________
 » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 
  |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| qbay 
 
 
 Anmeldungsdatum: 08.06.2008
 Beiträge: 84
 
 
 | 
			
				|  Verfasst am: 03.01.2013, 21:26    Titel: |   |  
				| 
 |  
				| Mit der antwort lässt sich doch sehr gut was anfangen   
 es stimmt, ich bin gedanklich noch in der SPS-Programmierung
 da wird das Programm nich Zeile für Zeile sondern insgesammt abgearbeitet
 aber ich werde deinen Rat befolgen
 mal schauen was raus kommt
 |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| Eternal_pain 
 
  
 Anmeldungsdatum: 08.08.2006
 Beiträge: 1783
 Wohnort: BW/KA
 
 | 
			
				|  Verfasst am: 03.01.2013, 21:48    Titel: |   |  
				| 
 |  
				|  	  | MisterD hat Folgendes geschrieben: |  	  | du darfst den eingegebenen wert halt nicht sofort wieder mit dem aus den restlichen (noch nicht eingegebenen) werten berechneten wert überschreiben, dann funktioniert das auch. | 
 Eigentlich war es das schon
 
 Erweitere deine Variablen...
 
  	  | Code: |  	  | Dim As Single  Ieingabe, Reingabe, Ueingabe, Peingabe
 Dim As Single  Iausgabe, Rausgabe, Uausgabe, Pausgabe
 Dim As String auswahl
 
 | 
 Eventuell sogar noch eine für 'Temp' zum 'zwischenspeichern
 Im select case block noch anpassen...
 
 
 Dannach berechnest du nicht die Variablen der eingabe, sondern anhänging von der eingabe die ausgabevariablen mit der summe der eingabe...
 _________________
 
  |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| Sebastian Administrator
 
  
 Anmeldungsdatum: 10.09.2004
 Beiträge: 5969
 Wohnort: Deutschland
 
 |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| ThePuppetMaster 
 
  
 Anmeldungsdatum: 18.02.2007
 Beiträge: 1839
 Wohnort: [JN58JR]
 
 | 
			
				|  Verfasst am: 04.01.2013, 00:52    Titel: |   |  
				| 
 |  
				| @ qbay 
 du schreibst:
 
  	  | Code: |  	  | If U > 0 And I > 0 Then R = U/I And P = U*I | 
 
 hier ist wichtig das du die komponenten einklammerst!
 
 
  	  | Code: |  	  | If (U > 0) And (I > 0) Then R = U/I And P = U*I | 
 
 Andernfalls hast du das Problem, das der vergleich der Variablen nicht wie gewünscht:
 
 
  	  | Code: |  	  | If U > 0 Then
 If I > 0 Then
 
 | 
 
 ausgeführt wird, sondern eher
 
 
  	  | Code: |  	  | If U > (0 and I) > 0 Then
 
 | 
 
 And ist als logischer operator vorrangig und verknüpft die prüfungskomponenten
 Daher wird erst eine verknüpfung ausgeführt was bei z.B.
 
 U = 1 (Binär wäre dies &B00000001)
 I = 2 (Binär wäre dies &B00000010)
 
 mit AND vernküpft zu
 U AND I = 0 (Binär &B00000000) Führen wird
 
 Das bedeutet in deinem Fall, das bei ungnüstigen Variablenwerten die If Funktion übersprungen wird, da 0 herauskommt.
 
 Nutzt du jedoch die Klamerung, und die damit erzwungene vorrangige abarbeitung der in den klammern stehende prüfung, ändert sich die sichtweise für die IF abfrage.
 
 Hierbei wird aus
 (U > 0) = 1
 (I > 0) = 1
 Was mit AND zu 1 wird.
 
 Gleiches ist übrigens auch für das "Do Loop Until" nötig!
 
 
 [EDIT:] Siehe auch Sebastians Funktion "VervollstaendigenWennMoeglich" in seinem Beispielcode. Dort wird ebenfalls dieses verfahren genutzt um den "ungünstigen Fall" zu umgehen.
 
 
 MfG
 TPM
 _________________
 [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
 |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| Jojo alter Rang
 
  
 Anmeldungsdatum: 12.02.2005
 Beiträge: 9736
 Wohnort: Neben der Festplatte
 
 | 
			
				|  Verfasst am: 04.01.2013, 01:00    Titel: |   |  
				| 
 |  
				| Du hast den wichtigsten Fehler an der Zeile vergessen: Nacheinander auszuführende Statements in derselben Zeile werden mit einem Doppelpunkt getrennt, nicht mit einem logischen AND. Wobei das korrekt geklammert sogar funktionieren könnte (wobei ich keine Ahnung habe, ob FB das kompilieren würde, in C sollte es gehen). _________________
 » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 
  |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| ThePuppetMaster 
 
  
 Anmeldungsdatum: 18.02.2007
 Beiträge: 1839
 Wohnort: [JN58JR]
 
 | 
			
				|  Verfasst am: 04.01.2013, 01:05    Titel: |   |  
				| 
 |  
				| @Jojo .. garnicht gesehen... thx 
 @qbay
 
 wie @jojo schon angemerkt hat, gibt es noch das problem von:
 
  	  | Code: |  	  | Then R = U/I And P = U*I | 
 in
 
  	  | Code: |  	  | If U > 0 And I > 0 Then R = U/I And P = U*I | 
 
 Hier willst du offenbar 2 "eigentlich" einzelne Arbeitsabläufe zusammen ausführen.
 
 Einmal
 R = U/I
 und
 P = U*I
 
 Diese schreibt man entweder
 
  	  | Code: |  	  | If bla = blub Then
 R = U/I
 P = U*I
 End If
 
 | 
 
 oder alternativ durch ein Doppelpunkt getrennt in einer Zeile
 
  	  | Code: |  	  | If bla = blub Then
 R = U/I : P = U*I
 End If
 
 | 
 alternativ auch ohne end if
 
  	  | Code: |  	  | If bla = blub Then R = U/I : P = U*I
 
 | 
 
 Hier muss aber darauf geachtet werden, das man nicht zuviel verschachtelt.
 
 Also, keine If's nach einem Then in der selben Zeile, wenn auch Else Komponenten darin enthalten sind. Das kann schnell zu verwirrung führen, und dadurch zu fehler.
 
 z.B
 
  	  | Code: |  	  | If bla = blub Then If blub = foo Then a = b Else D = E | 
 
 
 MfG
 TPM
 _________________
 [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
 |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		|  |