Überprüfen ob eine Zahl eine Quadratzahl ist..
-
.. hi muss ein programm schreiben das nach Eingabe des Benutzers überprüft ob die eingegebene Zahl eine Quadratzahl ist.
vorweg bin nen totaler C Neuling und hab da noch seeehr große Lücken glaubhab bisher das geschrieben, habs unterteilt in 2 Funktionen, sollten wir so machen, nur das meine zweite Funktion istQuadrat nicht wirklich anspringen will:
#ifndef AUFGABE24_H_INCLUDED
#define AUFGABE24_H_INCLUDEDint getNat()
{
int x;
printf("Geben sie eine positive ganze Zahl ein:\n");
scanf("%i",&x);
while(1){
if (x<=0){
while(getchar()!='\n'){}
printf("Sie müssen eine ganze positive Zahl eingeben:\n");
scanf("%i",&x);
}
else {
istQuadrat(x);
}
}
}int istQuadrat(x)
{
float y;
float z;
y = sqrt(x);
z = y%1;
if (z==0){
printf("Ihre Zahl ist eine Quadratzahl!");
}
else {
printf("Ihre Zahl ist keine Quadratzahl");
}
}#endif
hoffe ihr könnt mir tips geben wie man das besser macht, danke
-
Funktioniert % auf floats?
-
nee das auch nicht hab ich nun festgestellt hab das ganze jetzt etwas abgeändert zu:
#ifndef AUFGABE24_H_INCLUDED
#define AUFGABE24_H_INCLUDEDint getNat()
{
int x;
printf("Geben sie eine positive ganze Zahl ein, falls diese eine Quadratzahl ist wird ihnen eine 1 ausgegeben, falls nicht eine 0:\n");
scanf("%i",&x);
while(1){
if (scanf==0){
while(getchar()!='\n'){}
printf("Sie müssen eine ganze positive Zahl eingeben:\n");
scanf("%i",&x);
}
else {
istQuadrat(x);
break;
}
}
}int istQuadrat(x)
{
int i;
for(i=1;ii>=x;i++);
if(x=ii)
printf("1");
else("0");
}#endif
allerdings hab ich jetzt immernoch das problem das er bei kommazahlen nicht unterscheidet und mir egal welche Zahl ich eingeb ne 1 raushaut
-
while(1){ .... }
ist eine Endlosschleife. Das Programm kommt da nur raus mit break oder return.
Schau die mal do ... while an.int istQuadrat(x)
Von welchem Typ ist x?
float y; float z; y = sqrt(x); z = y%1;
Der Modulo-Operator % funktioniert nur bei Integern.
PS. Diese hübschen weißen Kästen
kriegt man durch die C/C++ oder Code Tags hin.
Die sind unter den Smilies:p
-
danke schonma für die antwort, das mit break hab ich jetzt au rausgefunden siehe mein 2. post
das x dachte ich reicht wenn es in der getNat funktion schon definiert ist als integer und das mit dem % hab ich jetzt über ne for schleife versucht zu umgehen aber irgendwie passt das immernoch ned so zu 100% ;/
-
Probier doch mal
int a,b; b = (int)sqrt(a);
Jetzt musst du nur noch schauen ob b2 = a ist.
-
mike85 schrieb:
danke schonma für die antwort, das mit break hab ich jetzt au rausgefunden siehe mein 2. post
das x dachte ich reicht wenn es in der getNat funktion schon definiert ist als integer und das mit dem % hab ich jetzt über ne for schleife versucht zu umgehen aber irgendwie passt das immernoch ned so zu 100% ;/
Die Posts habens sich zeitlich etwas überschnitten. Langsames Internet/Server.
Der Complier übersetzt jede Funktion für sich. Allerdings muß er beim Aufruf der Funktion wissen wie sie deklariert ist. Das geht am besten wenn man Funktionen die man benutzen wiil vor die eigene Funktion schreibt.
Also erst istQuadrat(x) dann getNat()
-
Alternativ:
int func1(); int func2(); // ... int func1() { return func2(); } int func2() { return 1; }
-
#include <stdio.h> #include <stdlib.h> #include <string.h> int is_q(int number) { int i; for (i = 0; i < number; i++) { if ((i*i) == number) { return 1; } } return 0; } int main() { int number = 0; char buffer[0x100]; while (number <= 0) { printf("Bitte geben Sie eine ganze Zahl ein: "); memset(buffer, 0, sizeof(buffer)); fgets(buffer, sizeof(buffer), stdin); number = atoi(buffer); } if (is_q(number)) { printf("Die eingegebende Zahl ist eine Quadratzahl!"); } else { printf("Die eingegebende Zahl ist keine Quadratzahl!"); } return 0; }
Eine nicht ganze Zahl kann niemals eine Quadratzahl sein da eine Quadratzahl durch die Multiplikation einer ganzen Zahl mit sich selbst definiert wird. Somit brauchste dich nur um ganze Zahlen zu kümmern
Der Trick mir sqrt() geht natürlich auch, ist aber vielleicht nicht so lehrreich
-
DirkB schrieb:
Probier doch mal
int a,b; b = (int)sqrt(a);
Jetzt musst du nur noch schauen ob b2 = a ist.
sieht nach ner klasse idee aus kriegs nur irgendwie ned umgesetzt
int istQuadrat() { int x,b; b = (int)sqrt(x); if(x=b*b){printf("1");} else{printf("0");} }
das int sqrt is ja soweit ich weiß z.b. bei isqrt(37)=6
nur egal was ich jetzt eingeb haut er mir immer die 1 raus, was ja bei ner richtigen zuweisung für b garnit seien könnte.., bin langsam am verzweifeln
-
if(x = b*b)
Da fehlt noch was
-
mhhhhh, komm ned drauf hab au alles probiert grad < > ! aber ergibt ja auch alles kein sinn? müsste doch wenn ich jetzt 26 eingeb b die 5 zuordnen und dann halt schauen ob 5*5=26?!? oder steh ich aufm schlauch?
-
An dieser Stelle frage ich mich dann immer, wo das Programm herstammt, wo solche Sachen schon mal richtig umgesetzt worden sind
// ich weise einer Variablen einen Wert zu a = 5; b = 7; // ich vergleiche zwei Variablen miteinander if(a == b) ...
-
oh gott
das is echt peinlich nu, naja hab C erst seit anfang Oktober und in meinem Leben eigentlich nie was mit programmieren am Hut gehabt.. großes danke an alle für die ganzen Hilfestellungen, funzt jetzt alles
p.s. studier im hauptfach mathe deshalb is dieses ganze == für mich immer bissi verwirrend ^^
-
cooky451 schrieb:
int is_q(int number) { int i; for (i = 0; i < number; i++) { if ((i*i) == number) { return 1; } } return 0; }
und
mike85 schrieb:
p.s. studier im hauptfach mathe
Schaut doch mal die Differenzen der aufeinander folgenden Quadratzahlen an.
1 4 9 16 25 3 5 7 9
Da kann man is_q noch ein bisschen optimieren und kann dann ohne sqrt auskommen.