Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
qbay
Anmeldungsdatum: 08.06.2008 Beiträge: 84
|
Verfasst am: 02.01.2013, 22: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: 4704 Wohnort: ~/
|
Verfasst am: 02.01.2013, 22: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, 22: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, 23: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, 21: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, 22: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, 22: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, 22: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, 22: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, 22: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, 01: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, 02: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, 02: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 |
|
 |
|