Problemas con C

Hola amigos, resulta que tengo que hacer un trabajo de C y segun lo que ha explicado el profesor, no tengo ni puta idea de como se haría. Acudo a vosotros para ver si sabeis algun manual de C que este bien. Exactamente donde me he perdido en "Estructuras" y "Entrada y salida de ficheros"
El resto de las cosas las entiendo bastante bien.
Gracias de antemano


Si hay alguien que domine C y tiene algo de tiempo libre (y ganas de ayudar a este pobre desgraciado) os puedo decir que es lo que me pide y lo que tengo.
El K&R es el libro de referencia de C y lo puedes descargar gratuitamete :) : http://www.cs.ucsb.edu/~buoni/cs16/The_ ... nguage.pdf http://net.pku.edu.cn/~course/cs101/200 ... nguage.pdf

Si tienes dudas concretas no te cortes y pregunta.
no es un libro, pero te recomiendo stackoverflow.

BTW, entrada y salida de ficheros mediante pipes (./myprog < inputFile > outputFile) o mediante c (File f = File("/path/to/file");)?
No te cortes con las dudas, pero aquí no te haremos los deberes XD

Esta biblioteca online encuentras de todo, algún que otro manual o libro me he pillado de ahí y muy buenos, la verdad.
http://www.etnassoft.com/biblioteca/cat ... amacion/c/
Estoy trabajando con los manuales que me habeis pasado y de momento la duda es demasiado grande. Si pillo alguna duda concreta os la digo, de momento los manuales me han servido de mucho.

Gracias a todos

EDITO:
Una duda.
Tengo una estructura tal que asi:
struct datos{
int numero;
char nombre[32];
int intentos;
int aciertos;
};


En el main he asociado esa estructura a un vector:
struct datos jugador[9]


Pues resulta que ahora quiero mandar ese vector a un subprograma, pero no se como mandarlo. Me podriais poner el prototipo de la funcion
El subprograma tiene que comprobar si un numero que te pide en el subrograma existe ya en el campo numero de jugador
de momento tengo esto

void uno(****aqui no se que poner*****){

int i,num,control=0;

printf("Dime el numero de jugador: ");
scanf("%d",&num);


for(i=0;i<x;i++){
if(jugador[i].numero==num) control++;
}

if (control>0) printf("Ya existe");

}
Juanillooo92 escribió:Pues resulta que ahora quiero mandar ese vector a un subprograma, pero no se como mandarlo. Me podriais poner el prototipo de la funcion
El subprograma tiene que comprobar si un numero que te pide en el subrograma existe ya en el campo numero de jugador
de momento tengo esto

void uno(****aqui no se que poner*****){

int i,num,control=0;

printf("Dime el numero de jugador: ");
scanf("%d",&num);


for(i=0;i<x;i++){
if(jugador[i].numero==num) control++;
}

if (control>0) printf("Ya existe");

}

Lo más sensato es que lo pases por referencia con un puntero:
void uno(datos *d){
int i,num,control=0;

printf("Dime el numero de jugador: ");
scanf("%d",&num);

for(i=0;i<x;i++,d++){
if(d->numero==num) control++;
}

if (control>0) printf("Ya existe");
}


Saludos.
Ok muchas gracias, acabo de terminar el trabajo.
Luego si eso lo cuelgo para q me crucifiqueis un poco por como lo he hecho jajajaja
¿Te compila y funciona bien? Porque en los fragmentos de código que has puesto había cosas un poco sospechosas... xD

Saludos.
Serede escribió:¿Te compila y funciona bien? Porque en los fragmentos de código que has puesto había cosas un poco sospechosas... xD

Saludos.

Si si, y lo he provao y me hace todo bien.
Esque lo habia intentado poner demasiado resumido

EDITO:
Una nueva duda que me ha surgido
tengo dos vectores tal que estos:
int rand1[5];
int rand2[5];

rand1 esta lleno de numeros al azar, eso ya lo tengo hecho. Ahora el problema es que quiero meter esos numeros que están en rand1, en rand2 pero con un orden aleatorio. No se si me explico, pongo un ejemplo

rand1= 2 4 5 1 2 3
quiero que rand2 tenga (por ejemplo)
rand2= 5 2 3 2 4 1
y claro hacerlo para que cada vez sea aleatorio, no poner rand2[0]=rand1[3]; rand2[1]=rand1[2] etc...
Lo que quieres es reordenar el vector, se me ocurre que crees un vector auxiliar del mismo tamaño inicializado a 0, de modo que vayas copiando posiciones aleatorias del vector rand1 al vector rand2 y las marques en tu vector auxiliar para evitar repeticiones.
pues nada, aqui esta mi trabajo final, gracias a todos

/*
***************************************************************
*****  ABRIR CON WINDOWS PARA OBTENER MEJORES RESULTADOS  *****
* *************************************************************
*/



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

struct datos{
    int numero;
    char nombre[32];
    int intentos;
    int aciertos;
};

//Estas son los subprogramas utilizados
void crearfichero(void);
void uno(struct datos ju[],int jug);
void dos(struct datos ju[],int jug);
void tres(struct datos ju[],int *jug);
int comprueba(struct datos ju[], int n,int jug);
int numvector(struct datos ju[],int n,int jug);
void error(void);

//Estos son ya del juego
int juego(int m);
void llenar(int list1[],int list2[],int m);
void inicializa(int v[],int m);
int danumero(int v[],int x);
void imprime(int v1[],int v2[],int m1[],int m2[],int m);
void ver3s(int v1[],int v2[],int m1[],int m2[],int x,int y,int m);





int main() {
    int i,a,njug=0,jugadores;
    struct datos jugador[20];
   
    crearfichero();   
    FILE *registro;
    registro=fopen("juego.dat","rb");
       
    while(!feof(registro)){       
        fread(&jugador[njug],sizeof(struct datos),1,registro);
        njug++;       
    }
    jugadores=njug-1;
    njug=-1;
   
   
   
    while (a!=4){
    system("cls");
    printf("MENU PRINCIPAL\n\n");
    printf("1) Iniciar nueva partida\n");
    printf("2) Mostrar estadisticas de las jugadas\n");
    printf("3) Registrar usuario\n");
    printf("4) Salir\n\nQue quieres hacer: ");
    scanf("%d",&a);
    fflush( stdin );
   
    switch(a){
        case 1:
            uno(jugador,jugadores);
            break;
           
        case 2:               
            dos(jugador,jugadores);
            break;
       
        case 3:
            tres(jugador,&jugadores);
            break;
       
        case 4:
            system("cls");
            printf("Gracias por haber usado el programa\nEspero que nos volvamos a ver\n\n\n");           
            registro=fopen("juego.dat","wb");
            for (i=0;i<jugadores;i++){
                fwrite(&jugador[i],sizeof(struct datos),1,registro);
            }   
    fclose(registro);
           
            break;
       
        default:
            error();
            break;
    }
}
}

//Crea el fichero si no existe, si existe lo deja como está
void crearfichero(){
    int n,i;
    FILE *registro;
    struct datos jugador;
    registro=fopen("juego.dat","a+b");
    fclose(registro);
}

//Elemento del primer menu, sirve para pedir el numero del jugador e iniciar una partida
void uno(struct datos ju[],int jug){
    int dif,n,njug;
    system("cls");
    do{
        system("cls");
        printf("Dime el numero de jugador: ");
        scanf("%d",&n);
        while(getchar()!='\n');
    }while(comprueba(ju,n,jug)!=1);
    njug=numvector(ju,n,jug);
    do{printf("\nDime la dificultad (0-5): ");
    scanf("%d",&dif);}while(dif>5||dif<0);
    system("cls");
    printf("Inicia partida el jugador [%d] con la dificultad [%d]",n,dif);
    system("sleep 4");
    system("cls");
    if(juego(dif)==1){
        ju[njug].intentos++;
        ju[njug].aciertos++;
    }else ju[njug].intentos++;
    };

//Elemento del primer menú y que despliega otro submenu, nos servira para ver las estadisticas
void dos(struct datos ju[],int jug){
    char op;
    int n,nivel,njug,i;
    float media;
do{
            system("cls");
            printf("ETADISTICAS\n\n");
            printf("a) Mostrar estadisticas un jugador\n");
            printf("b) Mostrar todas las estadisticas\n");
            printf("c) Volver al menu principal\n\nQue quieres hacer: ");
            op=getchar();           
            while(getchar()!='\n');
           
            switch(op){
                case 'a':
                    do{
                        system("cls");
                        printf("Dime el numero de jugador: ");                       
                        scanf("%d",&n);
                        while(getchar()!='\n');                       
                    }while(comprueba(ju,n,jug)!=1);
                    njug=numvector(ju,n,jug);
                    printf("Estadisticas del Jugador [%d]",n);
                    media=((float)ju[njug].aciertos/ju[njug].intentos)*100;
                    if(ju[njug].intentos!=0){
                    printf("\nNumero: %d   Nombre: %s \nIntentos: %d   Aciertos: %d --- Media(g/p): %.0f/100 \n\nPresiona enter para salir",
                            ju[njug].numero,ju[njug].nombre,ju[njug].intentos,ju[njug].aciertos,media);}
                    else printf("\nNumero: %d   Nombre: %s \nIntentos: %d   Aciertos: %d --- Media: No se ha jugado %\n\nPresiona enter para salir",
                            ju[njug].numero,ju[njug].nombre,ju[njug].intentos,ju[njug].aciertos);                   
                    while(getchar()!='\n');                   
                    break;
                   
                case 'b':
                    system("cls");
                    printf("-----------------------------");
                    for(i=0;i<jug;i++){
                        media=((float)ju[i].aciertos/ju[i].intentos)*100;
                        printf("\nNumero: %d   \nNombre: %s \nIntentos: %d   Aciertos: %d \n-----------------------------",
                                ju[i].numero,ju[i].nombre,ju[i].intentos,ju[i].aciertos);
                   
                    }
                    printf("\n\nPresiona enter para salir");
                    while(getchar()!='\n');
           
                    break;
                   
                case 'c':
                    break;
                   
                default:
                    error();
                   
            }
            }while(op!='c');   
           
           
}

//Hecho para comprobar si ya existe el numero que se pasa como parametro "n" en el vector jugadores.numero
int comprueba(struct datos ju[], int n,int jug){
    int i,control=0;
    for (i=0;i<jug;i++){
        if(ju[i].numero==n)control++;
    }
    return control;
}

//Elemento del primer menú, nos sirve para dar de alta un jugador
void tres(struct datos ju[],int *jug){
    int n;
    do{
        system("cls");
        printf("Dime el numero de jugador: ");
        scanf("%d",&n);
        while(getchar()!='\n');
    }while(comprueba(ju,n,*jug)>0);
    ju[*jug].numero=n;
    printf("Damen un nombre: ");
    gets(ju[*jug].nombre);
    ju[*jug].intentos=0;
    ju[*jug].aciertos=0;
    system("cls");
    printf("Jugador [%d] registrado",ju[*jug].numero);
    system("sleep 4");
    *jug=*jug+1;
}

//En caso de error se llamara a esta funcion
void error(){
            system("cls");
            printf("                    ****************************\n");
            printf("                    ** La opcion no es valida **\n");
            printf("                    ****************************");
            system("sleep 2");
}

//Nos dice la posicion del vector en la que se encuentra un número
int numvector(struct datos ju[],int n,int jug){
    int i;
    for (i=0;i<jug;i++){
        if(ju[i].numero==n)return i;
    }
}


//Apartir de aqui son subfunciiones relacionadas con el juego

int juego(int m) {
    int i,j,a,b,intentos,control=0;
    m=m+3;
    int lista1[m],lista2[m],mostrar1[m],mostrar2[m];
    intentos=m+5;
    inicializa(mostrar1,m);
    inicializa(mostrar2,m);
    llenar(lista1,lista2,m);
   
    for(i=intentos;i>0;i--){
        printf("          **********   TIENES %d INTENTOS   **********\n\n",i);
        imprime(lista1,lista2,mostrar1,mostrar2,m);
        printf("\n\n\nPrimera lista(0-%d): ",m-1);
        scanf("%d",&a);
        printf("Segunda lista(0-%d): ",m-1);
        scanf("%d",&b);
       
        if(danumero(lista1,a)==danumero(lista2,b)){
            mostrar1[a]=1;
            mostrar2[b]=1;
            } 
        ver3s(lista1,lista2,mostrar1,mostrar2,a,b,m);
        control=0;
        for(j=0;j<m;j++){
            if(mostrar1[j]==1)control++;
        }
        if (control==m){
            system("cls");
            printf("\nBIEN, HAS GANADO\n");
            system("sleep 5");
            return 1;
        }
   }
  system("cls");
  printf("\nLO LAMENTO, HAS PERDIDO\n");
  system("sleep 5");
  return 0;
}
void llenar(int list1[],int list2[],int m){
    int ale,a=0,i,control=1,num[10];
    for(i=0;i<10;i++)num[i]=0;
    srand((unsigned) time(NULL));
   
    for (i=0;i<m;i++){
        ale=rand();
        ale=ale%10;
        list1[i]=ale;
        num[ale]++;
    }
    while(control!=0){
        control=0;
        ale=rand();
        ale=ale%10;
        if(num[ale]!=0){
            list2[a]=ale;
            a++;
            num[ale]--;
        }
        for(i=0;i<10;i++){
            if(num[i]!=0)control++;
        }
    }
}
void inicializa(int v[],int m){
    int i;
    for (i=0;i<m;i++){
        v[i]=0;
    }
}
int danumero(int v[],int x){
    int r;
    r=v[x];
    return r;
}
void imprime(int v1[],int v2[],int m1[],int m2[],int m){
    int i;
    printf("\n");
    for(i=0;i<m;i++){
        if (m1[i]==0)printf(" - "); else printf(" %d ",v1[i]);
    }
    printf("\n");
    for(i=0;i<m;i++){
        if (m2[i]==0)printf(" - "); else printf(" %d ",v2[i]);
    }   
    }   
void ver3s(int v1[],int v2[],int m1[],int m2[],int x,int y,int m){
    int i;
   
    system("cls");
    printf("          ********** MEMORIZA EN 3 SEGUNDOS **********\n\n\n");
   
   
    for(i=0;i<m;i++){
        if (m1[i]==1||i==x)printf(" %d ",v1[i]); else printf(" - ");
    }
    printf("\n");
    for(i=0;i<m;i++){
        if (m2[i]==1||i==y)printf(" %d ",v2[i]); else printf(" - ");
    }
    system("sleep 3");
    system("cls");
}


No me cruzifiqueis demasiado
Un apunte, para que evites el "abrir con Windows para obtener mejores resultados"

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

#ifdef _WIN32
# define CLS system("cls");
#else
# define CLS system("clear");
#endif

int main(void){
   CLS
   printf("hola mundo\n");
   
   return 0;
}
11 respuestas