Die Mathe-Redaktion - 15.12.2017 17:05 - Registrieren/Login
Auswahl
ListenpunktHome
ListenpunktAktuell und Interessant ai
ListenpunktArtikelübersicht/-suche
ListenpunktAlle Links / Mathe-Links
ListenpunktFach- & Sachbücher
ListenpunktMitglieder / Karte
ListenpunktRegistrieren/Login
ListenpunktArbeitsgruppen
ListenpunktSchwätz / Top 15
ListenpunktWerde Mathe-Millionär!
ListenpunktFormeleditor fedgeo
Schwarzes Brett
Aktion im Forum
Suche
Stichwortsuche in Artikeln und Links von Matheplanet
Suchen im Forum
Suchtipps

Bücher
Englische Bücher
Software
Suchbegriffe:
Mathematik bei amazon
Naturwissenschaft & Technik
In Partnerschaft mit Amazon.de
Kontakt
Mail an Matroid
[Keine Übungsaufgaben!]
Impressum

Bitte beachten Sie unsere Nutzungsbedingungen, die Distanzierung, unsere Datenschutzerklärung und
die Forumregeln.

Sie können Mitglied werden oder den Newsletter bestellen.

Der Newsletter Okt. 2017

Für Mitglieder
Mathematisch für Anfänger
Wer ist Online
Aktuell sind 613 Gäste und 28 Mitglieder online.

Sie können Mitglied werden:
Klick hier.

Über Matheplanet
 
Zum letzten Themenfilter: Themenfilter:
Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » C: Dezimal nach Binärdarstellung
Druckversion
Druckversion
Antworten
Antworten
Autor
Universität/Hochschule C: Dezimal nach Binärdarstellung
smooth
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 27.03.2017
Mitteilungen: 51
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2017-11-21 19:46


Guten Tag ich soll folgendes Programm schreiben:

Und zwar eine Funktion double* dec2bin(int N, int*n), die zu einer natürlichen Zahl 0<=N<65535 die Binärdarstellung berechnet und zurückgibt.
Es sollen die Koeffizienten <math>a_i \in</math>{0,1} für i = 0,...,n ermittelt werden sodass N = <math>\sum \limits_{i=0}^{n-1} a_i 2^i</math> gilt (n<=16). Diese Funktion soll mir jetzt die Binärdarstellung von N ohne führende Nullen liefern. (Dabei muss die Länge des Vektors zurückgegebn werden).

Ich habs jetzt mal probiert aber das passt nicht so ganz glaub ich zumindest (das Ergebnis sieht ziemlich komisch aus):
c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
double* dec2bin(int, int[]);
 
main(){
 
  int var=0;
  int n[16];
  printf("Bitte Zahl (>=0, <65535) eingeben: ");
  scanf("%d", &var);
  dec2bin(var, n);
  printf(" %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d\n", n[15], n[14],n[13],n[12],n[11],n[10],n[9],n[8],n[7],n[6],n[5],n[4],n[3],n[2],n[1],n[0]);
 
}
 
double* dec2bin(int N, int n[]){
  int count = 15;
  for(; count >=0; count--){
    if(N%2==0){
      n[count]=0;
      N=N/2;
    }
    else{
      n[count]=1;
      N=N/2;
    }
  }
}
 



  Profil  Quote  Link auf diesen Beitrag Link
matph
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 20.11.2006
Mitteilungen: 5300
Aus: A
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2017-11-21 20:44


Hallo,

Falls du die Binärdarstellung ausgeben möchtest, kannst du dies z.B. wie folgt machen: smile
C
for(i=15;i>=0;--i)
  printf("%c",x&(1<<i)?'1':'0');
puts("");
Natürlich ist es möglich die Bits der Binärdarstellung in ein Array zu speichern, macht allerdings nicht viel Sinn, nach dem die interne Darstellung der Zahl x ohnedies bereits Binär ist.

--
mfg
matph


-----------------
Wir müssen wissen, wir werden wissen. Hilbert
Das Buch der Natur ist in der Sprache der Mathematik geschrieben. Galilei



  Profil  Quote  Link auf diesen Beitrag Link
smooth
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 27.03.2017
Mitteilungen: 51
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, vom Themenstarter, eingetragen 2017-11-21 20:51


Okay danke!
Was genau macht dieses puts?



  Profil  Quote  Link auf diesen Beitrag Link
matph
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 20.11.2006
Mitteilungen: 5300
Aus: A
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, eingetragen 2017-11-21 21:12


Hallo,

puts gibt einen String am stdout aus, gefolgt von einem Zeilenumbruch, hier ist es damit für den abschließenden Zeilenumbruch verantwortlich smile

--
mfg
matph


-----------------
Wir müssen wissen, wir werden wissen. Hilbert
Das Buch der Natur ist in der Sprache der Mathematik geschrieben. Galilei



  Profil  Quote  Link auf diesen Beitrag Link
smooth
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 27.03.2017
Mitteilungen: 51
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, vom Themenstarter, eingetragen 2017-11-21 22:40


Danke!



  Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 26063
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, eingetragen 2017-11-21 23:31


Hi smooth

Anmerkungen zu deinem Programm:

a)
Was soll der Sinn des Rückgabewertes als double* sein eek ?
Deine Funktion liefert ja nicht mal einen Rückgabewert (kein return).

b)
Das komplizierte if kannst du dir sparen:
C
for(count = 15; count >=0; count--){
   n[count] = N%2;
   N = N/2;
}

c)
Warum speicherst du die Binärwerte „rückwärts“?
In n[0] hätte ich den Koeffizienten von <math>2^0</math> erwartet.

Gruß vom ¼


-----------------
Bild



  Profil  Quote  Link auf diesen Beitrag Link
smooth
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 27.03.2017
Mitteilungen: 51
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.6, vom Themenstarter, eingetragen 2017-11-21 23:50


Okay jetzt hier nochmal:

1) warum der Rückgabewert double* sein soll war und ist mir auch ein Rätsel (steht aber so in der Angabe hab das jetzt mal zu char* geändert)

2) hab das if umgeändert ist jetzt eine for schleife (obwohl ich danach trotzdem noch if/else abfragen habe)

3) Danke das wär mir gar nicht aufgefallen (sollten beim neuen Programm jetzt "richtig" herum sein wenn ich mich nicht täusche)


Soo jetzt zum Problem (schon wieder sry) wie schneide ich die 0en ab?
Also dass die Ausgabe mit einem 1er beginn?
C
#include <stdio.h>
#include <stdlib.h>
 
char* dec2bin(int);
 
main(){
    int N=0;
    char* bin=0;
    printf("Zahl eingeben (>=0, <65535): ");
    scanf("%d", &N);
    bin = dec2bin(N);
    printf("%s", bin);
    free(bin);
}
 
char* dec2bin(int N){
  char *ergebnis = malloc(sizeof(char));
  int n=15;
  int pow=1;
  for(n=15; n>=0; n--){
    if(N & pow)
      ergebnis[n] = '1';
    else
      ergebnis[n] = '0';
    pow*=2;
  }
  ergebnis[16] = '\0';
  return ergebnis;
}
 



  Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 26063
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.7, eingetragen 2017-11-22 03:10


smooth schreibt:
Soo jetzt zum Problem (schon wieder sry) wie schneide ich die 0en ab?
Indem du zur ersten Version mit der Division N = N/2; zurückkehrst und aufhörst, wenn N==0 ist. Dann brauchst du gar nix abzuschneiden.

Und dann macht auch diese Forderung Sinn:
2017-11-21 19:46 - smooth im Themenstart schreibt:
(Dabei muss die Länge des Vektors zurückgegebn werden).
Allerdings muß dazu das Ergebnis ein int sein, und nicht so ein unsinniger double* confused

Außerdem hats du mit deiner Änderung diese Vorgabe der Aufgabe ignoriert:
Und zwar eine Funktion dec2bin(int N, int*n)
Der Sinn ist ja wohl, daß der Aufrufer der Funktion bereits das Array zur Verfügung stellt, in dem die Ziffern abgelegt werden sollen. Deine char-Variante schmeißt das über den Haufen.



  Profil  Quote  Link auf diesen Beitrag Link
smooth
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 27.03.2017
Mitteilungen: 51
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.8, vom Themenstarter, eingetragen 2017-11-22 18:06


Gut bin jetzt wieder zur 1rsten Version zurückgekehrt:

Hab die Binärwerte richtig herum gespeichert und die sinnlose if/else ersetzt.

Nun zum beenden der angehenden 0en (Hab leider grad keine PC zur Hand also kann ichs nicht ausprobieren).
Würde es funktionieren wenn ich nach der N=N/2 Division einfach eine if Abfrage mache, und falls die gilt das Programm stoppt?
Also:

...
N=N/2;
if(N==0){
break;
}
...



  Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 26063
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.9, eingetragen 2017-11-23 01:39


Naja, stoppen wäre etwas rabiat.
Nimm diese Abbruchbedingung doch als Kriterium mit in den Kopf der for-Schleife.



  Profil  Quote  Link auf diesen Beitrag Link
smooth hat die Antworten auf ihre/seine Frage gesehen.
smooth hatte hier bereits selbst das Ok-Häkchen gesetzt.
Neues Thema [Neues Thema] Antworten [Antworten]    Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2017 by Matroids Matheplanet
This web site was made with PHP-Nuke, a web portal system written in PHP. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]