En este artículo, exploraremos cómo crear un programa en C que lea un archivo de texto con información de ventas, procese los datos, y genere un informe con los totales de ventas, productos más vendidos y las ventas más altas de cada día. Este ejercicio te permitirá profundizar en el manejo de archivos, estructuras de datos, y el procesamiento de información en C. Vamos a detallar cada parte del código y su función para entender cómo trabaja el programa.
Descripción General del Problema
Imagina que tienes un archivo de texto (ventas.txt
) donde cada línea representa una transacción de ventas diarias. Cada línea contiene cinco campos separados por comas:
- ID de la transacción.
- Fecha de la transacción.
- ID del producto.
- Cantidad vendida.
- Precio unitario.
El objetivo del programa es:
- Leer cada línea del archivo y extraer estos datos.
- Calcular el total de ventas por día.
- Identificar el producto más vendido y la venta más alta (en términos de valor) de cada día.
- Guardar el informe generado en un nuevo archivo llamado
informe_ventas.txt
.
Estructura del Código
1. Definición de la Estructura Transaccion
Para gestionar cada línea de datos, definimos una estructura en C llamada Transaccion
que representa cada transacción:
typedef struct {
int id_transaccion;
char fecha[11];
int id_producto;
int cantidad;
float precio_unitario;
float total;
} Transaccion;
Cada transacción almacena el id_transaccion
, la fecha
, el id_producto
, la cantidad
vendida, el precio_unitario
, y el total
calculado para esa transacción.
2. Función cargar_transacciones
Esta función abre el archivo ventas.txt
, lee cada línea y extrae los datos en el formato adecuado:
int cargar_transacciones(const char *nombre_archivo, Transaccion transacciones[]) {
FILE *archivo = fopen(nombre_archivo, "r");
if (archivo == NULL) {
perror("Error al abrir el archivo");
return -1;
}
char linea[MAX_LINEA];
int contador = 0;
while (fgets(linea, sizeof(linea), archivo) && contador < MAX_TRANSACCIONES) {
sscanf(linea, "%d,%10[^,],%d,%d,%f",
&transacciones[contador].id_transaccion,
transacciones[contador].fecha,
&transacciones[contador].id_producto,
&transacciones[contador].cantidad,
&transacciones[contador].precio_unitario);
transacciones[contador].total = transacciones[contador].cantidad * transacciones[contador].precio_unitario;
contador++;
}
fclose(archivo);
return contador;
}
Esta función:
- Abre el archivo en modo de lectura.
- Lee cada línea y usa
sscanf
para dividir los valores y almacenarlos en la estructuraTransaccion
. - Calcula el total de cada transacción (
cantidad * precio_unitario
) y lo guarda en el campototal
.
3. Función generar_informe
Esta función genera el informe en informe_ventas.txt
, agrupa las transacciones por fecha y muestra:
- El total de ventas de cada día.
- El producto más vendido.
- La venta más alta en términos de valor.
void generar_informe(Transaccion transacciones[], int num_transacciones) {
FILE *informe = fopen("informe_ventas.txt", "w");
if (informe == NULL) {
perror("Error al crear el archivo de informe");
return;
}
char fecha_actual[11] = "";
float total_ventas = 0;
int producto_mas_vendido = 0;
int max_cantidad = 0;
float venta_mas_alta = 0;
for (int i = 0; i < num_transacciones; i++) {
if (strcmp(fecha_actual, transacciones[i].fecha) != 0) {
if (i > 0) {
fprintf(informe, "Fecha: %s | Total ventas: %.2f | Producto más vendido: %d | Venta más alta: %.2f\n",
fecha_actual, total_ventas, producto_mas_vendido, venta_mas_alta);
}
strcpy(fecha_actual, transacciones[i].fecha);
total_ventas = 0;
producto_mas_vendido = transacciones[i].id_producto;
max_cantidad = transacciones[i].cantidad;
venta_mas_alta = transacciones[i].total;
}
total_ventas += transacciones[i].total;
if (transacciones[i].cantidad > max_cantidad) {
max_cantidad = transacciones[i].cantidad;
producto_mas_vendido = transacciones[i].id_producto;
}
if (transacciones[i].total > venta_mas_alta) {
venta_mas_alta = transacciones[i].total;
}
}
fprintf(informe, "Fecha: %s | Total ventas: %.2f | Producto más vendido: %d | Venta más alta: %.2f\n",
fecha_actual, total_ventas, producto_mas_vendido, venta_mas_alta);
fclose(informe);
}
Esta función:
- Recorre cada transacción, calculando el total de ventas y actualizando los valores de
producto_mas_vendido
yventa_mas_alta
. - Si detecta una nueva fecha, escribe el informe del día anterior y reinicia las variables para el día actual.
- Finalmente, escribe los resultados en
informe_ventas.txt
.
4. Función main
La función main
ejecuta la carga de transacciones y la generación del informe:
int main() {
Transaccion transacciones[MAX_TRANSACCIONES];
int num_transacciones = cargar_transacciones("ventas.txt", transacciones);
if (num_transacciones < 0) {
printf("No se pudo cargar el archivo de ventas.\n");
return 1;
}
generar_informe(transacciones, num_transacciones);
printf("Informe generado en 'informe_ventas.txt'.\n");
return 0;
}
Esta función:
- Carga las transacciones desde el archivo
ventas.txt
. - Si la carga es exitosa, genera el informe.
Conclusión
Este ejercicio ofrece una introducción sólida al manejo de archivos y estructuras de datos en C. La combinación de lectura de archivos, procesamiento de datos y escritura de un informe proporciona una práctica completa que puede adaptarse a aplicaciones más avanzadas. Con estos fundamentos, podrás abordar tareas similares de procesamiento y análisis de datos en tus proyectos futuros en C.
¿QUÉ TE HA PARECIDO EL ARTÍCULO? Danos tu opinión al final de la página.
Deja tu comentario y ayúdanos a crecer.
¡SÍGUENOS EN TUS REDES FAVORITAS!
AYUDANOS A CRECER Y QUE LLEGUEMOS A TODAS LAS PERSONAS QUE NOS NECESITANA. SÍGUENOS EN TUS REDES.
Entra AQUÍ y elíge donde seguirnos.
NUESTRAS ÚLTIMAS PUBLICACIONES
- La importancia de mantener un ritmo de estudio durante las navidades.
- Cómo Multiplicar Matrices en Java: Guía Completa con Ejemplo Práctico
- Triunfos y logros de nuestra Academia SanRoque
- Herramientas Imprescindibles para Realizar Ingeniería Inversa en Java
- ¿A qué nivel de conversación en inglés estás dispuesto a llegar con Academia SanRoque?
- Cómo Resolver una Ecuación de Segundo Grado con GNU Octave
- Cuando vienes a la Academia SaRoque justo antes del examen final.
- 25N Día Internacional para la Eliminación de la Violencia contra la Mujer
- Cuando el profesor nos da la última oportunidad.
ELIGE TU RED FAVORITA Y SÍGUENOS.
AYUDANOS A CRECER Y A LLEGAR A TODAS LAS PERSONAS QUE NOS NECESITAN.
Contenido restringido
Comments are closed