Jump to content

ayuda con programar en C


Recommended Posts

hola necesito ayuda para presentar el trabajo en programacion y tengo que compilar lo siguiente

usando float, for, gets,do y iteracion indicando

 

asignatura

nombre

rut

nota

ponderacion de la nota ej 30% nota 1

promedio

si esta aprovado la asignatura o reprovado

y tener una opcion de guardar en un txt y tambien la posibilidad de modificar uff es una nota para programacion la estructura no entiendo mcuho como va...

La tarea consiste en escribir un programa en C que permita llevar el control de las calificaciones de los ramos de un alumno durante un semestre.

Lo anterior significa que el programa debe ser capaz de registrar y modificar calificaciones de las asignaturas que tiene el alumno y entregar opciones para que se calculen las notas finales cuando todas las calificaciones estén registradas.

Considere que el máximo de asignaturas a manejar es 6 y que el máximo de calificaciones por asignatura es 10. Cada asignatura requiere un número de calificaciones (cada una con su respectiva ponderación) para determinar la nota final.

El programa debe ser capaz de realizar las siguientes tareas:

· Cargar las asignaturas, ponderaciones y calificaciones desde un archivo de texto.

· Realizar modificaciones, eliminaciones y cambios de cualquier especie.

· Grabar asignaturas, ponderaciones y calificaciones hacia un archivo de texto.

· Leer el archivo y ingresar notas que no fueron ingresada y no sobreescribir notas que estan guaradada

un saludo

Edited by soulsitg
Link to comment
Share on other sites

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

typedef struct {
char nombre[50];
char nom[50];
char rut[50];
char fechaNac[50];
char carrera[50];
char ingreso[50];
}Contacto;

typedef struct {
char nombre[50];
char nom[50];
char rut[50];
char fechaNac[50];
char carrera[50];
char ingreso[50];
}Cont;

int main(){

int x;
printf("1. INGRESAR DATO DEL ALUMNO \n");
printf("2. LISTAR ALUMNOS \n");
printf("3. COPIAR ARCHIVO \n");
printf("4. LISTAR POR NOMBRE \n");
printf("\n\n\n");

printf("ingrese opcion : ");
scanf("%d",&x);

printf("\n\n");
while (x>4 || x<1){
printf("error ingrese una opcion del menu :\n\n");
printf("1. INGRESAR DATO DEL ALUMNO \n");
printf("2. LISTAR ALUMNOS \n");
printf("3. COPIAR ARCHIVO \n");
printf("4. LISTAR POR NOMBRE \n");
printf("\n\n\n");
printf("ingrese opcion : ");
scanf("%d",&x);

printf("\n\n");
}
switch (x){

case 1:
ingresar();
break;
case 2:
mostrar();
break;
case 3 :
copiar();
break;
case 4 :
ordenar();
break;

}

system("PAUSE");
return 0;
}



int mostrar(){

FILE *fuente;
Contacto c;

fuente= fopen("fuente.txt", "r");
if (fuente== NULL)
printf("Error al abrir archivo..\n");
else {
fread(&c, sizeof©, 1, fuente);
while (! feof(fuente)){
fread(&c, sizeof©, 1, fuente);

printf("%s\n",c.nombre );
printf("Nombre : %s\n",c.nom );
printf("RUN : %s\n",c.rut);
printf("Carrera : %s\n",c.carrera);
printf("Fecha de Nacimiento : %s\n",c.fechaNac);
printf("\n\n");
fread(&c, sizeof(Contacto), 1, fuente);
}
fclose(fuente);
main();
}



}

int ingresar(){
Contacto c;


// abro el archivo
FILE *fuente;
fuente=fopen("fuente.txt","a"); //creo el archivo txt fuente.txt

if (fuente==NULL)//verifico si el archivo txt se abrio o se creo exitosamente
printf("Error al Abrir el Archivo \n"); //imprimo el mensaje de error
else{

fread(&c, sizeof(Contacto), 1, fuente);

gets(c.nombre );
printf("NOMBRE : ");
gets(c.nom );
printf("RUT : ");
gets(c.rut );

printf("ASIGNATURA : ");
gets(c.carrera );

printf("NOTAS : ");
gets(c.fechaNac );

printf("ponderacion : ");


fwrite(&c, sizeof(Contacto), 1, fuente);
printf("\n\n\n");
}
fclose(fuente);//cierro el archivo fuente.txt
main();
}

//--------------------------------------------
int copiar(){
FILE *fuente, *copia;
Contacto c;
Cont r;
fuente= fopen("fuente.txt", "r");
copia= fopen("paso.txt","w");
if (fuente== NULL || copia==NULL)
printf("Error al abrir uno de los archivos..\n");
else {
fread(&c, sizeof(Contacto), 1, fuente);
while (!feof(fuente)){
fwrite(&c,sizeof(Contacto),1,copia);
fread(&c, sizeof(Contacto), 1, fuente);
}


fclose(fuente);
fclose(copia);

}
printf("el archivo fuente se copio con exito\n\n\n");
ordenar();
}
//-----------------------------------------------------------
int ordenar(){
/*
FILE *fuente, *copia;
Contacto c;
Cont r;
fuente= fopen("fuente.txt", "r");
copia= fopen("paso.txt","r");
if (fuente== NULL || copia==NULL)
printf("Error al abrir uno de los archivos..\n");
else {
fread(&c, sizeof(Contacto), 1, fuente);
fread(&r, sizeof(Contacto), 1, copia);
while (!feof(fuente)&& !feof(copia)){
while(c.rut>r.rut){
fread(&r, sizeof(Cont), 1, copia);
}

printf("nombre : %s\n",c.nombre);
printf("rut : %s\n",c.rut);
printf("fecha nac : %s\n",c.fechaNac);
printf("carrera : %s\n",c.carrera);
fread(&r, sizeof(Cont), 1, copia);
fread(&c, sizeof(Contacto), 1, fuente);
}
fclose(fuente);

fclose(copia);
}
*/
main();

}

Edited by soulsitg
Link to comment
Share on other sites

de partida..

1.- no caché por qué definiste 2 estructuras iguales. :mellow:

2.- no declaraste ninguna de las funciones que utilizaste ( salvo que lo hubieses hecho en un archivo .h que es lo mas comodo para lo que quieres hacer)

3.- despues cuando las usaste.. las pusiste como int, almenos el mostrar.. deberias usar un void.. (persepcion personal, pero solo vas a mostrar.. no vas a modificar ni nada.. como no retornas un dato en especifico.. un VOID es lo qe debes usar :sipis: , de hecho, podrias hacer casi todo eso con voids :mellow:

 

4.- encontre mas dramas.. pero con eso para empezar.. vas a usar una lista ? onda.. son 45 alumnos.. y hacer un struct con los alumnos ? o es solamente individual?

Link to comment
Share on other sites

Te voy a dejar un enlace para que entiendas mejor lo que estás haciendo:

http://bzkgaming.wor...tructuras-en-c/

 

Ten en cuenta los consejos del nycko....lo primero antes de empezar a desarrollar es modelar la aplicación y tu modelo no está muy bien encaminado que digamos. Yo en estos casos cargaba el contenido del txt a una lista simple enlazada y trabajaba con la lista....una vez cerraba el programa guardaba la lista en el txt(sobreescribia el txt)...tenía el inconveniente de que si se caia el programa no alcanzaba a guardar los nuevos cambios, pero a mi forma de ver era más práctico.... lo otro, define bien tus estructuras: yo usaria una para alumnos, otra para asignaturas y otra para notas...asi usaria struct de struct....voy a tratar de hacer un ejemplo ;)

PS: Logré hacer un ejemplo funcional de lo que estaba diciendo.....solo con structs y arreglos de structs; está un poco cutre, pero años que no programaba en C :tonto:

 

 

#include <stdio.h>
#include <stdlib.h>
typedef struct{
char asignatura[50];
int nota[3];
int promedio;
}Notas;
typedef struct{
char nombre[80];
char rut[12];
Notas notas[2];
} Alumno;
int main()
{   int opcion,cont,posicion;
   Alumno arreglo_alumnos[100];
   cont = 0;
   do{
   printf("\nMenu de Opciones\n");
   printf("Ingresar Alumno	  1\n");
   printf("Mostrar Datos Alumno 2\n");
   printf("Salir			    3\n");
   scanf("%d",&opcion);
   switch (opcion)
   {
  case 1:
  {
	  printf("Ingreso Alumno\n");
	  if(cont < 99)
	  {
	   printf("Nombre Alumno : ");
	   gets(arreglo_alumnos[cont].nombre);
	   gets(arreglo_alumnos[cont].nombre);
	   printf("Rut Alumno : ");
	   gets(arreglo_alumnos[cont].rut);
	   printf("Asignatura 1 : \n");
	   printf("Nombre Asignatura : ");
	   gets(arreglo_alumnos[cont].notas[0].asignatura);
	   printf("Nota 1 : ");
	   scanf("%d",&arreglo_alumnos[cont].notas[0].nota[0]);
	   printf("Nota 2 : ");
	   scanf("%d",&arreglo_alumnos[cont].notas[0].nota[1]);
	   printf("Nota 3 : ");
	   scanf("%d",&arreglo_alumnos[cont].notas[0].nota[2]);
	   arreglo_alumnos[cont].notas[0].promedio = (arreglo_alumnos[cont].notas[0].nota[0] + arreglo_alumnos[cont].notas[0].nota[1] + arreglo_alumnos[cont].notas[0].nota[2]) / 3;
	   printf("Asignatura 2 : \n");
	   printf("Nombre Asignatura : ");
	   gets(arreglo_alumnos[cont].notas[1].asignatura);
	   gets(arreglo_alumnos[cont].notas[1].asignatura);
	   printf("Nota 1 : ");
	   scanf("%d",&arreglo_alumnos[cont].notas[1].nota[0]);
	   printf("Nota 2 : ");
	   scanf("%d",&arreglo_alumnos[cont].notas[1].nota[1]);
	   printf("Nota 3 : ");
	   scanf("%d",&arreglo_alumnos[cont].notas[1].nota[2]);
	   arreglo_alumnos[cont].notas[1].promedio = (arreglo_alumnos[cont].notas[1].nota[0] + arreglo_alumnos[cont].notas[1].nota[1] + arreglo_alumnos[cont].notas[2].nota[2]) / 3;
	   cont = cont + 1;

	  }
	  else
	  {
		  printf("Imposible completar operación\n");
	  }
  }
  case 2:
  {
	  if(opcion == 2){
	  printf("Ingrese el numero de lista del alumno : ");
	  scanf("%d",&posicion);
	  if(posicion-1 < cont)
	  {
	    printf("Datos del alumno : \n");
	    printf("Nombre Completo : %s \n", arreglo_alumnos[posicion-1].nombre);
	  }
	  else
	  {
		  printf("Alumno no existe....");
	  }
	  }
  }
   }
   }while(opcion < 3);
return 0;
}

 

Saludos :krider:

Edited by AshWilliams
Link to comment
Share on other sites

' timestamp='1341558314' post='17908133']

de partida..

1.- no caché por qué definiste 2 estructuras iguales. :mellow:

2.- no declaraste ninguna de las funciones que utilizaste ( salvo que lo hubieses hecho en un archivo .h que es lo mas comodo para lo que quieres hacer)

3.- despues cuando las usaste.. las pusiste como int, almenos el mostrar.. deberias usar un void.. (persepcion personal, pero solo vas a mostrar.. no vas a modificar ni nada.. como no retornas un dato en especifico.. un VOID es lo qe debes usar :sipis: , de hecho, podrias hacer casi todo eso con voids :mellow:

 

4.- encontre mas dramas.. pero con eso para empezar.. vas a usar una lista ? onda.. son 45 alumnos.. y hacer un struct con los alumnos ? o es solamente individual?

 

4.- la idea es ingresar alumnos A quisas >30 pero lo que trato de hacer es que cuando ingrese la nota de cada alumno se repita hasta tener una ponderacion = a 100 eso no logro hacer aun

Edited by soulsitg
Link to comment
Share on other sites

' timestamp='1341558314' post='17908133']

de partida..

1.- no caché por qué definiste 2 estructuras iguales. :mellow:

2.- no declaraste ninguna de las funciones que utilizaste ( salvo que lo hubieses hecho en un archivo .h que es lo mas comodo para lo que quieres hacer)

3.- despues cuando las usaste.. las pusiste como int, almenos el mostrar.. deberias usar un void.. (persepcion personal, pero solo vas a mostrar.. no vas a modificar ni nada.. como no retornas un dato en especifico.. un VOID es lo qe debes usar :sipis: , de hecho, podrias hacer casi todo eso con voids :mellow:

 

4.- encontre mas dramas.. pero con eso para empezar.. vas a usar una lista ? onda.. son 45 alumnos.. y hacer un struct con los alumnos ? o es solamente individual?

 

4.- la idea es ingresar alumnos A quisas >30 pero lo que trato de hacer es que cuando ingrese la nota de cada alumno se repita hasta tener una ponderacion = a 100 eso no logro hacer aun

no cacho a que te refieres con ponderacion = a 100.. 100% ? onda.. 1 nota vale 20% otra nota = 30% y otra 40% hasta completar los 100?

eso tendrias qe definirlo dependiendo de cada asignatura ps.. deberias ingresar la cantidad de notas.. y la ponderacion de cada 1 manualmente.. dsps en una funcion cualquiera hacer algo asi:

 

con un for leer las x cantidad de notas;

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

notas.asignatura[w].nota= "nota aqui";

despues leer las ponderaciones

notas.asignatura[w].ponderacion="ponderacion aqui"

}

para sacar el final.. teni que comprobar que las ponderaciones sean correctas.. ( con un If dentro de un for )

validar=0;

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

validar=validar+notas.asignatura[w].ponderacion;

}

if (validar!=100) nose ps.. repites la accion o pegas error..

 

despues para sacar el promedio es cosa de que la ponderacion la multipliques por 0.01 y despues por la nota.. despues sumas las notas y voilá.. te sale el promedio final :) (asi por lo menos sacabamos las ponderaciones nosotros.. alla uds como lo hacen :tontotv: será pajero pero es efectivo :sipis: )

 

algo asi? :tontotv:

Edited by nycko[!]
Link to comment
Share on other sites

gracias ashwilliams por tu estructura es mucho mejor que el que tenia yo, pero como meto esto en tu estructura de las notas y ponderacion me imgino que deveria ser una matriz de 3x3 asignatura[] nota[] ponderacion[]

 

void main()
{
// definicion de variables

int asig = 1, nota, nota_mayor, nota_menor, notaf, pond, i, k, celda, n, t, pondacumulada;
// int asig_a = 0; asig_r = 0, asig_p = 0;

//inicializar arreiglo.

while ( asig != 0 )
{
printf("Ingrese codigo de asignatura (numero entero) : ");
scanf( "%d", &asig );

if ( asig != 0 )
{
i = 0;
pondacumulada = 0;
notaf = 0.0;

while ( pondacumulada < 100 )
{
i++;
printf("nota(%d) = ", i); scanf("%d", &nota);
printf("pond(%d) = ", i); scanf("%d", &pond);


while( pond > (100 - pondacumulada) )
{
printf("Debe ingresar un valor < a %dn", 100-pondacumulada);
printf("pond(%d) = ", i); scanf("%d", &pond);
}

notaf = notaf + ( (float)nota/100 * (float)pond/100 );
pondacumulada += pond;
printf("Ingrese Numero (entero) (con 0 termina):");scanf("%d",&n);

}

printf("Asignatura : %dn-----------------nn", asig );
printf("Nota Final %1.2fnnnn", notaf);


// faltan los criterios de arobacion/reprobacion.
}
}
}

Edited by soulsitg
Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...