Martes 17 de Diciembre de 2024, 11:56
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Problema con un programa
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Problema con un programa (Leído 1527 veces)
tonimekan
Nuevo Miembro
Mensajes: 3
Problema con un programa
«
en:
Viernes 17 de Abril de 2009, 09:35 »
0
hola, mi problema es el siguiente, yo introduzco por teclado alumnos y notas, y el programa me devuelve los alumnos que hay, las notas, la mejor nota y el mejor alumno, la peor nota y el peor alumno y la nota media.cuando quiero imprimir por pantalla los nombres y notas de los alumnos, solo me imprime uno, el ultimo, aqui dejo todo el codigo y en un rar todo el workspace, estoy programando en visual basic 6.0, y el programa tiene como argumentos el nombre del grupo y el numero de alumnos que se quieren introducir.
Esto es el programa principal
Código: C++
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "alumnos.h"
#include "grupos.h"
#include "miString.h"
#include "tipos.h"
int
main
(
int
argc,
char
*
argv
[
]
)
/*como argumentos este programa tiene el nombre y el numero de alumnos*/
{
char
nom
[
MAX_NOM
]
;
int
num, i
;
alumno aux
;
grupo grup
;
if
(
argc
!
=
3
)
/*control de errores*/
return
-
1
;
fflush
(
stdin
)
;
/*limpio el buffer*/
if
(
sscanf
(
argv
[
1
]
,
"%s"
, nom
)
!
=
1
)
return
-
2
;
if
(
sscanf
(
argv
[
2
]
,
"%d"
,
&
num
)
!
=
1
)
return
-
2
;
printf
(
"%s %dn"
, nom, num
)
;
iniGrupo
(
&
grup, nom
)
;
/*inicializo llmando a la función*/
for
(
i
=
0
;
i
<
2
;
++
i
)
{
leeAlumno
(
&
aux
)
;
addAlumnoGrupo
(
aux,
&
grup
)
;
}
calculaNotas
(
&
grup
)
;
/*calculo las notas, media, mejor, peor*/
printGrupo
(
&
grup
)
;
/*imprimo por pantalla todos los datos*/
return
1
;
}
Aquí dejo las funciones de alumnos.c
Código: C++
#include <stdio.h>
#include <stdlib.h>
#include "alumnos.h"
#include "tipos.h"
#include "miString.h"
/*=== Funciones =============================================================*/
/*-----------------------------------------------------------------------------
Nombre: leeAlumno
Descripción: la función pide el nombre del alumno y su nota,y se lee.
Argumentos de entrada: (Enumeración de los argumentos por orden de aparición en
el prototipo indicando para que sirven)
se pide por pantalla en nombre y nota
Retorno: (Enumeración de los valores que puede devolver la función indicando en
que circunstancias)
- OK, si se ha terminado sin problemas
-----------------------------------------------------------------------------*/
status leeAlumno
(
alumno
*
al
)
{
fflush
(
stdin
)
;
printf
(
"Escriba el nombre del alumnon"
)
;
scanf
(
"%s"
,al
-
>
nombre
)
;
/*scanf("%s", (*al).nombre); => es lo mismo*/
do
{
printf
(
"Escriba la nota del alumnon"
)
;
scanf
(
"%f"
,
&
al
-
>
nota
)
;
}
while
(
(
al
-
>
nota
>=
10
)
||
(
al
-
>
nota
<=
0
)
)
;
/*control de errores*/
return
OK
;
}
/*-----------------------------------------------------------------------------
Nombre: getAlumnoNota
Descripción: Conocer la nota del alumno: quien llame a esta función desea conocer la nota del alumno,
por lo que esta función debe devolver dicha nota.
Argumentos de entrada: (Enumeración de los argumentos por orden de aparición en
el prototipo indicando para que sirven)
1. al, es el alumno
Retorno: (Enumeración de los valores que puede devolver la función indicando en
que circunstancias)
- Devuelve la nota
-----------------------------------------------------------------------------*/
float
getAlumnoNota
(
alumno
*
al
)
{
return
al
-
>
nota
;
}
/*-----------------------------------------------------------------------------
Nombre: getAlumnoNombre
Descripción: Conocer el nombre del alumno: quien llame a esta función desea conocer el nombre del alumno,
por lo que esta función debe devolver dicho nombre.
Argumentos de entrada: (Enumeración de los argumentos por orden de aparición en
el prototipo indicando para que sirven)
1. al, es el alumno
Retorno: (Enumeración de los valores que puede devolver la función indicando en
que circunstancias)
- Devuelve el nombre
-----------------------------------------------------------------------------*/
char
*
getAlumnoNombre
(
alumno
*
al
)
{
return
al
-
>
nombre
;
}
/*-----------------------------------------------------------------------------
Nombre: printAlumno
Descripción: Imprimir datos de un alumno: se mostrarán por pantalla
Argumentos de entrada: (Enumeración de los argumentos por orden de aparición en
el prototipo indicando para que sirven)
al, que es el alumno
Retorno: (Enumeración de los valores que puede devolver la función indicando en
que circunstancias)
- OK, si se ha terminado sin problemas
-----------------------------------------------------------------------------*/
status printAlumno
(
alumno
*
al
)
{
printf
(
"Nombre del alumno: %s ,con nota: %.2fn"
,getAlumnoNombre
(
al
)
,getAlumnoNota
(
al
)
)
;
return
OK
;
}
/*-----------------------------------------------------------------------------
Nombre: alumnoCmp
Descripción: Comparar dos alumnos: serán iguales si su nombre es el mismo, sean cuales sean sus notas,
y distintos si difieren en el nombre.
Argumentos de entrada: (Enumeración de los argumentos por orden de aparición en
el prototipo indicando para que sirven)
2 alumnos, al1 y al2
Retorno: (Enumeración de los valores que puede devolver la función indicando en
que circunstancias)
- devuelve la comparacion de 2 alumnos.
-----------------------------------------------------------------------------*/
int
alumnoCmp
(
alumno
*
al1, alumno
*
al2
)
{
return
myStrcmp
(
al1
-
>
nombre,al2
-
>
nombre
)
;
}
/*-----------------------------------------------------------------------------
Nombre: alumnoCopy
Descripción: Copiar datos de un alumno a otro
Argumentos de entrada: (Enumeración de los argumentos por orden de aparición en
el prototipo indicando para que sirven)
1. al1, alumno 1
2. al2, alumno 2
Retorno: (Enumeración de los valores que puede devolver la función indicando en
que circunstancias)
- al1, devuelve el alumno primero.
-----------------------------------------------------------------------------*/
alumno
*
alumnoCopy
(
alumno
*
al1, alumno
*
al2
)
{
myStrcpy
(
al1
-
>
nombre,al2
-
>
nombre
)
;
al1
-
>
nota
=
al2
-
>
nota
;
return
al1
;
}
aquí las funciones de grupos.c
Código: C++
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "grupos.h"
#include "alumnos.h"
#include "tipos.h"
#include "miString.h"
/*=== Funciones =============================================================*/
/*-----------------------------------------------------------------------------
Nombre: iniGrupo
Descripción: inicializa todos los campos.
Retorno: (Enumeración de los valores que puede devolver la función indicando en
que circunstancias)
- OK, si se ha terminado sin problemas
- ERROR en caso contrario.
-----------------------------------------------------------------------------*/
status iniGrupo
(
grupo
*
a,
char
*
nombre
)
{
if
(
a
==
NULL
)
return
ERROR
;
myStrcpy
(
a
-
>
nombregrup, nombre
)
;
a
-
>
mejornota
=
0
;
a
-
>
peornota
=
10
;
a
-
>
notamedia
=
0
;
a
-
>
mejoralum
=
NULL
;
a
-
>
peoralum
=
NULL
;
return
OK
;
}
/*-----------------------------------------------------------------------------
Nombre: estaAlumnoGrupo
Descripción: Comprueba si esta el alumno en un grupo.
Retorno: (Enumeración de los valores que puede devolver la función indicando en
que circunstancias)
- TRUE o FALSE
/*--------------------------------------------------------------------------------*/
boolean estaAlumnoGrupo
(
alumno
*
al, grupo
*
gr
)
{
int
i
=
0
;
for
(
i
=
0
;
i
<
MAX_ALUM
;
i
++
)
{
if
(
(
myStrcmp
(
gr
-
>
clase
[
i
]
.
nombre
,al
-
>
nombre
)
)
==
0
)
return
TRUE
;
}
return
FALSE
;
}
/*-----------------------------------------------------------------------------
Nombre: grupoLleno
Descripción: Comprueba que el grupo no esté lleno.
Retorno: (Enumeración de los valores que puede devolver la función indicando en
que circunstancias)
TRUE, si el grupo lleno, FALSE en caso contrario
-----------------------------------------------------------------------------*/
boolean grupoLleno
(
grupo
*
gr
)
{
if
(
gr
-
>
numalum
==
MAX_ALUM
)
return
TRUE
;
return
FALSE
;
}
/*=== Funciones =============================================================*/
/*-----------------------------------------------------------------------------
Nombre: grupoVacio
Descripción: Comprueba si el grupo está vacio.
Argumentos de entrada: (Enumeración de los argumentos por orden de aparición en
el prototipo indicando para que sirven)
1. nmr, número entero para pasar ...
2. cdn, puntero a una cadena de caracteres para...
Retorno: (Enumeración de los valores que puede devolver la función indicando en
que circunstancias)
TRUE, si está vacío, FALSE en caso contrario
-----------------------------------------------------------------------------*/
boolean grupoVacio
(
grupo
*
gr
)
{
if
(
gr
-
>
numalum
==
0
)
return
TRUE
;
return
FALSE
;
}
/*-----------------------------------------------------------------------------
Nombre: addAlumnoGrupo
Descripción: Añade un alumno al grupo.
Retorno: (Enumeración de los valores que puede devolver la función indicando en
que circunstancias)
- Comprueba que no esté lleno.
- OK, si se ha terminado sin problemas
-ERROR, si ha habido problemas
-----------------------------------------------------------------------------*/
status addAlumnoGrupo
(
alumno al, grupo
*
gr
)
{
int
i,num
=
2
;
gr
-
>
numalum
=
num
;;
///////////////////////////////////////////////AQUI HAY QUE IGUALAR AL Nº INTRODUCIDO COMO ARGUMENTOS/////////////////////////7
if
(
grupoLleno
(
gr
)
==
TRUE
)
return
ERROR
;
else
if
(
(
estaAlumnoGrupo
(
&
al, gr
)
)
==
TRUE
)
/*como al no es un puntero, hay que ponerle & para que le llegue como puntero*/
return
ERROR
;
else
{
for
(
i
=
0
;
i
<=
(
gr
-
>
numalum
)
;
i
++
)
{
fflush
(
stdin
)
,
strcpy
(
gr
-
>
clase
[
i
]
.
nombre
, al.
nombre
)
;
gr
-
>
clase
[
i
]
.
nota
=
al.
nota
;
}
return
OK
;
}
/*fin del else*/
}
/*-----------------------------------------------------------------------------
Nombre: calculaNotas
Descripción: Calcula las notas de los alumnos.
Retorno: (Enumeración de los valores que puede devolver la función indicando en
que circunstancias)
-Comprueba que el grupo no esté vacío.
- OK, si se ha terminado sin problemas
- ERROR en caso contrario.
-----------------------------------------------------------------------------*/
status calculaNotas
(
grupo
*
gr
)
{
int
i
=
0
;
float
aux
=
0
;
if
(
(
grupoVacio
(
gr
)
)
==
TRUE
)
return
ERROR
;
for
(
i
=
0
;
i
<
(
gr
-
>
numalum
)
;
i
++
)
{
aux
+
=
gr
-
>
clase
[
i
]
.
nota
;
if
(
gr
-
>
clase
[
i
]
.
nota
>
gr
-
>
mejornota
)
{
gr
-
>
mejornota
=
gr
-
>
clase
[
i
]
.
nota
;
gr
-
>
mejoralum
=
&
(
gr
-
>
clase
[
i
]
)
;
}
/*fin del if*/
if
(
gr
-
>
clase
[
i
]
.
nota
<
gr
-
>
peornota
)
{
gr
-
>
peornota
=
gr
-
>
clase
[
i
]
.
nota
;
gr
-
>
peoralum
=
&
(
gr
-
>
clase
[
i
]
)
;
}
/*fin del if*/
}
/*fin del for*/
aux
/
=
gr
-
>
numalum
;
gr
-
>
notamedia
=
aux
;
return
OK
;
}
/*-----------------------------------------------------------------------------
Nombre: printGrupo
Descripción: Imprime por pantalla todo el grupo.
Retorno: (Enumeración de los valores que puede devolver la función indicando en
que circunstancias)
- OK, si se ha terminado sin problemas
- ERROR en caso contrario.
- Comprueba que el grupo no este vacío.
-----------------------------------------------------------------------------*/
status printGrupo
(
grupo
*
gr
)
{
int
i
;
if
(
(
grupoVacio
(
gr
)
)
==
TRUE
)
/*control de errores*/
return
ERROR
;
printf
(
"Nombre del grupo: %sn"
, gr
-
>
nombregrup
)
;
printf
(
"Numero de alumnos: %dn"
, gr
-
>
numalum
)
;
for
(
i
=
0
;
i
<
(
gr
-
>
numalum
)
;
i
++
)
printAlumno
(
&
gr
-
>
clase
[
i
]
)
;
printf
(
"Mejor nota: %.2f: , alumno: %s n"
, gr
-
>
mejornota,gr
-
>
mejoralum
)
;
printf
(
"Peor nota: %.2f: , alumno: %s n"
, gr
-
>
peornota,gr
-
>
peoralum
)
;
printf
(
"Nota media: %.2fn"
, gr
-
>
notamedia
)
;
return
OK
;
}
y aqui alumnos.h, solo la estructura
Código: C++
typedef
struct
ALUMNO
{
char
nombre
[
MAX_NOM
]
;
float
nota
;
}
alumno
;
y aqui grupos.h
Código: C++
typedef
struct
GRUPO
{
char
nombregrup
[
MAX_NOM
]
;
int
numalum
;
alumno clase
[
MAX_ALUM
]
,
*
mejoralum,
*
peoralum
;
float
notamedia,mejornota,peornota
;
}
grupo
;
Muchas gracias por vuestra ayuda
Tweet
m0skit0
Miembro de PLATA
Mensajes: 2337
Nacionalidad:
Re: Problema con un programa
«
Respuesta #1 en:
Viernes 17 de Abril de 2009, 10:01 »
0
Vale, muy bien, pero ¿cuál es el problema?
Cita de: "tonimekan"
estoy programando en visual basic 6.0
Supongo que querrás decir Visual C++ 6.0...
Fr33k K0mpu73r
tonimekan
Nuevo Miembro
Mensajes: 3
Re: Problema con un programa
«
Respuesta #2 en:
Viernes 17 de Abril de 2009, 10:04 »
0
el problema es que cuando yo quiero imprimir por pantalla el nombre de los alumnos y sus notas, solo me imprime uno, independientemente de los alumnos que yo introduzca por teclado. ese es uno.
y otro es: como argumentos del programa tiene el nombre del grupo(clase) y el numero de alumnos que se quiere introducir, pues la cosa es que el numero de alumnos se guarda en argv[2], y luego intento sacar lo que hay ahí dentro y no se como hacerlo para llevar ese valor a una función.
si. llevas razón, es visual basic 6.0 c++ xD
m0skit0
Miembro de PLATA
Mensajes: 2337
Nacionalidad:
Re: Problema con un programa
«
Respuesta #3 en:
Viernes 17 de Abril de 2009, 10:50 »
0
¿Por qué usas
sscanf()
?
strcpy()
y
atoi()
vienen mejor, creo...
Código: C
strcpy
(
nom
,
argv
[
1
]
)
;
num
=
atoi
(
argv
[
2
]
)
;
Prueba ahora pasando num como argumento a
addAlumnoGrupo()
y me dices qué tal.
Por cierto,
boolean
es un tipo de datos de C++, no de C. Ojito con esto. De todas formas haces una programación en C muy orientada a objetos. ¿Por qué no usas C++ directamente?
Fr33k K0mpu73r
tonimekan
Nuevo Miembro
Mensajes: 3
Re: Problema con un programa
«
Respuesta #4 en:
Viernes 17 de Abril de 2009, 14:24 »
0
pero la función addAlumnoGrupo() recibe como argumentos un dato de tipo alumno, y un puntero de tipo grupo no? entonces como el paso num? que se supone que num es un int
Gracias
m0skit0
Miembro de PLATA
Mensajes: 2337
Nacionalidad:
Re: Problema con un programa
«
Respuesta #5 en:
Lunes 20 de Abril de 2009, 11:31 »
0
¿No le puedes añadir parámetros o qué?
Fr33k K0mpu73r
F_Tanori
Moderador
Mensajes: 1919
Nacionalidad:
Re: Problema con un programa
«
Respuesta #6 en:
Lunes 20 de Abril de 2009, 12:14 »
0
Antes de ..
Código: C
iniGrupo
(
&
grup
,
nom
)
;
deberias colocar el numero no?
Código: C
grup
->
numalum
=
num
;
iniGrupo
(
&
grup
,
nom
)
;
o tener el metodo que lo inicialice
Código: C
setNum
(
&
grup
,
num
)
Ahora lo que esta muy raro es en la funcion addAlumnoGrupo cada vez que agregas un alumno al grupo, le dices que la cantidad de alumnos es 2 :S, sin sentido aparente
Código: C++
status addAlumnoGrupo
(
alumno al, grupo
*
gr
)
{
int
i,num
=
2
;
gr
-
>
numalum
=
num
;
Saludos
" ExIsTo y A vEcEs PiEnSo "
NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Problema con un programa