Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - David8

#31
Cita de: amchacon en 10 Abril 2014, 13:57 PM
Si, cuando ya lo tengas inicializado.

Los arrays variables mejor con malloc por cierto.

Hice lo que me dijiste y el código me queda así:


#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>

#define TAMANIO 10

int verificarEntrada(const char *ptrX);

int verificarEntrada(const char *ptrX)
{
for(; *ptrX != '\0'; ptrX++){
if(isdigit(*ptrX) == 0){
puts("->Entrada no permitida.");
return 0;
}
}

return 1;
}

int main(void)
{
char nAlumnos[TAMANIO];
int alumnos;
int longitud;
int x;   // valor que devuelve la función verificarEntrada()
int i;

do{
printf("Numero de alumnos: ");

fgets(nAlumnos, TAMANIO, stdin);   // si introducimos 9 o más caracteres se produce OVERFLOW en el buffer

longitud = strlen(nAlumnos);

if(nAlumnos[longitud-1] == '\n'){   // si la cadena tiene una longitud menor a TAMANIO-1 evitamos la "impresión de '\n'
nAlumnos[longitud-1] = '\0';
}

x = verificarEntrada(nAlumnos);

puts("");

if(x == 1){
alumnos = atoi(nAlumnos);
}

} while(x == 0);

char *notas = malloc(alumnos * sizeof (char));
int notasEnteras[alumnos];

for (i=0; i<alumnos; i++){

do{
notas[i] = malloc(TAMANIO * sizeof (char));

      printf("Nota alumno %d : ", i + 1);
        scanf("%[^\n]", notas[i]);
       
        while(getchar() != '\n');
       
        x = verificarEntrada(notas[i]);

if(x == 1){
int n = atoi(notas[i]);

if(n < 0 || n > 10){   // cada nota debe estar comprendida en el intervalor [0, 10]
x = 0;
}
else{
notasEnteras[i] = atoi(notas[i]);
}
}

} while(x == 0);
   }


return EXIT_SUCCESS;
}


También puse los printf y todo va bien hasta que entra en el for, que no pasa de:
scanf("%[^\n]", notas[i]);

Aquí pongo los mensajes que me deja el compilador (los  que no he conseguido solucionar):
Citar
In function 'main':
57 13 [Warning] assignment makes integer from pointer without a cast [enabled by default]
60 10 [Warning] passing argument 1 of 'fgets' makes pointer from integer without a cast [enabled by default]
354 39 c:\program files (x86)\dev-cpp\mingw32\include\stdio.h expected 'char *' but argument is of type 'char'
64 10 [Warning] passing argument 1 of 'verificarEntrada' makes pointer from integer without a cast [enabled by default]
10 5 expected 'const char *' but argument is of type 'char'
67 5 [Warning] passing argument 1 of 'atoi' makes pointer from integer without a cast [enabled by default]
304 37 c:\program files (x86)\dev-cpp\mingw32\include\stdlib.h expected 'const char *' but argument is of type 'char'
73 6 [Warning] passing argument 1 of 'atoi' makes pointer from integer without a cast [enabled by default]
304 37 c:\program files (x86)\dev-cpp\mingw32\include\stdlib.h expected 'const char *' but argument is of type 'char'

No quiero la solución en código del problema si no una pista de lo que pudiese estar fallando.

Un saludo.
#32
Cita de: amchacon en 10 Abril 2014, 13:57 PM
Si, cuando ya lo tengas inicializado.

Los arrays variables mejor con malloc por cierto.


int v;
char *notas[v] = malloc(alumnos * sizeof (char));


Así?
#33
Cita de: amchacon en 10 Abril 2014, 13:35 PM
Te lo he dicho, tienes que averiguar en que línea te da el problema.

Hazme caso y pon printfs cada 3-4 líneas de código:

Código (cpp) [Seleccionar]

int main(void)
{
       printf("1 - Inicio \n");
char nAlumnos[TAMANIO];
int alumnos;
int longitud;
int x;   // valor que devuelve la función verificarEntrada()
int i;
char *notas[alumnos];
int notasEnteras[alumnos];
       
       printf("2 - Tras declarar las variables \n");

       // Etc...


Solo tienes que ver el último printf que escribes, y sabrás por donde falla (da igual que te salga error de Windows, los printfs los veras igual).

PD: Por cierto, usas la variable "alumnos" pero no está inicializada.


Probaré lo de los prints.

Respecto a lo de alumnos, si quiero usar correctamente
char *notas[alumnos];
int notasEnteras[alumnos];

debería de declararlos una vez que tenga alumnos definido no? Es decir, antes del for)

Muchas gracias y un saludo
#34
Uso el dev c++
Pero el problema es que no ejecuta nada, es decir, doy a compilar y bien, pero al ejecutar en cuanto aparece la consola sale un mensaje de error de Windows

No ves nada que pueda estar mal en el código? Estoy casi seguro de que falla en alguna parte dentro del for, pero no sé el qué...

Un saludo
#35
Muy buenas de nuevo. Estoy haciendo un programa ( muy básico ) en el que se debe introducir un número de alumnos, luego pedir una calificación a cada uno en el intervalo [0, 10], y por último clasificar el número de aprobados, notables, etc. TODO CON ENTEROS.
De momento llevo lo siguiente:


#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>

#define TAMANIO 10

int verificarEntrada(const char *ptrX);

int verificarEntrada(const char *ptrX)
{
for(; *ptrX != '\0'; ptrX++){
if(isdigit(*ptrX) == 0){
puts("->Entrada no permitida.");
return 0;
}
}

return 1;
}

int main(void)
{
char nAlumnos[TAMANIO];
int alumnos;
int longitud;
int x;   // valor que devuelve la función verificarEntrada()
int i;
char *notas[alumnos];
int notasEnteras[alumnos];


do{
printf("Numero de alumnos: ");

fgets(nAlumnos, TAMANIO, stdin);   // si introducimos 9 o más caracteres se produce OVERFLOW en el buffer

longitud = strlen(nAlumnos);

if(nAlumnos[longitud-1] == '\n'){   // si la cadena tiene una longitud menor a TAMANIO-1 evitamos la "impresión de '\n'
nAlumnos[longitud-1] = '\0';
}

x = verificarEntrada(nAlumnos);

puts("");

if(x == 1){
alumnos = atoi(nAlumnos);
}

} while(x == 0);

for (i = 0; i < alumnos; i++){
do{
notas[i] = malloc (TAMANIO * sizeof (char));

      printf("Nota alumno %d : ", i + 1);
      scanf("%[^\n]", notas[i]);
      while(getchar() != '\n');
     
      x = verificarEntrada(notas[i]);

if(x == 1){
int n = atoi(notas[i]);

if(n < 0 || n > 10){   // cada nota debe estar comprendida en el intervalor [0, 10]
x = 0;
}
else{
notasEnteras[i] = atoi(notas[i]);
}
}

} while(x == 0);
  }


return EXIT_SUCCESS;
}


El problema es que compila pero en cuanto se abre la consola se termina el proceso.
No encuentro que puede estar mal.
Agradecería mucho indicaciones de cómo mejorar un poco el código (ya que lo veo un poco desastroso, sobre todo en la declaración de variables  ;D )

Gracias.
#36
Efectivamente como dices si intento modificar la variable declarada con const con un valor previamente ya almacena me da error (lo que no sé es si tengo el compilador en modo estricto, supongo que no). Lo que pasa es que me parece que entendí mal lo que me dijiste. Interpreté que si ponías por ejemplo:

const cadena[tamanio];

Y luego le asignabas un valor debía de dar un error, (si la asignación ocurre solo una vez sin tener cadena ningún valor previo).
Por eso digo que es culpa mía de no haberlo interpretado bien.

Un saludo
#37
Muchas gracias a los dos  :D
#38
Eso quería decir. Es que según me lo puso rir3760 entendí que al momento de declararlo como const ya quedaba invariable aún sin tener ningún valor almacenado. Pero me resultaba raro ya que "obviamente" funciona.

Un saludo
#39
Hice unos pequeños cambios en la función fBuscar y me funciona.
Pero no entiendo porque no puedo declarar a "tamanio" como const. El compilador no me da ningún warning y si me deja escribir en el ( la primera vez, lo he comprobado imprimiendo el  valor).

Gracias por los consejos, lo del fin de archivo creía que solo se ponía cuando se trabaja con ellos.

Un saludo  :D
#40
Tengo que hacer un programa que verifique si una cadena se encuentra dentro de otra ( sin usar la función strstr() ). Este es el código:


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

short int fBuscar(char *ptrX, char *ptrY, short int longitud);   // prototipo función fBuscar

short int fBuscar(char *ptrX, char *ptrY, short int longitud)
{
short int contador1 = 0;
short int contador2 = 0;
char *ptrZ = ptrY;   // usamos ptrZ como una variable auxiliar que almacena la dirección en memoria de cadenaABuscar[0]

for(; *ptrX != '\0'; ptrX++){

if(*ptrX == *ptrY){
contador1++;
contador2++;
ptrY++;   // ptrY apunta a la siguiente posición de memoria

if(contador1 == longitud){
return (contador2 - longitud);
}
}
else{
ptrY = ptrZ;
contador1 = 0;
contador2++;
}
}

return (-1);   // si se llega hasta aquí no se ha encontrado la cadenaABuscar en cademaOriginal
}

int main(void)
{
const short int tamanio;
int c;
printf("Definir tama%co aproximado de la cadena: ", 164);
scanf("%d", &tamanio);

while((c = getchar()) != '\n');   // limpieza del buffer

char cadenaOriginal[tamanio];   // cadena donde vamos a buscar
char cadenaABuscar[tamanio];   // cadena de caracteres que queremos ver si se encuentra en cadenaOriginal
short int longitud;
short int x;   // el valor de x verifica si la cadenaABuscar se encuentra en cadenaOriginal

puts("\nIntroducir cadena donde se quiere buscar:");
fgets(cadenaOriginal, tamanio, stdin);

puts("\nIntroducir cadena que queremos buscar:");
fgets(cadenaABuscar, tamanio, stdin);

longitud = strlen(cadenaABuscar) - 1;   // evitamos contar el caracter '\n' que almacena fgets()

x = fBuscar(cadenaOriginal, cadenaABuscar, longitud);

if(x == -1){
puts("Cadena no contenida");
}
else{
puts("Cadena no contenida");
printf("Encontrada en la posicion %d", x+1);
}

return EXIT_SUCCESS;
}



El problema es que al introducir por ejemplo hhola y después hola me da error porque de las h los punteros ptrX y ptrY saltan a la h y la o respectivamente.
No sé como arreglarlo. (SEGURAMENTE HAYA MÁS FALLOS)

Gracias