Archiv verlassen und diese Seite im Standarddesign anzeigen : simples C-problemchen
kizi81
2006-01-28, 20:41:03
hi.
es bei mir um ein simples problemchen. aber irgendwie will ich nicht dahinter kommen, wie es funktioniert.
also. ich hab insgesamt 32 vektoren gegeben mit 0 oder 1 als werte( x[31])
jetzt soll ich es so anstellen, dass die inhalte um eine position nach rechts verschoben werden, also mit 1 addiert.
dürfte der befehl dann so lauten x[i+1] ??? mit oder mit x[i]+1, mit i=32?
zeckensack
2006-01-28, 20:54:08
Was soll mit dem zweiundreißigsten Wert geschehen? Soll er unter den Tisch fallen, oder "von links" wieder einrücken?
kizi81
2006-01-28, 21:03:25
das habe ich mich auch gerade gefragt...
das geht aus der aufgabenstellung nicht hervor. also würde ich sagen, dass man den 32sten wert unter den tisch fallen lassen kann
edit:
wäre ich mit einem pointer auf der richtigen spur?
bulla
2006-01-28, 21:06:32
meinst du vielleicht "bitshifting"?
hatte an meiner uni auch mal eine solche aufgabe gesehen, in der sowas gemacht werden sollte...
kizi81
2006-01-28, 21:08:28
ich scanne mal kurz das angaben blatt... momento
zeckensack
2006-01-28, 21:09:31
Ok.
//Falsch!
x[1]=x[0];
x[2]=x[1];
x[3]=x[2];
...
...
x[30]=x[29];
x[31]=x[30];Warum falsch? Weil danach das gesamte Array den gleichen Wert enthalten würde. x[1] wird überschrieben bevor der alte Wert "für die Nachwelt erhalten" werden kann usw.
//Besser
x[31]=x[30];
x[30]=x[29];
x[29]=x[28];
...
...
x[2]=x[1];
x[1]=x[0];Besser weil die Werte an ihren neuen Platz kommen bevor sie (am alten Platz) überschrieben werden.
Daraus solltest du jetzt noch eine Schleife machen, womit die Aufgabe IMO gelöst ist (falls ich sie nicht falsch verstanden habe).
Und was wird mit x[0]? Auf Null oder egal?
kizi81
2006-01-28, 21:20:31
genau um die schleife gehts mir ja.
wie sollte ich inkrementien? das habe ich nämlich noch nie gemacht, zumindest nicht mit feldern.
müsste es dann so heißen:
for (i=32, i>=0, i--)
x[i] = x[i-1]
edit:
hier mal die aufgabe nummer 3
http://img55.imageshack.us/img55/6584/informatik00028if.th.jpg (http://img55.imageshack.us/my.php?image=informatik00028if.jpg)
zeckensack
2006-01-28, 21:55:54
genau um die schleife gehts mir ja.
wie sollte ich inkrementien? das habe ich nämlich noch nie gemacht, zumindest nicht mit feldern.
müsste es dann so heißen:
for (i=32, i>=0, i--)
x[i] = x[i-1]Nein.
Erstmal ist das Trennzeichen für die for-Schleife in C das Semikolon, nicht das Komma.
Davon abgesehen würde in der Schleife i von 32 bis (inklusive) 0 runterlaufen, ja, aber
a)Im ersten Durchlauf würdest du auf x[32] zugreifen, was über das Array hinausschießt
b)x[i-1] wäre im letzten Durchlauf x[-1], was ebenfalls in die Hose gehen wird.
Korrekt wärefor (i=31;i>=1;--i)
x[i]=x[i-1];
//oder ganz exakt nach Aufgabenstellung (Punkt "(c)" in der Einleitung von A3)
for (i=30;i>=0;--i)
x[i+1]=x[i];
Geht noch viel kürzer:
memmove(&x[1],&x[0],sizeof(x)-sizeof(x[0]));
Ob das aber als Lösung anerkannt wird bin ich nicht ganz sicher ;)
kizi81
2006-01-28, 22:30:45
erstmal danke für eure hilfe.
ich hab jetzt mal das programmchen geschrieben. aber da ist der wurm irgendwo drinnen. ich denk es hapert an der übergabe vom Vektor aus der Main funktion in die vektor funktion...
#include <stdio.h>
#include <conio.h>
int vektor(int x[]){
int i;
for(i=5; i>=1; i-1) {
printf("%i ",i);
getch();
x[i] = x[i-1];
return x[5];}
}
main() {
int i;
int vek[i],gesamt=0,durchschnitt;
printf("\t\tVektoren eingeben bitte\n\n");
for(i=0; i<5; i++) {
printf("%i. Vektor : ",i+1);
scanf("%i",&vek[i]);}
vektor(vek);
getch();
return 0;
}
getch habe ich nur eingebaut, damit das programm dann auf ne eingabe wartet. sonst sehe ich ja nicht, was gemacht wurde...
edit2:
int vektor(int x[]){
int i;
for(i=5; i>=1; i-1) {
printf("%i ",i);
getch();
x[i] = x[i-1];
return x[5];}
}
main() {
int i;
int vek[5],gesamt=0,durchschnitt;
printf("\t\tVektoren eingeben bitte\n\n");
for(i=0; i<5; i++) {
printf("%i. Vektor : ",i+1);
scanf("%i",&vek[i]);}
vektor(vek);
getch();
return 0;
int tempartur[i]; // ist kein gültiges C89 und C99 mit undefiniertem Verhalten
kizi81
2006-01-28, 22:58:27
hab das temperatur[i] gegen vek[i] ausgetauscht.
ich hab hier aber ein c-buch, in dem die werte in vek[] mittels i gespeichert werden.
daran dürfte es nicht liegen...
edit:
sorry, hast vollkommen recht :)
vek[i] ist genauso falsch wie temperatur[i]
in den [] muss eine Zahl stehen. Als Literal
kizi81
2006-01-28, 23:17:18
habs jetzt in main mit 5 drinnen stehen... aber immer noch nichts...
stimmt denn die funktion vektor? denn darauf kommts ja eigentlich bei der aufgabe an
Du hast es nichtmal ausprobiert...
for(i=5; i>=1; i-1)
ist eine Endlosschleife, weil i - 1 nicht i um 1 verringert. Da brauchst du entweder --i (oder i--, ist hier ziemlich egal) oder i -= 1. Selbiges gilt für die anderen Schleifen.
Und Quellcode bitte in -Tags packen:
[code]
Schön formatierter und umrahmter Code
Es ist doch der komplette Algorithmus vorgegeben, da muss man nur 1:1 übersetzen in C.
#define NMAX 32
int takt(int* x)
{
int e = x[NMAX - 1];
int a = (x[12] | x[30]) % 2;
for(int i=0; i<NMAX-2; ++i) {
x[i+1] = x[i];
}
x[0] = a;
return e;
}
Sowas sollte man aber hinbekommen, auch wenn die Aufgabe mehr als realitätsfremd ist.
zeckensack
2006-01-29, 08:43:38
Sowas sollte man aber hinbekommen, auch wenn die Aufgabe mehr als realitätsfremd ist.So realitätsfremd ist die garnicht. Die Aufgabe beschreibt ein LFSR, und damit lassen sich mit sehr geringem Aufwand akzeptable Pseudozufallszahlenreihen bilden. ZB die Rauschgeneratoren in der Sound-Abteilung des Gameboy Advance basieren auf LFSRs :naughty:
http://de.wikipedia.org/wiki/Linear_rückgekoppeltes_Schieberegister
zeckensack
2006-01-29, 08:46:44
Geht noch viel kürzer:
memmove(&x[1],&x[0],sizeof(x)-sizeof(x[0]));
Ob das aber als Lösung anerkannt wird bin ich nicht ganz sicher ;)unsigned int sr=...;
sr<<=1;=)
kizi81
2006-01-29, 13:41:38
okay, das problem sei abgehackt :)
wie quadriert man in C eigentlich. ich hab hier folgende form: x hoch n
kann ich dass dann so schreiben x^n?
x^n ist "x xor n"
x hoch n ist pow(x,n)
Hast du kein Buch zum nachschlagen? :confused:
kizi81
2006-01-29, 14:12:33
:biggrin:
gute frage
doch hab ich. aber ich wurde nicht fündig. hab gerade nochmal nachgeschlagen, und hab jetzt nur pow gefunden, jedoch ohne beispiele...
kizi81
2006-01-29, 14:38:19
hier mal mein nächstes problemchen:
http://img100.imageshack.us/img100/2899/informatik2problem3va.th.jpg (http://img100.imageshack.us/my.php?image=informatik2problem3va.jpg)
fragestellung b
folgendes hab ich mal geschrieben:
double pot(double x; int *n){
int e=1;
while(*n>0){
if(*n%2==1){
e = e * x;
*n = *n - 1;
else
x = x * x;
*n = *n /2 ;
}
}
return e;
}
ich bin mir mit der modulo anweisung nicht sicher. was ich damit sagen will: wenn der rest der ganzzahligen division WAHR ergibt(alles ausser 0 wird ja als Wahr interpretiert), dann führe den block aus
Binaermensch
2006-02-04, 21:27:46
[...]
Und Quellcode bitte in -Tags packen:
[code]
Schön formatierter und umrahmter Code
edit: Kacke, jetzt hab ich den Thread wieder hochgeholt. War nicht meine Absicht, entschuldigung.
vBulletin®, Copyright ©2000-2025, Jelsoft Enterprises Ltd.