Helpdesk
Menschen Wissenschaft Politik Mystery Kriminalfälle Spiritualität Verschwörungen Technologie Ufologie Natur Umfragen Unterhaltung
weitere Rubriken
PhilosophieTräumeOrteEsoterikLiteraturAstronomieHelpdeskGruppenGamingFilmeMusikClashVerbesserungenAllmysteryEnglish
Diskussions-Übersichten
BesuchtTeilgenommenAlleNeueGeschlossenLesenswertSchlüsselwörter
Schiebe oft benutzte Tabs in die Navigationsleiste (zurücksetzen).

Programmieren: Hilfe & Austausch

920 Beiträge ▪ Schlüsselwörter: Programm, Code, Html ▪ Abonnieren: Feed E-Mail

Programmieren: Hilfe & Austausch

05.12.2011 um 00:19
Hallo miteinander!

Zuerst einmal will ich anmerken das ich noch C-Neuling bin und bitte um etwas Gnade.;)

Ich erstelle gerade ein Programm in C, das Dezimalzahlen in Oktalzahlen und umgekehrt
umrechnen können soll mithilfe des Horner-Schemas. Zudem soll es unbrauchbare Eingaben wie z.b. Buchstabenketten erkennen und aussortieren.
Ich habe nun folgende Probleme:
1. Bei der Auswahl des ersten Menüpunktes funktioniert die Rechnung einwandfrei nur der Überlauf will nicht hinhauen, trotz: if (zwischenwert <= UINT_MAX)
2. Bei der Umrechnung von oktal in dezimal gibt mir das Programm unbrauchbare Ergebnisse aus und ich finde den Fehler partout nicht.

Der Code sieht bis jetzt so aus:

#include <stdio.h>
#include <conio.h>
#include <limits.h>

int main(int argc, char *argv[])
{
unsigned int dezimalzahl, ausgangswert, zwischenwert;
int auswahl=1;
int stelle, fehler = 0, pruefung;
char oktal[12]={0};

while (auswahl!=3)
{


printf(" Dezimalsytem => Oktalsystem Oktalsystem => Dezimalsystem.\n\n\n");
printf("Waehlen Sie bitte aus, was Sie zunaechst tun moechten (1-3) :\n\n");
printf(" <1>. Konvertierung vom Dezimalsystem zum Oktalsystem\n");
printf(" <2>. Konvertierung vom Oktalsystem zum Dezimalsystem\n");
printf(" <3>. Programm beenden.\n\n");

scanf("%d", &auswahl);

switch(auswahl)
{
case 1:

oktal[11]='\0';
stelle = 10;

printf("Geben Sie eine positive ganze Dezimalzahl ein: ");
pruefung = (scanf("%ld", &zwischenwert));


if (pruefung == 1)
{
if (zwischenwert <= UINT_MAX)
{
ausgangswert = zwischenwert;
while (zwischenwert != 0)
{
dezimalzahl = zwischenwert;
zwischenwert = zwischenwert / 8;
dezimalzahl = dezimalzahl % 8;
oktal[stelle] = dezimalzahl + '0';
stelle--;
}
printf("\n%ld dezimal entspricht im Oktalsystem der Zahl %s\n\n", ausgangswert, &oktal[stelle+1]);
printf("\n\n\n\n\n\n\n\n\n");
}
else printf("\nDie eingegebene Zahl ist zu gross!\n\n");
}
else printf("\nSie haben Buchstaben eingegeben, geben Sie Zahlen ein!\n\n");

break;
case 2:

oktal[12] = 0 ;
stelle = 0;

printf("Geben Sie eine Oktalzahl ein: ");
scanf("%11s", &oktal);

for (stelle = 0; oktal[stelle] ; ++stelle )
{
if (oktal[stelle] >= '0' && oktal[stelle] <= '7')
dezimalzahl = 8 * dezimalzahl + (oktal[stelle] - '0');
else fehler = 1;
}
if (fehler == 1)
{
printf("\nFehlerhafte Eingabe! Eine Oktalzahl besteht aus den Ziffern 0-7!\n");
printf("Wiederholen Sie die Eingabe\n\n\n\n\n\n\n\n\n\n\n");
}
else printf("\nDie oktale Zahl %s entspricht %ld im Dezimalsystem.\n\n\n\n\n\n\n\n\n\n\n", oktal, dezimalzahl);

break;

case 3: break;

default: printf("\nBitte geben Sie eine Zahl zwischen 1 und 3 ein.\n\n\n\n\n\n\n\n\n\n\n");

}
}
}

Ich benutze Visual Studio 2008
Danke schon mal im vorraus!:)

Anzeige
melden

Programmieren: Hilfe & Austausch

05.12.2011 um 08:23
@pennywisealles

eine unsigned int kann eh nicht > UINT_MAX sein. Wenn sie darüber liegt wird sie auf UINT_MAX reduziert Wenn du testen willst ob deine Zahl nicht übergelaufen ist musst du also Testen ob sie < UINT_MAX ist.

außerdem solltest du Bedenken das Oktalzahlen wenn du sie im Dezimalbereich rechnest tendenziell höher sind und deinen Maximalbereich wieder überschreiten können.

wenn ich eine Stelle zur Darstellung meiner Zahl im Dezimalbereich habe und dort eine 9 reinpacke.

diese dann IM DEZIMALBEREICH nach Oktal umrechne bekomme ich 11 und damit einen Überlauf.


melden

Programmieren: Hilfe & Austausch

05.12.2011 um 13:34
Hab meinen Fehler bei der Rechnung für Case 2 gefunden... die variable Dezimalzahl war nicht definiert... habe sie nun mit dezimalzahl=0 definiert und bekomme endlich richtige Ergebnisse.

Die Fehlerabfrage wenn man Buchstaben statt Zahlen eingibt funktioniert mittlerweile auch schon.

@interpreter
Danke schon mal für die Antwort.
Wie würde die Prüfung dann in diesem Fall aussehen?
Also das er mir wenn die Zahl zu groß ist er mir eine Fehlermeldung ausgibt.
Sorry das ich hier mit so einer simplen Frage nicht zurecht komme aber irgendwie steh ich am Schlauch :)


melden

Programmieren: Hilfe & Austausch

08.12.2011 um 12:51
@all
Jetzt habe ich diesen Thread auch gefunden \o/
Ich bin ein großer Freund der "altmodischen" Programmierung.
Meistens Code ich in C oder C++ (manchmal auch gemischt *in der Ecke versteck*).
Da ich Linuxanwender bin, bin ich so wie so nicht begeistert von .net. Das ist ein ziemliches Tabuthema für mich. Ich rate auch jedem dazu den GNU C(++) Compiler zu verwenden und nicht den Microsoftcompiler, das sind aber persönliche Gründe, die auf persönlichen Erfahrungen aufbauen.

Sonst kann ich noch ein bisschen Java, ein bisschen PHP und auch ein bisschen Visual Basic(.net) *schäm*.

Ich programmiere gerne für den Endanwender, da mir dies einfach Spaß macht. Im Moment arbeite ich mich in GTK und Netzwerkverbindungen (ja ich kann das immernoch nicht, da ich es bis jetzt einfach nicht gebraucht habe) ein.
Falls mir jemand gute Lektüre zu GTK empfehlen kann sage ich nicht nein :)

Viele Grüße
Vafthrudnir


melden

Programmieren: Hilfe & Austausch

08.12.2011 um 15:17
@vafthrudnir

Ich hatte da mal was auf Deutsch gefunden, Socket Programmierung in C für Linux:
http://www.amazon.de/Grundkurs-Socketprogrammierung-unter-Linux-Einsteigerbuch/dp/3834803782/ref=sr_1_5?ie=UTF8&qid=1323353378&sr=8-5

Scheint gut zu sein. Gibt es auch für den Kindle.

Übrigens:
http://www.allmystery.de/wiki/amazon


melden

Programmieren: Hilfe & Austausch

10.12.2011 um 18:28
@Lightstorm
Herzlichen Dank dafür.


melden

Programmieren: Hilfe & Austausch

18.12.2011 um 22:45
Tagchen zusammen.

Hätte ne kurze frage zu einem kleinen Programm:

(geschrieben in C)


#include < stdio.h >
main ()
{
double wurzelZwei;
wurzelZwei= sqrt(2.0);
printf("Wurzel 2: %3.2lf\n", wurzelZwei);
system("PAUSE");
}


der Fehler hier ist das der compiler ohne #include <math.h> nicht weis was er mit der funktion sqrt anfangen soll und deswegen einen himmelschreiend falschen wert ausspuckt.^^

Aber was ich mich nun Frage ist wie er auf diesen seltsamen Wert (bei mir 1073742463.00) kommt.

Hat jemand eine Idee?


melden

Programmieren: Hilfe & Austausch

18.12.2011 um 23:16
@pennywisealles
ich zitiere mal einen Beitrag aus nem anderen Forum:
c geht davon aus, dass wenn man keinen expliziten rückgabetyp einer fkt angeben hat, dass diese einen int zurück liefert und konvertiert daher von int zu double, was zu dem von dir beschriebenen ergebnis führt.



melden

Programmieren: Hilfe & Austausch

21.01.2012 um 08:44
Ich stehe gerade etwas auf dem Schlauch, bei der Erstellung einer Validierungsfunktion in PHP.
Und zwar geht es um Regex. Folgender Code prüft, ob ein String nur aus erlaubten Zeichen besteht, was auch ansicht nichts kompliziertes ist und gut klappt:
/^[a-zA-Z0-9_-]{0,}$/
Erlaubte zeichen sind also: "A-Z", "a-z", "0-9", "_" und "-".
Allerdings sollen "_" und "-" jeweils nur einmal vorkommen dürfen.

Habe jetzt schon verschiedenste Versuche durchgeführt, aber ohne Erfolg.
Irgendwie finde ich auch im Netz gerade nichts hilfreiches :ask:


melden

Programmieren: Hilfe & Austausch

21.01.2012 um 10:47
teil es in 3 einzelne bereiche

also ist etwas lange geworden, sollte aber funktionieren...
man kann es bstimmt auch innerhalb voneinander abhängig machen, damit du das OR wegkriegst, aber weiss grad nicht wie und glaube auch nicht, dass es dann leserlicher wird...

/^[a-zA-Z0-9]*[_]?[a-zA-Z0-9]*[-]?[a-zA-Z0-9]*|[a-zA-Z0-9]*[-]?[a-zA-Z0-9]*[_]?[a-zA-Z0-9]*$/


melden

Programmieren: Hilfe & Austausch

21.01.2012 um 11:01
Damit die Nachwelt auch bescheid weiss: Geht leider nicht so.


melden

Programmieren: Hilfe & Austausch

21.01.2012 um 11:07
korrektur, versuch mal:

/^[a-zA-Z0-9]*(_)?(?(1)|-)?[a-zA-Z0-9]*(?(1)-)?(?(2)_)?[a-zA-Z0-9]*$/


melden

Programmieren: Hilfe & Austausch

21.01.2012 um 11:10
Compilation failed: reference to non-existent subpattern at offset 51 in...


melden

Programmieren: Hilfe & Austausch

21.01.2012 um 11:18
nun aber hoffentlich :D
/^[a-zA-Z0-9]*(_)?((?(1)|-))?[a-zA-Z0-9]*(?(1)-)?(?(2)_)?[a-zA-Z0-9]*$/

oder dann

/^[a-zA-Z0-9]*(_)?(?(1)|(-))?[a-zA-Z0-9]*(?(1)-)?(?(2)_)?[a-zA-Z0-9]*$/

bzw. könnte auch so sein...
/^[a-zA-Z0-9]*(_)?(?(1)|(-)?)[a-zA-Z0-9]*(?(1)-?)(?(2)_?)[a-zA-Z0-9]*$/


melden

Programmieren: Hilfe & Austausch

21.01.2012 um 11:28
Und nochmal für die Nachwelt: Das funktioniert :ok:
/^[a-zA-Z0-9]*(_)?((?(1)|-))?[a-zA-Z0-9]*(?(1)-)?(?(2)_)?[a-zA-Z0-9]*$/

Danke sehr an Magi :)


melden

Programmieren: Hilfe & Austausch

11.09.2012 um 13:19
Hallo

dann poste ich mein problem mal hier rein
nichts großes aber ich hoffe mir kann hier einer helfen
es geht um c++ mit allegro in visual studio 2010 und hierbei um bitmaps im screen oder buffer (ich bin mal auf den doublebuffer gegangen)

ich versuch mal nur das wesentliche zu posten, wenn sonst noch was gebraucht wird, bitte bescheid sagen

mein code im main:

... set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0); ... BITMAP *Doublebuffer = create_bitmap(640, 480); BITMAP *forrest = load_bitmap("forrest.bmp", NULL); ... while(!key [KEY_ESC]) { .. blit(Doublebuffer, screen, 0,0, 0,0, 640, 480); triangle(Doublebuffer, varTriR, varTriH, 147, 340, 493, 340, makecol(255, 0, 0)); blit(forrest, Doublebuffer, 0,0, 0,0, 640,480); .. }

natürlich ist da noch was zwischen, das tut aber nichts zur sache
mir geht es nur um das bild, also die forrest.bmp
die andere .bmp geht aber diese nicht
warum nicht?
wenn ich das blit unten auskommentiere führt er den code aus, zeigt aber natürlich das bild nicht an, daraus schließe ich, ein problem mit dem einlesen hat er nicht.
das bild liegt im selbem verzeichnis
aber anzeigen will er es nicht
warum?
die werte in der klammer stimmen doch, oder nicht?
das bild forrest soll auf den doublebuffer, es soll nichts ausgeschnitten werden, die position liegt sowohl bei x als auch bei y bei 0 und es ist 640x480 groß
wo ist also das prob?
außerdem dachte ich, wenn die zahlen falsch wären würde er es höchsten noch falsch anzeigen
er gibt dann aber nur eine fehlermelung aus und führt damit das programm nicht aus
jemand eine idee was ich da machen kann?


melden

Programmieren: Hilfe & Austausch

11.09.2012 um 15:21
@yaacool

Warum hast du die Variable Doublebuffer genannt? Soweit ich weiß gibt es Schlüsselwörter in CPP die ganz ähnlich lauten... versuchs mal mit nem anderen Variablen-Namen.

Soweit ich das sehe blittest du einmal die LEERE bmp auf den screen, veränderst dann die leere bmp und dann passiert nichts weiter.

Kann es sein das du in dem Befehl source(quelle) und dest (destination->Ziel) vertauscht hast?

Und dann müsste da noch irgendwo ein befehl stehen, wo du das alles zurück auf den Screen blittest, sonst sind deine Befehle ja irelllevant.


melden

Programmieren: Hilfe & Austausch

11.09.2012 um 15:25
@interpreter

ich blitte alles auf den doublebuffer und den dann auf den screen
das geht jetzt, das war nicht das prob
ich hab die forrest.bmp nochmal neu gemacht, die war wohl irgendwie nicht richtig


melden

Programmieren: Hilfe & Austausch

11.09.2012 um 15:27
@yaacool

dann hast du das wohl in Code gemacht, den du nicht aufgeschrieben hast :D

Naja... wenns funktioniert funktionierts.


melden

Programmieren: Hilfe & Austausch

11.09.2012 um 15:30
@interpreter

na doch

set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
erstellt den screen

BITMAP *Doublebuffer = create_bitmap(640, 480);
erstellt die leere bitmap

blit(forrest, Doublebuffer, 0,0, 0,0, 640,480);
blittet die forrest.bmp auf die leere bitmap

blit(Doublebuffer, screen, 0,0, 0,0, 640, 480);
bringt die "leere" bitmap (auf der dann die anderen landen) auf den screen

so hab ich mir das jedenfalls gedacht :D


Anzeige

melden