El problema es que cuando pasas
la estructura c1 a leer_clientes, manda una copia, y esta copia se le asigna al "parametro c1" (el c1 de la función) Por lo tanto cuando llenas los datos, se los llenas a c1 parámetro y no a c1 de main.
Hay 2 formas, (no sé si más, pero te muestro las 2). La primera es con punteros y la segunda es tal como lo tienes pero devolviendo (con return) un dato tipo cliente. Te dejo el código:
Código C++:
Ver original#include<iostream>
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
struct clientes
{
char nombre [50];
int numero_unidades;
float precio;
char estado; //p: pagado, m: moroso, a: atrasado
}c1;
/* FORMA POR REFERENCIA (con puntero): */
/*void leer_clientes (clientes *c1)
{
cout<<"Introduzca el nombre del cliente: ";
cin.getline(c1->nombre, 50);
cout<<"Introduzca el numero de unidades: ";
cin>>c1->numero_unidades;
cout<<"Introduzca el precio: ";
cin>>c1->precio;
cout<<"Introduzca el estado (p: pagado, m: moroso, a: atrasado): ";
cin>>c1->estado;
}*/
/* FORMA POR VALOR */
clientes leer_clientes (clientes c1) //Retornas un datos tipo cliente
{
cout<<"Introduzca el nombre del cliente: ";
cin.getline(c1.nombre, 50);
cout<<"Introduzca el numero de unidades: ";
cin>>c1.numero_unidades;
cout<<"Introduzca el precio: ";
cin>>c1.precio;
cout<<"Introduzca el estado (p: pagado, m: moroso, a: atrasado): ";
cin>>c1.estado;
return c1; //regresamos los datos del cliente
}
void escribe_clientes (clientes c1)
{
cout <<"Nombre del cliente: "<<c1.nombre<<endl;
cout <<"Numero de unidades: "<<c1.numero_unidades<<endl;
cout <<"Precio: "<<c1.precio<<" €"<<endl;
cout <<"Estado: ";
switch (c1.estado)
{
case 'p': cout <<"pagado"; break;
case 'm': cout <<"moroso"; break;
case 'a': cout <<"atrasado"; break;
}
cout<<endl;
}
int main()
{
//leer_clientes (&c1); //<- Forma Referencia con puntero
c1 = leer_clientes(c1); //<- Forma por Valor sin puntero
escribe_clientes (c1);
return EXIT_SUCCESS;
}