Foros del Web » Programación para mayores de 30 ;) » C/C++ »

problemón con los punteros

Estas en el tema de problemón con los punteros en el foro de C/C++ en Foros del Web. Tengo el siguiente código, pero no tengo ni idea, necesito entenderlo. Agradecería que alguien me lo explicase y tener los medios necesarios, porque lo único ...
  #1 (permalink)  
Antiguo 16/12/2014, 05:18
 
Fecha de Ingreso: octubre-2012
Ubicación: Murcia
Mensajes: 92
Antigüedad: 11 años, 6 meses
Puntos: 0
Pregunta problemón con los punteros

Tengo el siguiente código, pero no tengo ni idea, necesito entenderlo. Agradecería que alguien me lo explicase y tener los medios necesarios, porque lo único que hago es dar vueltas. Gracias

La cabecera es:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void AñadirAlumno(char **nombre, int *edad, int **notas, int numeroAlumnos);
void MostrarAlumno(char **nombre, int *edad, int **notas, int numeroAlumnos);
void GenerarFichero(char **nombre, int *edad, int **notas, int numeroAlumnos);


y el resto de código:

#include "cabecera.h"

void main(){
char **nombre;
int *años;
int **notas;
int numeroAlumnos=0;
int fin=1;
int opcion;
while(fin==1){
printf("1. Añadir alumno\n");
printf("2. Mostrar alumno\n");
printf("3. Generar Fichero\n");
printf("4. Salir\n");
printf("Elegir opcion\n");
fflush(stdin);
scanf("%i", &opcion);
switch(opcion){
case 1:
printf("Introduce numero de alumnos:\n");
fflush(stdin);
scanf("%i", &numeroAlumnos);
nombre=(char **)malloc(numeroAlumnos*sizeof(char*));
años=(int *)malloc(numeroAlumnos*sizeof(int));
notas=(int **)malloc(numeroAlumnos*sizeof(int *));
for(int i=0;i<numeroAlumnos;i++){
nombre[i]=(char *)malloc(30*sizeof(char));
notas[i]=(int *)malloc(3*sizeof(int));
}
AñadirAlumno(nombre, años, notas, numeroAlumnos);
break;
case 2:
if(numeroAlumnos!=0){
MostrarAlumno(nombre, años, notas, numeroAlumnos);
}else{
printf("No existen alumnos\n");
}
break;
case 3:
GenerarFichero(nombre, años, notas, numeroAlumnos);
break;
case 4:
fin=0;
break;
}
free(años);
for(int i=0;i<numeroAlumnos;i++){
free(nombres[i]);
free(notas[i]);
}
free(nombres);
free(notas);
}
}
void AñadirAlumno(char **nombre, int *edad, int **notas, int numeroAlumnos){
for(int i=0;i<numeroAlumnos;i++){
printf("Introduce nombre\n");
fflush(stdin);
gets(nombre[i]);
printf("Introduce la edad\n");
fflush(stdin);
scanf("%i", &edad[i]);
for(int j=0;j<3;j++){
printf("Introduce las nota %i", j+1);
fflush(stdin);
scanf("%i", &notas[i][j]);
}
/*printf("Introduce las nota 2");
fflush(stdin);
scanf("%i", &notas[i][1]);
printf("Introduce las nota 3");
fflush(stdin);
scanf("%i", &notas[i][2]);*/
}
}
void MostrarAlumno(char **nombre, int *edad, int **notas, int numeroAlumnos){
for(int i=0;i<numeroAlumnos;i++){
printf("Nombre: %s\n", nombre[i]);
printf("Edad: %i\n", edad[i]);
printf("Nota 1: %i Nota 2: %i Nota 3: %i\n", notas[i][0],notas[i][1],notas[i][2]);
}
}
void GenerarFichero(char **nombre, int *edad, int **notas, int numeroAlumnos){
FILE *fichero;
fichero=fopen("Texto.txt","w");
if(fichero!=NULL){
for(int i=0;i<numeroAlumnos;i++){
fprintf(fichero,"Nombre: %s\n", nombre[i]);
fprintf(fichero,"Edad: %i\n", edad[i]);
fprintf(fichero,"Nota 1: %i Nota 2: %i Nota 3: %i\n", notas[i][0],notas[i][1],notas[i][2]);
fprintf(fichero,"Nota media: %f", ((float)notas[i][0]+(float)notas[i][1]+(float)notas[i][2])/3);
fprintf(fichero,"-------------------------------------------------");

}
fclose(fichero);
}
else{
printf("No se ha creado correctamente el fichero\n");
}
}
  #2 (permalink)  
Antiguo 16/12/2014, 06:01
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: problemón con los punteros

Es lo que pasa cuando has pasado de hacer el ejercicio y tiras por el camino fácil, que es pedir a alguien que sí lo ha hecho que te lo pase.

El problema que tiene la programación es que lo de aprenderse las cosas de memoria sirve más bien para poco... puedes aprenderte de memoria la especificación de C en 7 idiomas diferentes, que si no te has pegado con el código no vas a saber hacer ni un triste "hola mundo"... no hablemos ya si el ejercicio tiene lógica de punteros (o punteros dobles, como es tu caso).

Mira, aunque te explicase el código línea por línea y estuviésemos una semana con ello, basta que el profesor te haga una pregunta del tipo "¿Qué pasaría si cambio esto de aquí por esto otro?" o "¿Por qué haces esto antes que esto otro?" o... para que quede claro que no solo no has hecho tu el ejercicio, sino que además no tienes ni idea de lo que estás haciendo. Y ya te adelanto que el abanico de preguntas que te pueden delatar es más amplio que las preguntas del trivial.

Y otra cosa ¿llevas 90 mensajes y 2 años en el foro y no nos tienes el aprecio suficiente como para poner el código con las etiquetas correspondientes para evitar que nos dejemos la vista?

PD.: ¿Crees que soy duro y/o borde? prueba a preguntar esto mismo en stackoverflow y después me cuentas.

Un saludo.
  #3 (permalink)  
Antiguo 16/12/2014, 06:24
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 11 años, 10 meses
Puntos: 49
Respuesta: problemón con los punteros

Cita:
Iniciado por antonio66 Ver Mensaje
Tengo el siguiente código, pero no tengo ni idea, necesito entenderlo. Agradecería que alguien me lo explicase y tener los medios necesarios, porque lo único que hago es dar vueltas. Gracias
Lo primero es lo primero, la función main es de tipo "int" y requiere un return "int" al final de la misma.

Por lo demás, opino como el amigo eferion, ¡que dos años desaprovechados!.

¡¡¡Saluditos!!!

  #4 (permalink)  
Antiguo 17/12/2014, 02:36
 
Fecha de Ingreso: octubre-2012
Ubicación: Murcia
Mensajes: 92
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: problemón con los punteros

se que esta desordenado, pero ¿no podeis intuir algo? ¿ni un triste ejemplo? ¿ningun sitio donde esté explicado? ¿tan importante te crees? No se si eres un borde o no, pero lo de los 2 años estaba de más.
  #5 (permalink)  
Antiguo 17/12/2014, 03:12
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: problemón con los punteros

Cita:
Iniciado por antonio66 Ver Mensaje
se que esta desordenado, pero ¿no podeis intuir algo? ¿ni un triste ejemplo? ¿ningun sitio donde esté explicado?
Pointers

Structs

Cita:
Iniciado por antonio66 Ver Mensaje
¿tan importante te crees?
Francamente, no.

Lo que sucede es que en el foro hay gente, como yo, que intenta aportar su granito de arena ayudando a otros de forma desinteresada. No percibimos ningún tipo de remuneración por ella (quizas es algo que tendemos a hacer mal los que programamos) salvo la satisfacción de haber ayudado a alguien.

Lo que sucede es que esa ayuda no es incondicional ni, por supuesto, obligatoria.

Cuando alguien no se curra absolutamente nada y lo único que pide es que le salvemos el pellejo no nos encontramos ante un caso de "ayudar", sino de "hacer el trabajo". Ese pequeño matiz hace que la situación cambie de forma radical. Yo, por ejemplo, puedo estar dos horas pegándome con un programa de otra persona que tiene un fallo que no soy capaz de localizar... pero no voy a mover un dedo ante alguien cuyo mensaje dice algo del tipo: "Necesito un programa que tiene que hacer ...". Ojo, que no mueva un dedo no quiere decir que no sepa hacerlo... sin vanagloriarme de ello te digo que sé hacer ese programa y cosas bastante más complicadas. Lo que sucede es que, como he comentado, eso es un encargo... y si quieres que te haga un encargo, entonces ten la decencia de pagar por ello.

O si no, cuando vayas a hacer una entrevista de trabajo y te digan que tienes que trabajar gratis los primeros dos años y luego ya se verá si te contratan no te pongas de uñas... tu estás haciendo más o menos lo mismo. Y esto es así tanto si lo quieres entender como si no. Prueba de ello es el número de respuesta que has tenido a tu petición.


Cita:
Iniciado por antonio66 Ver Mensaje
No se si eres un borde o no, pero lo de los 2 años estaba de más.
¿Tu crees?

Veamos, si tu necesitas el favor de alguien, no se, imagínate que, por ejemplo, tienes que comprar un libro para la universidad, tu no puedes hacercarte y se lo tienes que pedir a alguien. ¿Cómo lo haces?

a) Le das el dinero y le pides que se acerque decorándolo con decenas de "por favor"

b) Le das el encargo en una servilleta sucia y le recomiendas que se de prisa.

En el caso del foro, el poner el código sin decorar sería lo más parecido a una servilleta sucia... no destaca, es poco legible, no se tabula correctamente y me obliga a copiarme el código en un editor para poder leer tu código sin dejarme la vista.

Desde que creaste tu cuenta han pasado dos años, creo que es tiempo más que suficiente para que una persona cualquiera sepa familiarizarse con el editor de mensajes... Si esto fuese un foro de, por ejemplo, moda, podría entender que no tuvieses ni idea de usar un ordenador... pero estamos hablando de programación y ahí no hay excusas que valgan... no puedes pretender, salvo que seas político, que algo que no eres capaz de entender ni manejar te de comer.

Es simple cuestión de respeto... nos estás pidiendo un favor y lo mínimo que debes hacer es facilitarnos un poco la vida porque, te repito, no cobramos por ello (pídele tu a un contable que te asesore gratis para pagar menos en la declaración de la renta y me cuentas).

Y dicho esto te digo: Haz tu el ejercicio, ten tus propias dudas, plantéalas en el foro y puede que sea el primero en responderte... y lo haré encantado. En cambio, si quieres que dedique mi tiempo a explicarte ese programa que tu no has hecho, podemos empezar a hablar de tarifas y si llegamos a un acuerdo te ayudaré en todo lo que pueda.

Un saludo.
  #6 (permalink)  
Antiguo 17/12/2014, 03:53
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: problemón con los punteros

¿Por que usas ñ en las declaraciones de funciones y variables? No se puede usar XDD
  #7 (permalink)  
Antiguo 17/12/2014, 05:13
 
Fecha de Ingreso: octubre-2012
Ubicación: Murcia
Mensajes: 92
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: problemón con los punteros

entonces ya me tienes fichao, me tienes mania, puto friki
  #8 (permalink)  
Antiguo 17/12/2014, 05:39
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: problemón con los punteros

Cita:
Iniciado por antonio66 Ver Mensaje
entonces ya me tienes fichao, me tienes mania...
Aunque ganas me entran no me voy a rebajar a tu mismo nivel para insultarte.

Me voy a limitar a contarte una serie de verdades:

  • No te tengo manía, eso lo has dicho tú y no se muy bien a qué viene.
  • Si te has metido en un curso donde dan programación es porque así lo has querido. Se entiende entonces que te gusta programar y que, incluso, puede que hasta te agrade la idea de ganarte la vida con ello. Entonces, ¿Por qué no te esfuerzas lo más mínimo por aprender?
  • Si, en base a lo anterior, no haces alguno de los ejercicios y te acaba pillando el toro, la responsabilidad es únicamente tuya. Aquí todos somos mayorcitos y tenemos que apechugar con las consecuencias de nuestras acciones.
  • Las aportaciones que se hacen en el foro son desinteresadas pero no obligatorias, no puedes exigir a nadie que te responda. Si te muestras humilde la gente estará más dispuesta a ayudarte.
  • ¿Te tengo fichado? te lo he dejado bien claro, haz tu el ejercicio, plantea tus propias dudas y te responderé encantado... eso no casa para nada con tenerte fichado ¿Será que no te has molestado en leer lo que he puesto?
  • Insultando no vas a llegar a ninguna parte ni tampoco te vas a granjear demasiadas amistades en este tipo de foros
Y para terminar:

  • ¿Ves que alguien te haya dado alguna respuesta positiva a tu pregunta? no, ¿verdad? empieza a asimilar el hecho de que lo mismo mis palabras tienen algo de razón... yo no puedo borrar mensajes de otros usuarios. Si no hay respuestas es porque pasan de hacerte el trabajo por la cara.
Un saludo.
  #9 (permalink)  
Antiguo 17/12/2014, 09:01
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: problemón con los punteros

¿puto friki? ¿A quien dices eso?
Pegas un código de ciento y pico lineas sin identar no explicas que le pasa al código y nos llamas "puto friky". ¿De que vas hombre?
  #10 (permalink)  
Antiguo 17/12/2014, 13:56
Avatar de cursillosonline  
Fecha de Ingreso: diciembre-2014
Mensajes: 4
Antigüedad: 9 años, 4 meses
Puntos: 1
Respuesta: problemón con los punteros

Bueno, todo el código identado esta aquí.

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. void AñadirAlumno(char **nombre, int *edad, int **notas, int numeroAlumnos);
  6. void MostrarAlumno(char **nombre, int *edad, int **notas, int numeroAlumnos);
  7. void GenerarFichero(char **nombre, int *edad, int **notas, int numeroAlumnos);
  8.  
  9. void main() {
  10.     char **nombre;
  11.     int *años;
  12.     int **notas;
  13.     int numeroAlumnos=0;
  14.     int fin=1;
  15.     int opcion;
  16.    
  17.     while(fin == 1) {
  18.         printf("1. Añadir alumno\n");
  19.         printf("2. Mostrar alumno\n");
  20.         printf("3. Generar Fichero\n");
  21.         printf("4. Salir\n");
  22.         printf("Elegir opcion\n");
  23.         fflush(stdin);
  24.         scanf("%i", &opcion);
  25.        
  26.         switch(opcion) {
  27.             case 1:
  28.                 printf("Introduce numero de alumnos:\n");
  29.                 fflush(stdin);
  30.                 scanf("%i", &numeroAlumnos);
  31.                 nombre = (char **)malloc(numeroAlumnos*sizeof(char*));
  32.                 años = (int *)malloc(numeroAlumnos*sizeof(int));
  33.                 notas = (int **)malloc(numeroAlumnos*sizeof(int *));
  34.                
  35.                 for(int i = 0; i < numeroAlumnos; i++) {
  36.                     nombre[i] = (char *)malloc(30*sizeof(char));
  37.                     notas[i] = (int *)malloc(3*sizeof(int));
  38.                 }
  39.                
  40.                 AñadirAlumno(nombre, años, notas, numeroAlumnos);
  41.                 break;
  42.             case 2:
  43.                 if(numeroAlumnos != 0) {
  44.                     MostrarAlumno(nombre, años, notas, numeroAlumnos);
  45.                 } else {
  46.                     printf("No existen alumnos\n");
  47.                 }
  48.                 break;
  49.             case 3:
  50.                 GenerarFichero(nombre, años, notas, numeroAlumnos);
  51.                 break;
  52.             case 4:
  53.                 fin = 0;
  54.                 break;
  55.             }
  56.            
  57.         free(años);
  58.            
  59.         for(int i = 0; i < numeroAlumnos; i++) {
  60.             free(nombres[i]);
  61.             free(notas[i]);
  62.         }
  63.            
  64.         free(nombres);
  65.         free(notas);
  66.     }
  67. }
  68.  
  69. void AñadirAlumno(char **nombre, int *edad, int **notas, int numeroAlumnos) {
  70.     for(int i = 0; i < numeroAlumnos; i++) {
  71.         printf("Introduce nombre\n");
  72.         fflush(stdin);
  73.         gets(nombre[i]);
  74.         printf("Introduce la edad\n");
  75.         fflush(stdin);
  76.         scanf("%i", &edad[i]);
  77.        
  78.         for(int j = 0; j < 3; j++){
  79.             printf("Introduce las nota %i", j+1);
  80.             fflush(stdin);
  81.             scanf("%i", &notas[i][j]);
  82.         }
  83. /*printf("Introduce las nota 2");
  84. fflush(stdin);
  85. scanf("%i", &notas[i][1]);
  86. printf("Introduce las nota 3");
  87. fflush(stdin);
  88. scanf("%i", &notas[i][2]);*/
  89.     }
  90. }
  91.  
  92. void MostrarAlumno(char **nombre, int *edad, int **notas, int numeroAlumnos) {
  93.     for(int i = 0; i < numeroAlumnos; i++) {
  94.         printf("Nombre: %s\n", nombre[i]);
  95.         printf("Edad: %i\n", edad[i]);
  96.         printf("Nota 1: %i Nota 2: %i Nota 3: %i\n", notas[i][0],notas[i][1],notas[i][2]);
  97.         }
  98. }
  99.  
  100. void GenerarFichero(char **nombre, int *edad, int **notas, int numeroAlumnos) {
  101.     FILE *fichero;
  102.     fichero = fopen("Texto.txt","w");
  103.    
  104.     if(fichero != NULL) {
  105.         for(int i = 0; i < numeroAlumnos; i++) {
  106.             fprintf(fichero, "Nombre: %s\n", nombre[i]);
  107.             fprintf(fichero, "Edad: %i\n", edad[i]);
  108.             fprintf(fichero, "Nota 1: %i Nota 2: %i Nota 3: %i\n", notas[i][0],notas[i][1],notas[i][2]);
  109.             fprintf(fichero, "Nota media: %f", ((float)notas[i][0]+(float)notas[i][1]+(float)notas[i][2])/3);
  110.             fprintf(fichero, "-------------------------------------------------");
  111.         }
  112.        
  113.     fclose(fichero);
  114.     } else {
  115.         printf("No se ha creado correctamente el fichero\n");
  116.     }
  117. }

Fallas que veo

1.- Uso de ñ.

Ni el lenguaje ni ningún compilador de C que conozca soporta la ñ.

2.- void main()

En algunos compiladores antiguos se permitia el retornar void en la función main, pero eso nunca a sido parte del estándar de C, asi que usa int main().

3.- nombres

Nunca definiste una variable declarada "nombres", remplazalo por "nombre".

4.- fflush(stdin)

El fflush fue hecho con la intención de limpiar el buffer de salida, no el de entrada, por lo que "fflush(stdin);" tiene un comportamiento indefinido.

5.- default:

Te falta el default del switch, en caso de que se ingrese una opción erronea.

Aparte de eso tienes un problema por la forma en que manejas tus arreglos que te genera un segmentation fault, la verdad me dio flojera ver ese tema, pero ya te di un empujón.

Última edición por cursillosonline; 17/12/2014 a las 14:11
  #11 (permalink)  
Antiguo 18/12/2014, 23:51
Avatar de floppy-dj  
Fecha de Ingreso: diciembre-2006
Ubicación: Huelva
Mensajes: 25
Antigüedad: 17 años, 4 meses
Puntos: 0
Respuesta: problemón con los punteros

No le metáis mas caña al pobre que ya tiene suficiente con suspender programación.

Pero vamos Antonio, si te pones una semana 4 o 5 horas cada día mínimo al final llegas al nivel de ese ejercicio, eso si, haz descansos, la programación embota mucho. :)

Etiquetas: dobles, estructuras, punteros
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:07.