Autor Tema: Programa en c

0 Usuarios y 1 Visitante están viendo este tema.

17 Marzo, 2020, 04:21 pm
Leído 3237 veces

mg

  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 530
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
Se pide
23.- Se desea tener información almacenada de direcciones de lugares. De cada lugar se
necesita saber el nombre, la calle, la ciudad, la provincia y el código postal. Implemente
utilizando estructuras y registros un programa que permita:
a) Añadir un elemento.
c) Borrar un elemento.
d) Buscar un elemento.
e) Listar todos los datos.


alguien sabria decirme por qué me da error al compilar?
#include <stdio.h>
#include <string.h>
#define MAX 100

typedef struct{
    char nombre[10];
    char calle[20];
    char ciudad [10];
    char provincia [10];
    int codigo_postal;
}Subject;

int menu(){
    int choice;
    printf("\n");
    printf("--------------------------------------------------------------------------------------------------\n");
    printf("\tMENU\n");
printf("\t1.Anadir un elemento\n");
printf("\t2.Borrar un elemento\n");
printf("\t3.Buscar un elemento\n");
printf("\t4.Lista todos los datos\n");
printf("\t5.Salir\n");
printf("Introduzca eleccion: ");
scanf("%d",&choice);
printf("--------------------------------------------------------------------------------------------------\n");
return choice;
}
void anadir (Subject s[],int counter){
   if(counter<MAX)
   {
     fflush(stdin);
     printf("Nombre: ");
     gets(s[counter].nombre);
     printf("\ncalle: ");
     gets(s[counter].calle);
     printf("\nciudad : ");
     gets(s[counter].ciudad);
     printf("\nprovincia: ");
     gets(s[counter].provincia);
     printf("\ncodigo postal: ");
     fflush(stdin);
     scanf("%d",&s[counter].codigo_postal);
        }
   else
     printf("No puede introducir mas pacientes\n");
}


void borrar (Subject s[], int pos){
    int i;
    for(i=pos+1;i<MAX;i++){
        s[i-1]=s;
    }
}
void buscar (Subject s[], int pos){
     printf("Nombre: ");
  puts(s[pos].nombre);
  printf("calle: ");
  puts(s[pos].calle);
  printf("ciudad: ");
  puts(s[pos].ciudad);
  printf("provicia: ");
  puts(s[pos].provincia);
  printf("Codigo postal: %d",s[pos].codigo_postal);
 }
void lista (Subject s[],int counter){
    int i;
for(i=0;i<=counter;i++){
    printf("\n");
    puts(s.nombre);
}
}
void main (){
    Subject s[MAX];
int counter=0,choice,pos;
choice=menu();
while(choice != 5){
     switch(choice)
     {
        case 1: {anadir(s, counter);
                counter++;
                break;}
        case 2: {printf("Posicion del paciente a borrar: ");
                 scanf("%d",&pos);
                 borrar(s, pos);
                 counter--;
                 break;}
        case 3: {printf("Posicion del paciente a buscar: ");
                 scanf("%d",&pos);
                 buscar(s, pos);
                 break;}
        case 4: {lista(s, counter);
                 break;}
        default:printf("Opcion incorrecta\n");
     }
   choice=menu();
}
}
Este código ya está corregido

17 Marzo, 2020, 05:05 pm
Respuesta #1

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,739
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Vean mis posts activos en mi página personal
    • Mis posts activos (click aquí)
Para este tipo de consultas debieras volcar aquí una copia de los mensajes del compilador.

De todas maneras, veo que has colocado entre llaves los

break;

Me resulta raro.
No tengo claras las reglas de sintaxis
de forma exhaustiva de switch,
pero esa puede ser una fuente de error.

Un error claro está en la fumción lista.
Subject pretende ser puntero o array
y lo has leído como estructura al imprimir.
Falta el subíndice.

17 Marzo, 2020, 05:23 pm
Respuesta #2

Abdulai

  • Moderador Global
  • Mensajes: 2,862
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
Tiene montones de errores.

- El primer main() sobra.

- gets(s[counter].codigo_postal);   
 s[].codigo_postal es entero y va a recibir caracteres

- s[i-1]=s;    ?????

- printf("Codigo postal: %d",codigo_postal);     
  debe ser s[pos].codigo_postal

- void lista (Subject s[]){
  for(i=0;i<=counter;i++){
     printf("\n");
     puts(s.nombre);
  }
  }
  no está definido counter


Hay mas,  tenés que ir paso a paso leyendo la lista de errores e ir corrigiendo.


18 Marzo, 2020, 11:29 am
Respuesta #3

mg

  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 530
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
He modificado el programa, parece que hoy estaba mas lúcido, y ahora ya compila, sin embargo no funciona correctamente. Cuando ejecuto y entro en la opcion 1 (añadir), esta funcion se ejecuta en bucle, incluso despues de ejecutar el switch
void main (){
    Subject s[MAX];
int counter=0,choice,pos;
choice=menu();

while(choice != 5)
  {
     switch(choice)
     {
        case 1: {anadir(s, counter);
                counter++;
                break;}
        case 2: {printf("Posicion del paciente a borrar: ");
                 scanf("%d",&pos);
                 borrar(s, pos);
                 counter--;
                 break;}
        case 3: {printf("Posicion del paciente a buscar: ");
                 scanf("%d",&pos);
                 buscar(s, pos);
                 break;}
        case 4: {lista(s, counter);
                 break;}
        default:printf("Opcion incorrecta\n");
     }
     choice=menu();
}
}


sigue ejecutandolo en bucle, no entiendo el porque.
Modifique el programa en la cabecera del tema para no ocupar toda la pagina.

18 Marzo, 2020, 04:45 pm
Respuesta #4

ingmarov

  • Moderador Global
  • Mensajes: 5,424
  • País: hn
  • Karma: +0/-0
  • Sexo: Masculino
Hola

La captación del  choice debería estar dentro del ciclo do al inicio, no fuera.

Saludos
No te confíes, revisa lo que escribo. Yo también me equivoco.
Odio el autocorrector de Android...

18 Marzo, 2020, 05:40 pm
Respuesta #5

mg

  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 530
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
Bien ahora ya funciona todo a la perfeccion, necesitaba de la instruccion fflush(stdin) para poder escanear las cadenas de texto y no bloquearse el programa, muchas gracias a todo por su ayuda, dejo el codigo corregido arriba por si a alguien le pueda servir

18 Marzo, 2020, 09:24 pm
Respuesta #6

administrador

  • Administrador
  • Mensajes: 1,595
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
Qué lástima que borraste el problema original: ahora el resto de la discusión pierde sustento.
Si todavía conservás el original, convendría que vuelvas a editar y lo restaures.
En cuanto al código correcto, lo podés agregar en un mensaje final.

19 Marzo, 2020, 11:53 am
Respuesta #7

mg

  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 530
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
Tomo nota para la siguiente ocasion.

Saludos

19 Marzo, 2020, 02:09 pm
Respuesta #8

administrador

  • Administrador
  • Mensajes: 1,595
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
¿Para la siguiente ocasión?
¿No conservás en ninguna parte el original, o sea el que tenía los errores?
Si no es así, tendremos que eliminar todo el hilo.
Considerá que cada problema, junto con sus soluciones, suele ser de utilidad para otros participantes.