Nunja, hier auch nochmal eine etwas veränderte Version meines C-Beispiels oben, auch wenn das immer noch etwas umständlich sein mag:
Code: Alles auswählen
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* convvec.c - Convert Vector, compile with:
gcc -Wall -Wextra -ansi -pedantic convvec.c -o convvec */
char *convertvector(char *vector, int width);
int main() {
/* char vector[] = "000010000010000"; */
char vector[] = "00001001000000001000000";
puts(vector);
puts(convertvector(vector, 3));
return 0;
}
char *convertvector(char *vector, int width) {
int i;
int u;
int vectorlength = strlen(vector);
int *ones = malloc(vectorlength - 1);
int oneindex;
int *tochange = malloc(vectorlength - 1);
int tochangeindex;
oneindex = 0;
tochangeindex = 0;
for(i = 0; i < vectorlength; i ++) {
if(vector[i] == '1') {
ones[oneindex] = i;
oneindex++;
}
}
for(i = 0; i < oneindex; i++) {
for(u = 1; u <= width; u++) {
tochange[tochangeindex] = ones[i] + u;
tochangeindex++;
tochange[tochangeindex] = ones[i] - u;
tochangeindex++;
}
}
for(i = 0; i < tochangeindex; i++) {
if(tochange[i] >= 0 && i < vectorlength) {
vector[tochange[i]] = '1';
}
}
return vector;
}
Der Zeiger "*vectorp" ist weg. Wenn ich einen C-String als Zeiger auf char hatte und den ändern wollte, hab' ich sonst einen zweiten Zeiger auf die Anfangsadresse gesetzt und bin mit diesem an die Stellen hin- und hergesprungen, die ich ändern wollte. So auch mit diesem "*vectorp". Grund für den zweiten Zeiger war, das man mit dem ersten immer noch die Anfangsadresse gespeichert hatte, die man ja brauchte, etwa um den String auszugeben. Na ja, das ist alles gar nicht nötig: Man kann C-Strings ja auch gleichzeitig als Arrays betrachten und Zeichen darin über z.B. vector[3] usw. ändern. Wieder was gelernt.
Die Dimensionierung der Arrays "ones" und "tochange" mit festen Zahlen (hier: 15) war natürlich nicht optimal. Jetzt also eine dynamische Dimensionierung mit malloc(). Hab' so noch nie ein int-Array dimensioniert. Scheint zu gehen ...
Über die Randfälle hatte ich mir zuvor auch schon Gedanken gemacht. Bei der Aufgabenstellung ist mir nicht klar, wie bei denen verfahren werden soll. Bei mir wird ja in "tochange" gespeichert, welche Stellen von "vector" geändert werden sollen. Hab' halt eine Bedingung eingebaut, daß nur dann die Änderung wirklich durchgeführt werden soll, wenn der in "tochange" gespeicherte Wert innerhalb der Länge von "vector" liegt. Sonst wird eben gar nichts gemacht. Weiß nicht, ob das der Aufgabenstellung entspricht.
Hab' jedenfalls dabei wieder ein, zwei Schritte in C gelernt. Bin da ja (wie man sieht) noch recht am Anfang. War also ganz hilfreich, die Hausaufgabe. Für mich jedenfalls.
Edit: [\code=c] scheint im Beitrag statt "&&" "&&" zu liefern?