Bash-C Primzahlen

lassoheinz

Ensign
Registriert
März 2019
Beiträge
166
Ich habe ein kleines Problem bei meinem Programm, ich möchte das, dass Programm die Primzahlen bis zu einem bestimmten Wert berechnet.......
Ich prgrammiere in der Bash Konsole(ubuntu)
Hier das Ergebnis:

01_ProgrammPIC.jpg


Der Quellcode:
#include <stdio.h>
// math.h --> sqrt(wurzel) funktioniert nicht
// #include <math.h>

main() {
int a = 0;
int b = 0;
int i = 0;
int end =0;
int primeZahl = 0;

printf("Bis zu welcher Zahl soll die Primzahlen-Berechnung\n durchgeführt werde n: ");
scanf("%d", &end);

for(i=2; i<end; i++)
{
// Wurzel berechnung
a = i^(1/2);
for(int j=2; j<a; j++)
{
if((i%j) == 0)
{
primeZahl = 1;
}
}
if(primeZahl == 0)
{
printf("Primzahl: %d\n", i);
}
}
}

Verurteilt mich nicht wegen dem nicht sehr schönen Syntax...ich lerne gerade mit dem VI-Editor umzugehen, und C-Programmierung..
Edit: Wegen dem Copy-Paste sieht der Programm syntax noch schlimmer aus,,,,,,
 
LaRsX schrieb:
Edit: Wegen dem Copy-Paste sieht der Programm syntax noch schlimmer aus,,,,,,
Dafür gibts [CODE][/CODE]
 
Richtig. Und wenn du "Einfuegen" -> "Code" nimmst, dann waere das nicht passiert und du koenntest sogar die Sprache auswaehlen so dass wir fancy Syntax Highlighting bekommen wuerden.
Ergänzung ()

Du solltest am Ende der Schleife mal primeZahl wieder auf 0 setzen, sonst wird das nix.
 
Danke für die Info....Wie ihr erkenne könnt bin ich noch nicht lange hier im ComputerBase forum unterwegs....

Programmcode:
Bash:
#include <stdio.h>
// math.h --> sqrt(wurzel) funktioniert nicht

// #include <math.h>

main() {
 int a = 0;
 int b = 0;
 int i = 0;
 int end =0;
 int primeZahl = 0;

 printf("Bis zu welcher Zahl soll die Primzahlen-Berechnung\n durchgeführt werde n: ");
 scanf("%d", &end);

 for(i=2; i<end; i++)
 {
  // Wurzel berechnung
  a = i^(1/2);
  for(int j=2; j<a; j++)
  {
   if((i%j) == 0)
   {
    primeZahl = 1;
   }
  }
 if(primeZahl == 0)
  {
   printf("Primzahl: %d\n", i);
  }
 }
}
 
Code:
a = i^(1/2);
Ist zwar nett gemeint, wird aber in C nicht das machen was du erwartest: ^ ist nicht potenzieren, sondern Bitweises XOR und 1/2 ergibt als Integerdivision nicht 0,5 sondern 0.
Um die Wurzel zu berechnen ist sqrt schon der richtige Weg. Wenn's mit der math.h nicht funktioniert, versuch mal beim kompilieren das -lm Flag dazuzugeben.
 
GeneralMelchett schrieb:
-lm Flag dazuzugeben.
äähm das ist was? 🤔
bzw. wie/wo muss ich das eingeben?... Verwende noch nicht sehr lange Linux/Konsole/VI-Editor....ich bitte um Vergebung😆
 
sqrt kann nicht funktionieren da du mit "//" den include unterbindest. Das -lm musst du dem compiler mitgeben da du nicht wie im Titel bash machst sondern reines C.
 
@GeneralMelchett
Funktion aber soweit:
Screenshot from 2019-03-23 19-11-30.png

2 und 3 sind oben abgeschnitten
Ergänzung ()

ModellbahnerTT schrieb:
sqrt kann nicht funktionieren da du mit "//" den include unterbindest
Deshalb habe ich den Include auskommentier:
Screenshot from 2019-03-23 19-17-15.png
 
Zuletzt bearbeitet:
Wenn es so funtioniert, gut. Aber unter Umständen kann es passieren, dass der Compiler die Funktionen aus der math.h nicht findet und dann müsstest du ihn mit dem Befehl
Code:
 gcc -lm Primzahlen.c
aufrufen.
Das zu erklären würde hier zu weit führen, aber wenn du weiter mit C arbeiten willst wirst du dich (leider) recht bald mit der Funktionsweise von Bibliotheken/Libraries und dem Linker auseinandersetzen müssen.
 
Das mit dem -lm will aber nicht so ganz....
Screenshot from 2019-03-23 20-18-34.png

Könntest du mir vll ein Buch/Internet seit zu dem Thema Linker und Libraries empfehlen(nur wenn du welche kennst ....Googlen kann ich immerhin noch selber (:..)

Edit: Der Datentyp sollte dann double sein?...Deshalb funktioniert es wahrscheinlich nicht.--->Edit2. Nein an dem liegts nicht?

LG
 
Spontan kann ich dir da nichts empfehlen, aber mit Googlen wirst du dazu bestimmt reichlich finden. Zu den vielen "spaßigen" Dingen beim Linken von Bibliotheken gehört z.B., dass die Reihenfolge entscheidend ist, was ich oben dann auch direkt vergeigt habe. So funktioniert es aber hoffentlich:
Code:
gcc Primzahlen.c -lm

Und der Rückgabetyp der main-Funktion sollte immer int oder void sein.
 
Habe die alte Main routine durch das ersetzt
C:
void Main(){

compilen wollte ich so:
Bash:
gcc Primzahlen.c -lm
Zurück bekommen habe ich das:
Sonntag.jpg
 
wurde geändert:
C:
 void main() {

Ergebnis:
Sonntag_Ergebnis.png

Vielen Dank für die Hilfe!!!!
 
void?

Gewöhn Dir bitte sowas gar nicht erst an. Die Signatur für die Einstiegsroutine ist

Code:
int main(int argc, char** argv)

wobei man natürlich mit viel Lust argc und argv in was anderes ändern kann, aber wegen Konvention nicht unbedingt sollte.
  • Der Rückgabewert (int) kommt hinten raus als Errorlevel (0 für Erfolg; größer 0 für Fehler).
  • argc ist die Anzahl der übergebenen Argumente an die ausführbare Datei (automatisch eingefügt): ARGument Count.
  • argv ist die Liste der Argumente (ARGument Vector) als Array von Strings.
Das funktioniert aber nur mit der richtigen Signatur. Wenn man void() deklariert, kann man keine Fehler weitergeben und $? ist unbrauchbar. Und wenn man argc/argv wegläßt, kann man keine Argumente auswerten.

Noch als Hinweis: mach in main() möglichst wenig, bau stattdessen eine Funktion void getPrimzahlen() und vielleicht sogar noch eine Funktion bool isPrimzahl(int p). Macht die ganze Sache sehr viel übersichtlicher. Gut, für so ein kleines Beispiel ist das natürlich nicht so wichtig, aber... es ist am Ende schlicht Gewohnheit und die kommt immer irgendwo her.

Manchmal sind's gute. Meistens aber schlechte Angewohnheiten, die einem dann später in den Rücken fallen.
 
  • Gefällt mir
Reaktionen: simpsonsfan
LaRsX schrieb:
Funktion aber soweit
Ja, weil
Code:
a = i^(1/2);
wie von GeneralMelchett erwähnt, bitweises OR mit (int 1/2), sprich 0 ist. Das bedeutet, dass die Zeile in deinem Code nichts anderes macht als
Code:
a=i;
 
Mit "Funktioniert" meinte ich das die Ergebnisse stimmen....(habe alle Werte bis 100 überprüft)
 
Zurück
Oben