Los guerreros ayudan a crear programas en C
#include
#include
#include
#include
#include
#define MAX_NAME_LEN 32
#define MAX_PWD_LEN 32
typedef struct _StudentInfo
{
nombre de char[MAX_NAME_LEN + 1]
pwd de char[MAX_PWD_LEN + 1]; >
int sin firmar correcto;
int sin firmar incorrecto
estructura _StudentInfo *siguiente
}StudentInfo;
StudentInfo* GetNode(StudentInfo *head, char *name)
{
StudentInfo *nodo = head;
while (nodo)
{
if (strcmp(nodo-> nombre, nombre) == 0)
{
Devolver nodo;
}
nodo = nodo->siguiente;
}
Devuelve NULL; StudentInfo* GetPriorNode(StudentInfo *head, StudentInfo *node)
{
StudentInfo *prior = head;
while (antes)
{
si (anterior->siguiente == nodo)
{
retorno anterior;
}
anterior = anterior->siguiente;
}
return NULL;
}
int AddStudentInfo(StudentInfo **head, StudentInfo *info)
{
StudentInfo *nodo;
if (nodo = GetNode(* head, info->nombre))
{
return 0;
}
/* Nuevo nodo de estudiante*/
nodo = (StudentInfo *) malloc( sizeof(StudentInfo));
* node = *info;
/* Agregar nuevo nodo a la lista vinculada*/
if (*head ) p>
{
nodo->siguiente = (*head)->siguiente;
(*head)->siguiente = nodo;
}
else
{
nodo->siguiente = NULL;
*head = nodo;
}
return 1;
}
int AddStudent(StudentInfo * * head, char *nombre, char *contraseña)
{
Información de StudentInfo;
strcpy(info.nombre, nombre);
strcpy(info.pwd, pwd);
info.right = 0;
info.wrong = 0;
info.pwd = 0;
info.pwd = 0.
incorrecto = 0;
return AddStudentInfo(head, &info);
}
void RemoveStudentInfo(StudentInfo **head, StudentInfo *node)
{
StudentInfo *prior;
if (prior = GetPriorNode(*head, node))
{
anterior ->siguiente = nodo->.next;
}
else
{
*head = nodo->siguiente;
}
free(nodo);
}
int RemoveStudent(StudentInfo ** head, char *nombre)
{
StudentInfo *nodo;
if (nodo = GetNode(*head, nombre))
{
RemoveStudentInfo (cabeza, nodo);
Devuelve 1;
}
De lo contrario
{
Devuelve 0;
}
}
void RemoveAllStudent(StudentInfo **head)
{
StudentInfo * nodo = *cabeza, *temp;
while (nodo)
{
temp = nodo->siguiente;
libre (nodo);
nodo = temp;
}
*cabeza = NULL;
}
void ShowStudentInfo (StudentInfo *nodo)
{
printf("Nombre: nombre, nodo->.nombre, nodo->contraseña, nodo->correcto, nodo->incorrecto) ;
}
void PrintStudent(StudentInfo *head, char *name)
{
StudentInfo *node;
if (nodo = GetNode(head, name))
{
ShowStudentInfo(nodo);
}
else p>
{
printf(" Este estudiante no está matriculado, no hay información.\n");
}
}
void PrintAllStudent(StudentInfo *head)
{
StudentInfo *nodo = head;
int i = 1;
while (nodo)
{
printf("%d ", i);
ShowStudentInfo(nodo);
nodo = nodo->siguiente;
i+
+;
}
}
# define ARCHIVO DE DATOS "D./\\mdd:\\mdd.
data"
/* Variables globales*/
StudentInfo *g_StudentInfoList = NULL;
StudentInfo *g_LogStudent = NULL;
void LoadStudentInfo ()
{
ARCHIVO *infile;
Información de StudentInfo;
infile = fopen(DATAFILE, "rb");
if(!infile)
{
printf("¡Error al abrir DATAFILE, no se puede leer la información del estudiante!\n");
return;
}
while (fread(&info, sizeof(StudentInfo), 1, infile))
{
AddStudentInfo(&g_ StudentInfoList, &info);
}
fclose(infile);
printf("¡Leí correctamente la información del estudiante!\n"); p>
p>
}
void StoreStudentInfo()
{
ARCHIVO *outfile;
StudentInfo * nodo;
outfile = fopen(DATAFILE, "wb");
if (!outfile)
{
printf(" ¡No se pudo abrir DATAFILE, no se pudo almacenar la información del estudiante \n");
return;
}
node = g_StudentInfoList;
while (nodo)
{
fwrite(nodo, tamañode(StudentInfo), 1, archivo de salida);
nodo = nodo->siguiente; p>
}
fclose(outfile);
printf("¡Almacenando exitosamente la información del estudiante! \n");
}
void ReadString(const char *hint, char *str)
{
hacer p>
{
printf("%s", sugerencia);
if (scanf("%s", str) ! = 1)
{
printf("Error de formato de entrada, ¡vuelva a escribir!\n");
fflush(stdin);
continuar;
}
fflush(stdin);
descanso;
}
mientras (1);
}
void main()
{
int op;
nombre de char[MAX_NAME_LEN + 1], pwd[MAX_
PWD_LEN + 1], rpwd[MAX_PWD_LEN + 1];
LoadStudentInfo();
srand(time(NULL));
{
printf("Menú:\n1. iniciar sesión\n2. registrarse\n3. cambiar contraseña\n4.mostrar información del estudiante registrado\n7. mostrar toda la información del estudiante registrado\n8. eliminar estudiante registrado información\n9.Eliminar información del estudiante registrado\n9.Eliminar toda la información del estudiante registrado\n0.Salir\n");
hacer
{
op = getch();
}
while (op < '0' | op > '9');
putchar (op);
putchar('\n');
cambiar (op)
{
caso '1':
ReadString ("Ingrese el nombre:", nombre);
ReadString("Ingrese la contraseña:", pwd
if (g_LogStudent = GetNode(g_StudentInfoList, nombre)) p>
{
if (strcmp(g_LogStudent->pwd, pwd) == 0)
{
printf("Inicio de sesión exitoso.\ n");
}
else
{
printf("Contraseña incorrecta, inicio de sesión fallido.\n");
g_LogStudent = NULL;
}
}
else
{
printf ("El estudiante no está registrado, el inicio de sesión falló.\n");
}
descanso;
caso '2':
ReadString("Ingrese el nombre:", nombre);
ReadString("Ingrese la contraseña:", pwd);
ReadString("Ingrese la contraseña:" , rpwd);
if (strcmp(pwd, rpwd) == 0)
{
if (AddStudent(&g_StudentInfoList, nombre, pwd))
{
printf("Registro exitoso..\n");
}
else
{
printf("El estudiante ya existe, el registro falló
ed.\n");
}
}
else
{
printf("El las contraseñas ingresadas dos veces no son las mismas, el registro falló \n");
}
break;
caso '3':
if (!g_LogStudent)
{
printf("¡No hay ningún estudiante conectado, no se puede cambiar la contraseña!\n");
break;
}
ReadString("Ingrese la contraseña nuevamente:", pwd);
ReadString("Ingrese la contraseña nuevamente:", rpwd);
if (strcmp(pwd, rpwd) == 0)
{
strcpy(g_LogStudent->pwd, pwd);
printf( "La contraseña se cambió correctamente.\n");
}
break;
case '4':
if (!g_LogStudent )
{
printf("No hay ningún estudiante conectado actualmente, ¡no puede ver las calificaciones!\n");
break;
}
printf("Número total de preguntas: %d\n Número de preguntas respondidas correctamente: %d\n", g_LogStudent->right + g_LogStudent->wrong, g_LogStudent->. derecha);
ruptura;
caso '5':
if (!g_LogStudent)
{
printf("Ningún estudiante ha iniciado sesión actualmente, ¡no puede ver las calificaciones! \n");
break;
}
mientras (1)
{
int a , o, b, r, n, cho;
a = rand() % 1000;
o = rand() % 4;
b = rand() % 1000;
b = rand() 1000;
cambiar (o)
{
caso 0:
o = '+';
r = a + b;
descanso;
caso 1:
o = '-';
r = a - b;
descanso;
caso 2:
o = '* ';
r = a * b;
descanso;
caso 3:
o = '/';
/* No hay divisor entre 0*/
mientras (
b == 0)
{
b = rand() % 1000;
}
/* Realizar división de enteros*/
a *= b;
r = a / b;
romper;
}
printf ( "preguntar: %d %c %d = ", a, o, b);
while (scanf("%d", &n) != 1)
{
printf("Error de formato de entrada, ¡vuelva a escribir!\n");
fflush(stdin);
}
fflush ( stdin);
if (r == n)
{
g_LogStudent->right++;
printf("Respuesta correcta ! \n");
}
else
{
g_LogStudent->incorrecto++;
printf ( "Respuesta incorrecta, la respuesta correcta es %d!\n", r);
}
printf("¿Continuar la prueba (Y/N )?");
p>hacer
{
cho = toupper(getch());
}
mientras ( cho ! = 'Y' && cho ! = 'N');
putchar(cho);
putchar('\n');
si (cho = = 'N')
{
descanso;
}
}
descanso;
caso '6':
ReadString("Ingrese el nombre:", nombre);
PrintStudent(g_StudentInfoList, nombre);
break ;
caso '7':
PrintAllStudent(g _StudentInfoList);
printf("Pantalla completa.\n");
break;
case '8':
ReadString("Por favor ingrese nombre:", nombre);
if (RemoveStudent(&g_StudentInfoList, nombre))
{
printf("La información del estudiante se eliminó correctamente.\n");
}
else
{
printf("Estudiante no registrado, no se pudo eliminar la información del estudiante.\n");
}
descanso;
caso '9':
RemoveAllStudent(&g_StudentInfoList);
printf("Eliminación completa.\n");
descanso;
}
}
while(op ! = '0');
StoreStudentInfo();
}