-3
so ...私はハノイのタワーズプログラムで働いており、これはすべてのことを壊して...あなたが私を助けてもらえますか?これが私の最初の質問です、と私は本当にそれがその後、コンパイルエラーだ場合は、この作業は:(メイン機能でこれはなぜプログラムを破壊するのですか? (私はcで動作しています)t tablero =(int *)malloc(sizeof(int)* fil * col);
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void imprime(int *tab, int fil, int col, int ultNum, char name[64], char caso, int count, int filOrig, int filDest) {
/*
Precondición:
*tab Puntero a una matriz de tipo entero.
fil Entero que indica el numero de filas de la matriz.
col Entero que indica el numero de columnas de la matriz.
disc Parámetro de tipo entero que indica el numero de discos usados.
ultNum Entero que indica el numero que esta usando el disco mas grande.
*/FILE *f;
switch (caso) {
case 119:
f = fopen(name, "w");
break;
case 97:
f = fopen(name, "a");
break;
default:
printf("no file");
break;
};
int j, c;
int i, esp;
printf("Move %d to %d, movement number %d \n", filOrig, filDest, count);
for (c = col - 1; c >= 0; c--) {
for (j = 0; j < fil; j++) {
esp = (ultNum - tab[col * j + c])/2;
// Espacios a la izquierda
for (i = 0; i < esp; i++) {
fprintf(f, " ");
printf(" ");
};
// Imprime los comodines
for (i = 0; i < tab[col * j + c]; i++) {
fprintf(f, "*");
printf("*");
};
// Espacios a la derecha
for (i = 0; i < esp; i++) {
fprintf(f, " ");
printf(" ");
}
fprintf(f, "\t");
printf("\t");
};
fprintf(f, "\r\n");
printf("\n");
};
printf("\n \n \n \n \n");
fprintf(f, " \r\n \r\n \r\n \r\n \r\n ");
fclose(f);
count++;
};
void mueveDisco(int *tab, int fil, int col, int ultNum, int filOrig, int filDest, char name[64], char caso, int count) {
/*
Precondición:
*tab Puntero a una matriz de tipo entero.
fil Entero que indica el numero de filas de la matriz.
col Entero que indica el numero de columnas de la matriz.
disc Parámetro de tipo entero que indica el numero de discos usados.
ultNum Entero que indica el numero que esta usando el disco mas grande.
filOrig Entero que indica el numero de fila de la matriz en la cual hay que coger el numero/disco
filDest Entero que indica el numero de fila de la matriz en la cual hay que dejar el numero/disco.
Poscondición:
Se mueve el disco y se llama a la función que imprime el tablero.
*/
int cO = col - 1, cD = col - 1;
// Se busca el disco que se encuentre mas arriba y por lo tanto el mas pequeño de la fila de origen.
while (cO >= 0 && tab[col * filOrig + cO] == 0) {
cO--;
};
if (cO < 0)
cO = 0;
// Ahora se calcula cual es la posición libre mas arriba de la fila de destino
while (cD >= 0 && tab[col * filDest + cD] == 0) {
cD--;
};
// Se mueve el disco de la fila de origen a la de destino:
tab[col * filDest + cD + 1] = tab[col * filOrig + cO];
tab[col * filOrig + cO] = 0;
// Se imprime el tablero:
imprime(tab, fil, col, ultNum, name, caso, count, filOrig, filDest);
};
void hanoi(int *tab, int fil, int col, int disc, int ultNum, int O, int A, int D, char name[64], char caso, int count) {
/*
Precondición:
*tab Puntero a una matriz de tipo entero.
fil Entero que indica el numero de filas de la matriz.
col Entero que indica el numero de columnas de la matriz.
disc Parámetro de tipo entero que indica el numero de discos usados.
ultNum Entero que indica el numero que esta usando el disco mas grande.
O,A,D Tres enteros que indican la fila desde donde se ha de coger el disco y a donde se ha de traspasar. La primera vez que se llama a hanoi tienen los valores de: 0 ,1 y 2 respectivamente.
Poscondición:
Se llama recursivamente a hanoi hasta resolver el tablero.
*/
if (disc == 1) {
// Se borra la pantalla, se imprime la tabla y se hace una pausa que varia dependiendo del numero de discos:
mueveDisco(tab, fil, col, ultNum, O, D, name, caso, count);
if (col <= 5) system("sleep 0.8");
else if (col <= 10) system("sleep 0.3");
else if (col <= 15) system("sleep 0.06");
else if (col > 15) system("sleep 0.02");
} else {
hanoi(tab, fil, col, disc - 1, ultNum, O, D, A, name, caso, count);
mueveDisco(tab, fil, col, ultNum, O, D, name, caso, count);
if (col <= 5) system("sleep 0.8");
else if (col <= 10) system("sleep 0.3");
else if (col <= 15) system("sleep 0.06");
else if (col > 15) system("sleep 0.02");
hanoi(tab, fil, col, disc - 1, ultNum, A, O, D, name, caso, count);
};
};
int main(int argc, char *argv[]) {
int k; /* Value for the "-q" optional argument. */
time_t t = time(NULL);
struct tm *tm = localtime(&t);
char s[64];
strftime(s, sizeof (s), "%c", tm);
printf("%s\n", s);
char name[64];
int fil = 3, col = 3, *tablero = NULL;
int j, c, disc = 1, ultNum;
int count = 0;
char caso;
int i;
/*
printf("Escoja nombre del fichero :");
scanf("%s", &name);
printf("Indique el numero de discos: ");
scanf("%i", &col);
printf("Seleccione operacion en fichero: \n1. Añadir texto al archivo\n2. Reescribir archivo si existe\n3. No imprimir en archivo\n");
scanf ("%d", &caso);
*/
for (i = 0; i < argc; i++) {
if (strcmp(argv[i], "-d") == 0) {
col = atoi(argv[i + 1]);
}
if (strcmp(argv[i], "-f") == 0) {
sprintf(name, "%s.txt", argv[i + 1]);
}
if (strcmp(argv[i], "-o") == 0) {
caso = argv[i + 1];
}
}
printf("hace el for\n");
FILE *f;
printf("hace el file\n");
switch (caso) {
case 119:
f = fopen(name, "w");
printf("escribí la w\n");
break;
case 97:
f = fopen(name, "a");
printf("escribi la a\n");
break;
default:
printf("no file\n");
break;
};
printf("hace el switch\n");
tablero = (int *) malloc(sizeof (int)*fil * col); //peta aqui
printf("hice el sizeof");
// Resetea las torres poniendo "los discos" en una de ellas y 0 en el resto.
for (j = 0; j < fil; j++)
for (c = col - 1; c >= 0; c--)
if (j == 0) {
tablero[col * j + c] = disc;
disc += 2;
} else
tablero[col * j + c] = 0;
ultNum = disc;
fprintf(f, " Comand line entered: \r\n Number of towers : %d \n\n Number of discs: : %d \n\n Output filename : %s \r\n \r\n Init time : %s \r\n \r\n \r\n", fil, col, name, s);
fclose(f);
printf(" \n \n Comand line entered: \n Number of towers : %d \n Number of discs: : %d \n Output filename : %s \n \n Init time : %s \n \n \n", fil, col, name, s);
// Se imprime el tablero antes de iniciar ningún movimiento:
system("clear");
imprime(tablero, fil, col, ultNum, name, caso, count, 0, 0);
system("sleep 1");
// Se llama a hanoi para comenzar "la partida":
hanoi(tablero, fil, col, col, ultNum, 0, 1, 2, name, caso, count);
f = fopen(name, "a");
fprintf(f, " \r\n \r\n Fin Time : %s", s);
fclose(f);
return (0);
};
を繰り返し避け、ターゲットポインタに -o <ファイルのオープン/リード方法> –
sizeof
を使用します - d <ディスク数> -f[コンパイルできません](http://cpp.sh/67cm)。 [mcve]を投稿してください。 –
''空白のimprime'まで読んで、ぼやけて、 'Puntero a una ...'に続き、読んでいなくなった。私はあなたの母国語であなたのコメントを書こうとする衝動を理解していますが、このような文脈では、その有用性を著しく低下させます。私が翻訳者なしで解読できるコードをガイドなしに、少なくとも最小限ではないことを見て(Kenのコメントを参照)、私はこれを掘り下げていません。建設的な批判としてそれを取る。英語のコメントが優先され、転記する前にこれらの問題が特定されます。 – DevSolar