PDA

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).

Coda
2006-01-28, 21:16:25
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];

Trap
2006-01-28, 22:02:21
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;

Trap
2006-01-28, 22:45:31
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 :)

Trap
2006-01-28, 23:03:10
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

Trap
2006-01-28, 23:38:07
Du hast es nichtmal ausprobiert...

Xmas
2006-01-28, 23:42:38
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

Gast
2006-01-28, 23:49:10
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?

Trap
2006-01-29, 13:46:23
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.