Fundamentos de programación

Informática. Funciones. Código. Pseudocódigo. Algoritmo

  • Enviado por: Programilla
  • Idioma: castellano
  • País: España España
  • 14 páginas
publicidad
publicidad

/*********************************************************************/

/*Diseñar y escribir un programa en C, guiado por menús, que permita */

/*el aprendizaje de los países y sus correspondientes capitales. */

/*El programa tendrá los datos de países y capitales guardados en un */

/*fichero de registros donde cada registro contiene el nombre del pais */

/*y su capital (un registro es una estructura). */

/*El programa trabajará sobre memoria y no directamente sobre el */

/*fichero. */

/*Es decir, hay que cargar los datos del fichero a memoria y desde ahí */

/*trabajar. */

/*Para ello el programa mostrará un menú principal con las siguientes */

/*opciones: */

/*1. Configuración del fichero */

/*2. Determinar la capital de un país especificado */

/*3. Determinar el país cuya capital se especifica */

/*4. Juego de países y capitales */

/*5. Salir */

/* */

/*Cuando elige la opcion: */

/* */

/*1) se mostrara un nuevo menu con las opciones: */

/* a. Crear fichero */

/* b. Añadir pais y su capital */

/* c: Eliminar pais y su capital */

/* d. Modificar pais y su capital */

/* e. Ver todos los países almacenados y sus capitales */

/* */

/*La opcion: */

/* a. Permite crear el fichero si no existe */

/* b. Se usa para añadir un país y su capital */

/* c. Se usa para eliminar un país y su capital */

/* d. Se usa para modificar un país y su capital si tienen errores */

/* e. Permite ver todos los países que contiene el fichero y sus */

/* capitales */

/*En el caso de usar las opciones a,b,c y d de este menú, después de */

/*programar lo que deban hacer, se debe cargar el fichero de nuevo a */

/*memoria, puesto que con esas opciones hemos hecho cambios al fichero */

/*si no actualizamos lo que habíamos cargado al empezar el programa */

/*a memoria, no veremos los cambios realizados. */

/* */

/*2) En esta opcion se pide un país al usuario y el programa muestra */

/* la capital correspondiente. */

/* */

/* */

/*3) Es igual que la 2) pero ahora se pide la capital y se muestra el */

/* país */

/* */

/*4) Consiste en mostrar un submenú con 2 opciones: */

/* a. Tú me das el país */

/* b. Tú me das la capital */

/* */

/*Según elijamos a o b nos pedirá un país ( para adivinar su capital ) */

/*o una capital ( para adivinar de qué país es ). */

/*La forma de adivinar es co nun juego que consiste en: */

/* a) para facilitarnos el adivinar, nos muestra tantos guiones bajos */

/* como letras tiene el país o capital a adivinar. */

/* b) tenemos que ir dando letras ( como en el ahorcado ) hasta */

/* adivinar el país o capital. */

/*Si una letra no está, nos dice que no está y no pasa nada. */

/*Si la letra está, nos pone todas las que haya y en que sitio van. */

/*****************************************************************/

#include<stdio.h>

#include<stdlib.h> //se necesita para system("cls")

#include<string.h> //se necesita para strcmp

#include<conio.h> //se necesita para getch

struct datos

{

char pais[25];

char capital[25];

};

struct datos capitales; //estructura de paises y capitales. Permite guardar un número ilimitado de datos.

/*PROTOTIPOS DE LAS FUNCIONES EMPLEADAS*/

/*--------------------------------------*/

/*--------------------------------------*/

/*PROTOTIPOS DE LAS FUNCIONES DEL PRIMER MENU: */

void configuracion(FILE *fichero, struct datos capitales); //función que muestra otro menú con diferentes opciones

void determinar_capital(FILE *fichero, struct datos capitales); /*función que muestra la capital correspondiente al pais que se le pide al usuario*/

void determinar_pais(FILE *fichero, struct datos capitales); /*función que muestra el

pais correspondiente

a la capital que se le pide al usuario*/

void juego_pedir_pais(FILE *fichero, struct datos capitales); /*función que permite adivinar la capital de un

país que se le pide al usuario*/

void juego_pedir_capital(FILE *fichero, struct datos capitales); /*función que permite adivinar de que país es la

capital que se le pide al usuario/*

/*PROTOTIPOS DE LAS FUNCIONES DEL SEGUNDO MENU: */

void crear_fichero(FILE *fichero, struct datos capitales); /*función que crea el fichero si no está creado y permite introducir paises con sus respetivas capitales*/

void aniadir(FILE fichero, struct datos capitales); /*función que permite añadir un número indefinido de paises con sus capitales/

void eliminar(FILE fichero, struct datos capitales); /*función que permite dar de baja un pais con su respectiva capital*/

void modificar(FILE *fichero, struct datos capitales); /*función que pregunta el país a modificar y lo modifica con la respectiva

modificación de su capital*/

void ver(FILE fichero, struct datos capitales); /*función que permite ver un listado de todos los paises con sus capitales*/

/*programa principal*/

void main()

{

FILE *fichero;

int opc,opci;

do

{

printf("Elije una opcion\n");

printf("1.Configuracion del fichero\n");

printf("2.Determinar la capital de un pais especificado\n");

printf("3.Determinar el pais cuya capital se especifica\n");

printf("4.Juego de paises y capitales\n");

printf("5.Salir\n");

fflush(stdin);

scanf("%d", &opc);

switch(opc) //según la opcón elegida entra en case 1, case 2,...

{

case 1:

configuracion(fichero,capitales); /*llamada a la función configuración

la cual accede a otro menú para elegir

otras opciones*/

break;

case 2:

determinar_capital(fichero, capitales); /*llamada a la función determinar capital que muestra la capital de un pais pedido anteriormente*/

break;

case 3:

determinar_pais(fichero, capitales); /*llamada a la función determinar pais que muestra el pais al que pertenece una capital pedida anteriormente*/

break;

case 4:

system("cls");

printf("Elige una opcion:\n");

printf("1.Tu me das el pais\n");

printf("2.Tu me das la capital\n");

fflush(stdin);

scanf("%d",&opci);

if(opci==1)

juego_pedir_pais(fichero, capitales); /*llamada a la función juego pedir país que pedirá un país para adivinar su capital,mostrando tantos guiones como letras tenga su capital*/

else

juego_pedir_capital(fichero, capitales); /*llamada a la función juego pedir capital que pedirá una capital para adivinar su país,mostrando tantos guiones como letras tenga su país*/

break;

default:

break;

}

}while(opc!=5);

}

/**********************************************************************

/*FUNCIÓN: configuración */

/* */

/*PARÁMETROS: la declaración del fichero y la estructura donde se modificarán los */

/* datos */

/*VALOR DEVUELTO: ninguno */

/* */

/*********************************************************************/

void configuracion(FILE *fichero, struct datos capitales)

{

char opc1;

do

{

system("cls");

printf("Escoge una opcion\n");

printf("a.Crear fichero\n");

printf("b.Anadir pais y capital\n");

printf("c.Eliminar pais y capital\n");

printf("d.Modificar pais y capital\n");

printf("e.Ver todos los paises almacenados y sus capitales\n");

printf("s.Salir\n");

fflush(stdin);

scanf("%c", &opc1);

switch(opc1)

{

case 'a':

aniadir(fichero, capitales); /*llamada a la función crear fichero que crea el fichero si no existe y permite introducir paises y capitales*/

break;

case 'b':

aniadir(fichero, capitales); /*llamada a la función añadir que permite introducir paises con sus capitales*/

break;

case 'c':

eliminar(fichero, capitales); /*llamada a la función eliminar que permite eliminar un pais*/

break;

case 'd':

modificar(fichero, capitales); /*llamada a la función modifiar que permite modificar un pais, su capital o ambas */

break;

case 'e':

ver(fichero, capitales); /*llamada a la función ver que permite visualizar un listado con los paises y sus capitales que tenemos guardados en el fichero*/

break;

default:

break;

}

}while(opc1!='s');

fclose(fichero);

}

/*********************************************************************/

/*FUNCIÓN: añadir */

/* */

/*PARÁMETROS: la declaración del fichero y la estructura donde se modificarán los */

/* datos */

/* */

/*VALOR DEVUELTO: ninguno */

/* */

/*********************************************************************/

void aniadir(FILE *fichero, struct datos capitales)

{

fichero=fopen("capitales.dat","ab");

char respu;

do

{

printf("Pais: \n");

scanf("%s",capitales.pais);

printf("\n");

printf("Capital: \n");

scanf("%s",capitales.capital);

printf("Desea introducir mas paises?\n");

fwrite(&capitales,sizeof(struct datos),1,fichero);

fflush(stdin);

scanf("%c",&respu);

}while(respu!='n');

fclose(fichero);

}

/*********************************************************************/

/*FUNCIÓN: ver */

/* */

/*PARÁMETROS: la declaración del fichero y la estructura donde se modificarán los */

/* datos */

/* */

/*VALOR DEVUELTO: ninguno */

/* */

/*********************************************************************/

void ver(FILE *fichero, struct datos capitales)

{

fichero=fopen("capitales.dat","rb");

while(!feof(fichero))

{

fread(&capitales,sizeof(struct datos),1,fichero);

if(!feof(fichero))

{

printf("PAIS: %s\n",capitales.pais);

printf("CAPITAL: %s\n",capitales.capital);

printf("\n");

}

}

fclose(fichero);

getch();

}

/*********************************************************************/

/*FUNCIÓN: modificar */

/* */

/*PARÁMETROS: la declaración del fichero y la estructura donde se modificarán los */

/* datos */

/* */

/*VALOR DEVUELTO: ninguno */

/* */

/*********************************************************************/

void modificar(FILE *fichero, struct datos capitales)

{

char nombre_pais[20];

int comparar,donde;

fichero=fopen("capitales.dat","rb+");

if (fichero==NULL)

printf("ERROR\n");

else

{

printf("Introduce el nombre del pais que quieres modificar:\n");

scanf("%s",nombre_pais );

while(!feof(fichero))

{

fread(&capitales,sizeof(struct datos),1,fichero);

if(!feof(fichero))

{

comparar=strcmp(capitales.pais, nombre_pais); /*comparo el nombre del país que introduje

con el país de la estructura*/

if(comparar==0)

{

donde=ftell(fichero)-sizeof(struct datos);

printf("Nuevo nombre del pais: \n");

scanf("%s", capitales.pais);

printf("Su capital: \n");

scanf("%s", capitales.capital);

fseek(fichero,donde,SEEK_SET);

fwrite(&capitales,sizeof(struct datos),1,fichero); fseek(fichero,donde+sizeof(struct datos),SEEK_SET);

}

}

}

}

fclose(fichero);

}

/*********************************************************************/

/*FUNCIÓN: eliminar */

/* */

/*PARÁMETROS: la declaración del fichero y la estructura donde se modificarán los */

/* datos */

/* */

/*VALOR DEVUELTO: ninguno */

/* */

/*********************************************************************/

void eliminar(FILE *fichero, struct datos capitales)

{

char nombre[25];

int busc;

FILE *fichero2;

fichero=fopen("capitales.dat","rb+");

fichero2=fopen("capitales2.dat","wb");

if(fichero==NULL)

printf("Error de apertura\n");

else

{

printf("Introduce el nombre del pais que deseas borrar:\n");

fflush(stdin);

scanf("%s", nombre);

while(!feof(fichero))

{

fread(&capitales,sizeof(struct datos),1,fichero);

if(!feof(fichero))

{

busc=strcmp(capitales.pais,nombre);

if(busc==0)

printf("%s esta eliminado!\n", nombre);

else

fwrite(&capitales,sizeof(struct datos),1,fichero2);

}

}

}

fclose(fichero);

fclose(fichero2);

getch(); //utilizamos este getch para que muestre (este país esta eliminado)

remove("capitales.dat");

rename("capitales2.dat","capitales.dat");

}

/*********************************************************************/

/*FUNCIÓN: determinar capital */

/* */

/*PARÁMETROS: la declaración del fichero y la estructura donde se modificarán los */

/* datos */

/* */

/*VALOR DEVUELTO: ninguno */

/* */

/*********************************************************************/

void determinar_capital(FILE *fichero, struct datos capitales)

{

char nombre[25];

int busc;

fichero=fopen("capitales.dat","rb");

if(fichero==NULL)

printf("Error de apertura\n");

else

{

printf("Introduce el nombre del pais:\n");

fflush(stdin);

scanf("%s", nombre);

while(!feof(fichero))

{

fread(&capitales,sizeof(struct datos),1,fichero);

if(!feof(fichero))

{

busc=strcmp(capitales.pais,nombre);

if(busc==0)

printf("La capital de %s es: %s\n",nombre, capitales.capital);

printf("\n");

}

}

}

fclose(fichero);

}

/*********************************************************************/

/*FUNCIÓN: determinar país */

/* */

/*PARÁMETROS: la declaración del fichero y la estructura donde se modificarán los */

/* datos */

/* */

/*VALOR DEVUELTO: ninguno */

/* */

/*********************************************************************/

void determinar_pais(FILE *fichero, struct datos capitales)

{

char nombre[25];

int busc;

fichero=fopen("capitales.dat","rb");

if(fichero==NULL)

printf("Error de apertura\n");

else

{

printf("Introduce el nombre capital:\n");

fflush(stdin);

scanf("%s", nombre);

while(!feof(fichero))

{

fread(&capitales,sizeof(struct datos),1,fichero);

if(!feof(fichero))

{

busc=strcmp(capitales.capital,nombre);

if(busc==0)

printf("%s es la capial de: %s\n",nombre, capitales.pais);

printf("\n");

}

}

}

fclose(fichero);

}

/*********************************************************************/

/*FUNCIÓN: juego pedir pais */

/* */

/*PARÁMETROS: la declaración del fichero y la estructura donde se modificarán los */

/* datos */

/* */

/*VALOR DEVUELTO: ninguno */

/* */

/*********************************************************************/

void juego_pedir_pais(FILE *fichero,struct datos capitales)

{

char pais[25],resultado[25];

char let;

int resu,i=0,cont=0,j=0,q=0,x;

fichero=fopen("capitales.dat","rb");

for(x=0;x<25;x++)

resultado[x]='*';

if(fichero==NULL)

printf("Error de apertura\n");

else

{

printf("Dime el pais para jugar\n");

fflush(stdin);

scanf("%s",pais);

system("cls");

while(!feof(fichero))

{

fread(&capitales,sizeof(struct datos),1,fichero);

if(!feof(fichero))

{

resu=strcmp(capitales.pais,pais);

if(resu==0)

{

do

{

printf("_ ");

resultado[i]='_';

printf(" ");

q++;

i++;

}while(capitales.capital[i]!='\0');

x=0;

i=0;

do

{

printf("Introduce una letra: ");

fflush(stdin);

scanf("%c",&let);

i=0;

j++;

for(i=0;i<capitales.capital[i];i++)

{

if(let==capitales.capital[i])

{

resultado[i]=let;

cont++;

}

}

x=0;

while(resultado[x]!='*')

{

printf("%c",resultado[x]);

printf(" ");

x++;

}

}while(let!='_');

}

}

}

}

}

/*********************************************************************/

/*FUNCIÓN: juego pedir cpaital */

/* */

/*PARÁMETROS: la declaración del fichero y la estructura donde se modificarán los */

/* datos */

/* */

/*VALOR DEVUELTO: ninguno */

/* */

/*********************************************************************/

void juego_pedir_capital(FILE *fichero, struct datos capitales)

{

char capita[25],resultado[25];

char let;

int resu,i=0,cont=0,j=0,q=0,x;

fichero=fopen("capitales.dat","rb");

for(x=0;x<25;x++)

resultado[x]='*';

if(fichero==NULL)

printf("Error de apertura\n");

else

{

printf("Capital:\n");

fflush(stdin);

scanf("%s",capita);

system("cls");

while(!feof(fichero))

{

fread(&capitales,sizeof(struct datos),1,fichero);

if(!feof(fichero))

{

resu=strcmp(capitales.capital,capita);

if(resu==0)

{

do

{

printf("_ ");

resultado[i]='_';

printf(" ");

q++;

i++;

}while(capitales.pais[i]!='\0');

x=0;

i=0;

do

{

printf("Introduce una letra: ");

fflush(stdin);

scanf("%c",&let);

i=0;

j++;

for(i=0;i<capitales.pais[i];i++)

{

if(let==capitales.pais[i])

{

resultado[i]=let;

cont++;

}

}

x=0;

while(resultado[x]!='*')

{

printf("%c",resultado[x]);

printf(" ");

x++;

}

}while(let!='_');

}

}

}

}

}