Red de conocimiento informático - Material del sitio web - ¿Preguntas sobre programación en lenguaje C para estudiantes de primer año?

¿Preguntas sobre programación en lenguaje C para estudiantes de primer año?

Los boletos se generan conectando dos estaciones según la pregunta, y el monto y la cantidad se utilizan respectivamente como números aleatorios.

Almacenamiento de datos: sitio, ticket y usuario son tres estructuras respectivamente, que se utilizan para corresponder a la base de datos.

Proceso de compra: verifique la validez del valor de entrada-gt; verifique el inventario de boletos-gt; si la compra es exitosa, el flujo de compra del usuario y el inventario de boletos se modificarán simultáneamente. (Los requisitos de las preguntas aquí no están claros y no se especifica el método de compra del usuario). Mi código permite que un usuario compre varios boletos al mismo tiempo y se pueden comprar varios boletos de cada tipo en lotes. Los registros de transacciones de compra se agregan y actualizan automáticamente.

Proceso de reembolso: Verifica los registros de entrada y de compra de los usuarios, y actualiza la información del usuario y del ticket simultáneamente.

Proceso de eliminación: elija eliminar boletos que no hayan sido comprados por el usuario (la función verifica a todos los usuarios, aunque esta pregunta solo requiere un usuario, y la primera dirección de la matriz de usuarios en realidad se pasa como la parámetro).

PD: Esta pregunta implica adiciones, eliminaciones y modificaciones. Es mejor usar una lista vinculada para escribir. Sin embargo, considerando el alcance de su estudio, no utiliza una lista vinculada sino una matriz dinámica. La eliminación de la matriz dinámica tiene en cuenta el uso de la memoria. No solo es necesario mover los bits de forma circular, sino que también es necesario liberar el exceso de direcciones.

Además, en el programa general, para el manejo de excepciones, simplemente devuelvo 0, 1 o -1 para distinguir el éxito y el fracaso básicos. Si desea realizar un procesamiento especial en excepciones individuales, puede modificar el valor de retorno usted mismo y recibir un juicio.

El siguiente es el código:

#include lt;stdio.hgt;

#include lt;stdlib.hgt;

#include lt;string.hgt;

#include lt;time.hgt;

#include lt;windows.hgt;

#include lt;conio .hgt ;

#define MS 5//Número máximo de estaciones

typedef struct station

{

char sid[10] ;

p>

char sName[20];

}STN;

ticket de estructura typedef

{

int tid;/ /Número de billete

STN *ssP; //Estación de inicio

STN *tsP //Estación terminal

int valor; ; //Tarifa

p>

int number; //Cantidad

}TKT;

typedef struct userInfo//Usuario

{

char uid[20]; //número de tarjeta de identificación

int cnt; //Número de tipos de boletos comprados

int *btids; ID de todos los boletos comprados

int *btNum; //Matriz de todas las cantidades de boletos comprados

}UIFO;

int init(STN stns[MS], TKT **tkts); //Inicialización de estación y datos del ticket

int disAllTickets(TKT *tkts);

int buyTicket(UIFO *uifo, TKT *tkts); devuelve 0

int reTicket(UIFO *uifo, TKT *tkts); //La excepción devuelve 0

int showMenu(UIFO *uifo, TKT *tkts);

int delIntByIndex(int ​​​​*nums, int len, int index); // Elimina el elemento correspondiente a la matriz de enteros dinámica nums a través del índice de subíndice, libera la dirección sobrante, devuelve la longitud de la matriz eliminada y devuelve -1 if excepción

int delTkts(UIFO * uifos, int len, TKT *tkts); //Elimina el ticket especificado (verifica el grupo de usuarios, siempre que haya un usuario comprando, no se puede eliminar)

int cnt; //Número de tipos de tickets

int main()

{

STN stns[MS];

TKT *tkts=NULL;

UIFO uifo={ "321002199902050614", 0, NULL, NULL};

srand(time(NULL)

p>

cnt=init(stns, amp; tkts);

printf("***generar d grupos de boletos (dos boletos de ida y vuelta para cada grupo, ***d tipos de tickets)\n\n", cnt/2, cnt);

printf("Presione Presione cualquier tecla para continuar. . . .

\n"), getch();

system("cls");

showMenu(amp; uifo, tkts);

devuelve 0;

}

int showMenu(UIFO *uifo, TKT *tkts)

{

int n=5;

printf("(1) Comprar boleto\n");

printf("(2) Reembolsar boleto\n");

printf("(3) Eliminar boleto \n");

printf("(4) Mostrar todos los tickets\n");

printf("(0) Salir\n");

while(nlt;0 || ngt;4)

scanf("d",amp;n);

switch(n)

{

caso 0: devuelve 0;

caso 1: if(!buyTicket(uifo, tkts)) devuelve 0;

caso 2: if( !reTicket(uifo, tkts)) devuelve 0;

caso 3: if(!delTkts(uifo, 1, tkts)) devuelve 0; Función de eliminación, los usuarios con varios nombres deben pasar la primera dirección de la matriz. Dado que la demostración solo tiene un usuario (len=número correspondiente de usuarios), solo se pasa la dirección del usuario (len=1).

caso 4: disAllTickets(tkts );

}

showMenu(uifo, tkts);

retorno

}

int disAllTickets(TKT *tkts)

{

int i

for(i=0; ilt; cnt; i )

printf("Número: 2d Distancia: s-s Tarifa: 3d Votos restantes: d\n", tkts[i].tid, tkts[i].ssP-gt; sName, tkts [i].tsP-gt; sName, tkts[i].value, tkts[i].number);

printf("Presione cualquier tecla para continuar. . . .

\n"), getch();

system("cls");

retorno 1;

}

int delIntByIndex (int *nums, int len, int index)

{

int i, *temp=NULL;

if(indexgt;len-1) return -1;

for(i=index; ilt; len-1; i )

números[i]=nums[i 1]; --;

if(len)

{

temp=(int *)realloc(nums, sizeof(int)*len);

if(!temp) return -1

nums=temp

}

else

gratis(nums) );

return len;

}

int reTicket(UIFO *uifo, TKT *tkts)

{

int i, j, tid, n, index, len, flag=0;

printf("Registro de compra del usuario actual:\n"); =0;ilt;uifo-gt;cnt;i )

{

for(j=0;jlt;cnt;j )

if(tkts [j].tid==uifo-gt; btids[i]) index=j;

printf("--número de boleto: d, estación inicial y final: s-s, número de boletos comprados: d \n" , uifo-gt; btids[i], tkts[index].ssP-gt; sName, tkts[index].tsP-gt; sName, uifo-gt; btNum[i]);

}

printf("Ingrese el ID del boleto y el número de boletos que se reembolsarán:"), scanf("dd",amp;tid,amp;n);

for(i=0 ; ilt; uifo-gt; cnt; i )

if(uifo-gt; btids[i]==tid amp; amp; uifo-gt; btNum[i]gt ;=n)

{

for(j=0;jlt;cnt;j)

if(tkts[j].tid==uifo- gt;btids[i] ) tkts[j].number =n; // Modifica sincrónicamente los votos restantes del boleto correspondiente

uifo-gt; registro de compra del usuario

if(uifo-gt; btNum[i]==0)//Cuando se reembolsen todos los boletos de un determinado tipo, elimine el registro

{

len=delIntByIndex(uifo-gt; btNum, uifo-gt; cnt, i

);

if(len==-1) devuelve 0;

len=delIntByIndex(uifo-gt; btids, uifo-gt; cnt, i);

if(len==- 1) devolver 0;

uifo-gt; cnt=len;

}

bandera=1

descanso

p>

p>

}

if(flag)

printf("¡Reembolso exitoso!\n");

else

printf("No existe tal registro de compra o la cantidad ingresada no coincide\n");

printf("Presione cualquier tecla para continuar...

\n"), getch();

system("cls");

return 1;

}

int buyTicket (UIFO *uifo, TKT *tkts)

{

char spn[20], tpn[20];

int i, n=-1, index=-1, *temp=NULL;

for(i=0;ilt;cnt;i)

printf("Número: 2d distancia: s-s tarifa: 3d restante Número de votos: d\n", tkts[i].tid, tkts[i].ssP-gt; sName, tkts[i].tsP-gt; sName, tkts[i].value, tkts[i].number ) ;

printf("Ingrese el nombre de la estación de origen y el nombre de la estación de destino:"), scanf("ss",spn,tpn);

for(i=0; ilt; cnt; i )

if(strcmp(tkts[i].ssP-gt;sNombre, spn)==0 amp;amp; strcmp(tkts[i].tsP-gt;sNombre, tpn)==0)

{

printf("Tarifa del boleto s-s: 3d votos restantes: d\n", tkts[i].ssP-gt; sName, tkts [ i].tsP-gt; sName, tkts[i].valor, tkts[i].número

index=i

break; > }

if(index==-1)

printf("¡La compra falló! No hay boleto para este viaje\n");

{

while(nlt;=0)

{

printf("Ingrese la cantidad a comprar (mayor que 0): "), scanf("d",&n);

if(tkts[index].numberlt;n)

printf("Error: Número insuficiente de tickets o ingrese un valor numérico ¡Fuera de rango! ¡Vuelva a ingresar! \n"), n=-1;

}

for(i=0; ilt; uifo-gt; cnt; i )//Verificar registros de compras de usuarios, boletos duplicados Cantidad acumulada de compra, nuevos registros para diferentes tickets

{

if(uifo-gt; btids[i]==tkts[index].tid)

{

printf("Se compraron D boletos para este boleto. Ahora se compraron d boletos nuevamente. Se compraron un total de d boletos\n", uifo-gt; btNum[i], n, uifo-gt; btNum[i] n);

uifo-gt; btNum[i] =n;

descanso;

}

p>

}

if(i==uifo-gt;cnt)//No se detectan registros duplicados, agregue nuevos

{

if (!uifo-gt; btids)

{

uifo-gt; btids=(int *)malloc(sizeof(int));

si ( !uifo-gt; btids) devuelve 0;

uifo-gt; btNum=(int *)malloc(sizeof(int)); btNum ) devuelve 0;

}

else

{

temp=(int *)realloc(uifo-gt; btids, tamaño de (int)*(uifo-gt; cnt 1));

if(!temp) devuelve 0;

uifo-gt; p > temp=(int *)realloc(uifo-gt; btNum, sizeof(int)*(uifo-gt; cnt 1));

if(!temp) return

uifo-gt; btNum=temp;

}

uifo-gt; btids[uifo-gt;cnt]=tkts[índice].tid;

printf("Se compraron D boletos\n", (uifo-gt; btNum[uifo-gt; cnt]=n));

tkts[index].number-=n; /p>

uifo-gt; cnt;

printf("Registro de compra del usuario:\n"); cnt; i )

printf("--número de boleto: d, número de boletos comprados: d\n", uifo-gt; btids[i], uifo-gt; btNum[i]);

}

printf("¡Esta vez se compraron con éxito boletos d para s-s! \n", tkts[index].ssP-gt; sName, tkts[index].tsP-gt; sName, n);

}

printf("Presione cualquier tecla continuar....

\n"), getch();

system("cls");

retorno 1;

}

int delTkts (UIFO *uifos, int len, TKT *tkts)//len: el número de todos los usuarios comprados

{

int i, j, k, tid, flag=0, index ;

for(i=0; ilt; cnt; i )

printf("Número: 2d distancia: s-s tarifa: 3d votos restantes: d\n", tkts[ i].tid, tkts[i].ssP-gt; tkts[i].tsP-gt; tkts[i].valor, tkts[i].número

printf); ("Ingrese el número de ticket que desea eliminar:"), scanf("d",amp;tid);

for(i=0;ilt;cnt;i)

if(tid==tkts[i].tid)

{

index=i

flag=1; for (j=0;jlt;len;j)//Verificar todos los registros de compras de los usuarios

{

for(k=0;klt;uifos[j].cnt;k )

if(uifos[j].btids[k]==tid)

{

flag=0

printf; ( "El usuario ha comprado el billete y no se puede eliminar. ¡Primero se debe completar el reembolso!\n"); > if(!flag)

romper

}

romper

}

if(! flag) printf(" Error al eliminar, el valor de entrada está fuera de rango o no se puede eliminar \n"); ;

if (cnt==0)

{

gratis(tkts[index].ssP

gratis(tkts); [index].tsP);

p>

gratis(amp;tkts[index]);

}

else

{

gratis(tkts[ index].ssP);

gratis(tkts[index].tsP);

for(i=index;ilt;cnt ;i)

tkts [i]=tkts[i 1];

>

tkts[cnt].ssP=NULL;

tkts[cnt].tsP=NULL

gratis(amp; tkts[cnt]);

}

printf("¡Eliminar correctamente!\n");

}

printf("Presione cualquier tecla para continuar...\n "), getch();

sistema("cls");

retorno 1;

}

int init(STN stns[MS], TKT **tkts)

{

TKT *tTemp=NULL;

int i, j, n, v, cnt=2 ;

static int id=1;

printf("Generar sitio:\n");

for(i=0;ilt;MS;i , id )

{

sprintf(stns[i].sid, "Estación 03d", id

sprintf(stns[i].sName); , "SN03d", id);

printf("----Nombre del sitio: s.

ID del sitio: s\n", stns[i].sid, stns[i].sName);

}

printf("Calcular todas las conexiones del sitio y generar tickets (El El billete es de ida y vuelta, por lo que se generan dos conjuntos de billetes de ida y vuelta a la vez):\n");

for(i=0; ilt; MS; i )

> for(j=i 1 ; jlt; MS; j )

{

if(!(*tkts))

{

*tkts=(TKT *)malloc(sizeof(TKT)*2);

if(!(*tkts)) return -1;

}

else

{

tTemp=(TKT *)realloc((*tkts),sizeof(TKT)*cnt);

if(! tTemp) return -1;

*tkts=tTemp;

}

n=rand()4 2 //2~5 tickets aleatorios para cada uno tipo (el número total garantizado es mayor que 20)

v=rand()201 50; //Tarifa generada aleatoriamente 50~250

(*tkts)[cnt-1]. tid=cnt;

(*tkts)[cnt-1].ssP=amp;stns[i];

(*tkts)[cnt-1].tsP=amp ;stns[j];

(*tkts)[cnt-1].value=v;

(*tkts)[cnt-1].number=n;

(*tkts) [cnt-2].tid=cnt-1;

(*tkts)[cnt-2].ssP=amp;stns[j];

(*tkts)[ cnt-2].tsP=amp;stns[i];

(*tkts)[cnt-2].value=v;

(*tkts)[cnt-2 ].number=n;

printf("----Se generan D boletos de ida y vuelta entre sys, y la tarifa es d (aleatoria)\ n", stns[i].sName , stns[j].sName, n, v);

cnt =2;

}

return cnt -2;

}

//No es fácil responder la pregunta. Si se acepta, no elimine la pregunta sin motivo.