Leer fichero y guardar datos en struct en C

#include <stdio.h>
#include <stdlib.h>
#define MAX_CHAR 10000

struct Talumno{ 
 char nombre[50]; 
 char apellido1[100]; 
 char apellido2[100]; 
 float notas[2]; 
 float media;
};

struct Talumno *leerdatos(char *nombrearchivo, int numlineas);
int numlineasarchivo(FILE *p);
int mediamasalta(struct Talumno *info, int tam);

int main(int argc, char* argv[]){
 
 struct Talumno *clase;
 int numalumnos,mejornota;
 FILE *parchivo;

 
 
 if (argc!=2)
  printf("Error, el número de argumentos no es correcto\n");
 else {
  parchivo=fopen(argv[1],"r");
  if (parchivo==NULL) {
   printf("Error al abrir el archivo");
  }
  else {
   //obtenemos el número de líneas del fichero
   numalumnos =numlineasarchivo(parchivo);
   fclose(parchivo);
   
   clase=leerdatos(argv[1],numalumnos);
   
   mejornota=mediamasalta(clase,numalumnos);   
   printf("El alumno con mejor nota se llama %s %s %s y ha sacado un %f\n",(clase+mejornota)->nombre,(clase+mejornota)->apellido1, (clase+mejornota)->apellido2,(clase+mejornota)->media);
   free(clase);      
  }

 }

 return 0;
}

int numlineasarchivo(FILE *p)
{
 int nlineas;
 char linea[MAX_CHAR];

 //obtenemos el número de líneas del fichero
 nlineas = 0;
 while (!feof(p)) {
  fgets(linea,MAX_CHAR,p);
  nlineas++;
 }
 return nlineas;
}


struct Talumno *leerdatos(char *nombrearchivo, int numlineas)
{
 FILE *parchivo;
 struct Talumno *info;
 int i;
 
 parchivo=fopen(nombrearchivo,"r");
 if (parchivo==NULL) {
  printf("Error al abrir el archivo");
 }
 else {
 
  //reservamos espacio para la matriz
  info=(struct Talumno*)malloc(sizeof(struct Talumno)*numlineas);
 
  //leemos los datos
  for (i=0; i<numlineas; i++) {
   fscanf (parchivo, "%s %s %s %f %f",(info+i)->nombre,(info+i)->apellido1, (info+i)->apellido2,&(info+i)->notas[0],&(info+i)->notas[1]);
   (info+i)->media=((info+i)->notas[0]+(info+i)->notas[1])/2;
  }
 }
 fclose(parchivo);
 return info;
}
int mediamasalta(struct Talumno *info, int tam)
{
 int res,i;
 res=0;
 for (i=0; i<tam; i++) {
  if ((info+i)->media > (info+res)->media) {
   res=i;
  }
 }
 return res;
}


Área y perímetro de triangulo con struct en C

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

struct Tpunto {
 float x;
 float y;
};

struct Ttriangulo {
 struct Tpunto p1;
 struct Tpunto p2;
 struct Tpunto p3;
 float area;
 float perimetro;
};


int main(int argc, char* argv[]){
 
 struct Ttriangulo triangulo;
 float lado1, lado2, lado3, s;
 
 printf("Introduzca las coordenadas del punto 1:\n");
 scanf("%f %f",&triangulo.p1.x,&triangulo.p1.y);
 printf("Introduzca las coordenadas del punto 2:\n");
 scanf("%f %f",&triangulo.p2.x,&triangulo.p2.y);
 printf("Introduzca las coordenadas del punto 3:\n");
 scanf("%f %f",&triangulo.p3.x,&triangulo.p3.y);
 
 lado1 = sqrt(pow(triangulo.p1.x-triangulo.p2.x,2)+pow(triangulo.p1.y-triangulo.p2.y,2));
 lado2 = sqrt(pow(triangulo.p1.x-triangulo.p3.x,2)+pow(triangulo.p1.y-triangulo.p3.y,2));
 lado3 = sqrt(pow(triangulo.p3.x-triangulo.p2.x,2)+pow(triangulo.p3.y-triangulo.p2.y,2));
 triangulo.perimetro = lado1 + lado2 + lado3;
 s = 1.0/2.0 * triangulo.perimetro;
 triangulo.area = sqrt(s*(s-lado1)*(s-lado2)*(s-lado3));
 
 printf("El perímetro del triángulo es: %f\n",triangulo.perimetro);
 printf("El área del triángulo es: %f\n",triangulo.area);
 return 0;

}

Struct en C

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

struct Tjugador{ 
 char nombre[50]; 
 int edad; 
 float altura;
};

int jugadormasalto(struct Tjugador *info, int tam);
int jugadormasviejo(struct Tjugador *info, int tam);

int main(int argc, char* argv[]){
 
 struct Tjugador *equipo;
 int numjugadores,i,masalto,masviejo;
 
 printf("Introduzca cuántos jugadores tiene el equipo\n");
 scanf("%d",&numjugadores);
 
 equipo=(struct Tjugador*)malloc(sizeof(struct Tjugador)*numjugadores);
 
 printf("Introduzca los datos de los jugadores:\n");
 for (i=0; i<numjugadores; i++) {
  printf("Introduzca el nombre del jugador %d: ", i);
  while(getchar()!='\n');
  fgets((equipo+i)->nombre,50,stdin);
//  while(getchar()!='\n');
  printf("Introduzca la edad del jugador %d: ", i);
  scanf("%d",&(equipo+i)->edad);
  printf("Introduzca la altura del jugador %d: ", i);
  scanf("%f",&(equipo+i)->altura);
 }
 masalto=jugadormasalto(equipo,numjugadores);
 masviejo=jugadormasviejo(equipo,numjugadores);

 printf("El jugador más alto es el jugador %d, se llama %s y mide %f\n",masalto+1,(equipo+masalto)->nombre,(equipo+masalto)->altura);
 printf("El jugador más viejo es el jugador %d, se llama %s y tiene %d años\n",masviejo+1,(equipo+masviejo)->nombre,(equipo+masviejo)->edad);
 return 0;
}

int jugadormasalto(struct Tjugador *info, int tam)
{
 int i,res; 
 res=0;
 for (i=1; i<tam; i++) {
  if ((info+i)->altura > (info+res)->altura) {
   res=i;
  }
 }
 
 return(res);
}
int jugadormasviejo(struct Tjugador *info, int tam)
{
 int i,res; 
 res=0;
 for (i=1; i<tam; i++) {
  if ((info+i)->edad > (info+res)->edad) {
   res=i;
  }
 }
 
 return(res);
}


Programa con vectores en C

Hacer un programa con dos vectores del mismo tamaño dado por el usuario. La
inicialización/reserva de memoria de los vectores se realizará en dos funciones
con los prototipos dados. Los vectores contendrán números enteros
introducidos por el usuario. Será necesario realizar una función para imprimir
los valores de los vectores.


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

void funcion_modo1(int** ptr, int n);
int *funcion_modo2(int n);
void imprimir(int *ptr, int n);


int main(){
    int n,i,*puntero_modo1, *puntero_modo2, sum=0;
    printf("Enter number of elements: ");
    scanf("%d",&n);
  
    funcion_modo1(&puntero_modo1, n);
    puntero_modo2 = funcion_modo2(n);
    
    
    for(i=0;i<n;++i)
    {
        printf("Enter element of array [%d] ", i);
        scanf("%d",puntero_modo1+i);

    }
    for(i=0;i<n;++i)
    {
        printf("Enter element of array [%d] ", i);
        scanf("%d",puntero_modo2+i);
    }
    
    imprimir(puntero_modo1, n);
    imprimir(puntero_modo2, n);
    
    free(puntero_modo1);
    free(puntero_modo2);
    
    return 0;
}

void funcion_modo1(int** ptr, int n)
{
    *ptr=(int*)malloc(n*sizeof(int));  
    
    if (ptr == NULL) {
      printf("Error al capturar la memoria");
      exit(0);
    }

}

int *funcion_modo2(int n)
{
    int *ptr;
    ptr=(int*)malloc(n*sizeof(int));  
    if (ptr == NULL) {
      printf("Error al capturar la memoria");
      exit(0);
    }

    return ptr;
}


void imprimir(int *ptr, int n)
{
    int i;
    
    printf("\n Los valores del vector son ");
    for(i=0;i<n;++i)
    {
        printf("[%d],", *(ptr+i));
    }   
    printf("\n"); 

}

Programa que calcula si un año es bisiesto en C

/*Escribir un programa que determine si un año es bisiesto
Un año es bisiesto si es multiplo de 4(por ejemplo 1984).Sin embargo los años multiplos de 100 solo son 
bisiestos cuando a la vex son múltiplos de 400(E.j. 1800 No , 2000, Si

*/

#include <stdio.h>

int bisiesto(int x){

  int esbisiesto = 0;
  
  if (x%400 == 0) 
    esbisiesto = 1;
  else if (x%100==0)
    esbisiesto = 0;
  else if  (x%4==0)
    esbisiesto = 1;

  return esbisiesto;
}

int main(int argc,char *argv[]){

  int x;
  printf("Introducir año (Ej. 1943,2012) \n");
  scanf(" %d",&x);

  if (bisiesto(x))
    printf("%d es bisiesto \n",x);
  else
    printf("%d no es un año bisiesto\n",x);

  return 0;
}