0% encontró este documento útil (0 votos)
27 vistas25 páginas

Siwm

M
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
27 vistas25 páginas

Siwm

M
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

Menu

 1 ingresar alumnos n
 2 buscar 1 alumno(x apelldo
 3 alumno con nota mas baja
 4 alumno con nota mas alta
 5 cantidad de reprobados(nota<60)
 6 cantidad de aprobados(nota>60)
 7 salir
De los alumnos se desea registrar: nombre, apellido, nota (estructura).
El programa debe tener al menos 1 llamada a la función.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Definimos la estructura para un alumno
typedef struct {
char nombre[50];
char apellido[50];
float nota;
} Alumno;
// Función para ingresar los datos de los alumnos
void ingresarAlumnos(Alumno *alumnos, int n) {
for (int i = 0; i < n; i++) {
printf("Ingrese nombre del alumno %d: ", i + 1);
scanf("%s", alumnos[i].nombre);
printf("Ingrese apellido del alumno %d: ", i + 1);
scanf("%s", alumnos[i].apellido);
printf("Ingrese nota del alumno %d: ", i + 1);
scanf("%f", &alumnos[i].nota);
// Validar que la nota esté en un rango válido
while (alumnos[i].nota < 0 || alumnos[i].nota > 100) {
printf("Nota inválida. Ingrese una nota entre 0 y 100: ");
scanf("%f", &alumnos[i].nota);
}
}
}
// Función para buscar un alumno por su apellido
void buscarAlumno(Alumno *alumnos, int n, char *apellido) {
int encontrado = 0;
for (int i = 0; i < n; i++) {
if (strcmp(alumnos[i].apellido, apellido) == 0) {
printf("Alumno encontrado: %s %s con nota %.2f\n", alumnos[i].nombre,
alumnos[i].apellido, alumnos[i].nota);
encontrado = 1;
break;
}
}
if (!encontrado) {
printf("No se encontró un alumno con el apellido %s\n", apellido);

1
}
}
// Función para encontrar el alumno con la nota más baja
void alumnoNotaMasBaja(Alumno *alumnos, int n) {
int index = 0;
for (int i = 1; i < n; i++) {
if (alumnos[i].nota < alumnos[index].nota) {
index = i;
}
}
printf("El alumno con la nota más baja es: %s %s con nota %.2f\n", alumnos[index].nombre,
alumnos[index].apellido, alumnos[index].nota);
}
// Función para encontrar el alumno con la nota más alta
void alumnoNotaMasAlta(Alumno *alumnos, int n) {
int index = 0;
for (int i = 1; i < n; i++) {
if (alumnos[i].nota > alumnos[index].nota) {
index = i;
}
}
printf("El alumno con la nota más alta es: %s %s con nota %.2f\n", alumnos[index].nombre,
alumnos[index].apellido, alumnos[index].nota);
}
// Función para contar la cantidad de alumnos reprobados
int contarReprobados(Alumno *alumnos, int n) {
int count = 0;
for (int i = 0; i < n; i++) {
if (alumnos[i].nota < 60) {
count++;
}
}
return count;
}
// Función para contar la cantidad de alumnos aprobados
int contarAprobados(Alumno *alumnos, int n) {
int count = 0;
for (int i = 0; i < n; i++) {
if (alumnos[i].nota >= 60) {
count++;
}
}
return count;
}
int main() {
int opcion;
Alumno *alumnos = NULL; // Puntero para almacenar los alumnos
int n = 0; // Número de alumnos

2
do {
printf("\nMenu\n");
printf("1. Ingresar alumnos\n");
printf("2. Buscar alumno por apellido\n");
printf("3. Alumno con nota más baja\n");
printf("4. Alumno con nota más alta\n");
printf("5. Cantidad de reprobados (nota < 60)\n");
printf("6. Cantidad de aprobados (nota >= 60)\n");
printf("7. Salir\n");
printf("Seleccione una opción: ");
scanf("%d", &opcion);
switch (opcion) {
case 1:
printf("Ingrese el número de alumnos: ");
scanf("%d", &n);
// Reservar memoria para los alumnos
alumnos = (Alumno *)malloc(n * sizeof(Alumno));
if (alumnos == NULL) {
printf("Error al asignar memoria.\n");
exit(1);
}
ingresarAlumnos(alumnos, n);
break;
case 2: {
if (n > 0) {
char apellido[50];
printf("Ingrese el apellido a buscar: ");
scanf("%s", apellido);
buscarAlumno(alumnos, n, apellido);
} else {
printf("Primero debe ingresar alumnos.\n");
}
break;
}
case 3:
if (n > 0) {
alumnoNotaMasBaja(alumnos, n);
} else {
printf("Primero debe ingresar alumnos.\n");
}
break;
case 4:
if (n > 0) {
alumnoNotaMasAlta(alumnos, n);
} else {
printf("Primero debe ingresar alumnos.\n");
}
break;

3
case 5:
if (n > 0) {
printf("Cantidad de reprobados: %d\n", contarReprobados(alumnos, n));
} else {
printf("Primero debe ingresar alumnos.\n");
}
break;
case 6:
if (n > 0) {
printf("Cantidad de aprobados: %d\n", contarAprobados(alumnos, n));
} else {
printf("Primero debe ingresar alumnos.\n");
}
break;
case 7:
printf("Saliendo...\n");
break;
default:
printf("Opción no válida. Intente de nuevo.\n");
break;
}
} while (opcion != 7);
// Liberar la memoria asignada para los alumnos
if (alumnos != NULL) {
free(alumnos);
}
return 0;
}

Realice 1 función que utilizando punteros lea 1 frase y la encrypte, para ello deberá
reemplazar las vocales por nros:
a->4, e->3, i-> 1, o -> 0, u->6
#include <stdio.h>
#include <string.h>
void encrypt(char *str) {
while (*str != '\0') {
// Reemplaza las vocales por los números correspondientes
switch (*str) {
case 'a': case 'A':
*str = '4';
break;
case 'e': case 'E':
*str = '3';
break;
case 'i': case 'I':
*str = '1';
break;
case 'o': case 'O':

4
*str = '0';
break;
case 'u': case 'U':
*str = '6';
break;
}
str++; // Avanza al siguiente carácter
}
}
int main() {
char frase[100];
printf("Introduce una frase: ");
fgets(frase, 100, stdin); // Lee la frase desde la entrada estándar
// Elimina el salto de línea que agrega fgets al final de la cadena
frase[strcspn(frase, "\n")] = '\0';
// Llama a la función para encriptar la frase
encrypt(frase);
printf("Frase encriptada: %s\n", frase);
return 0;
}

Explicación de cada tema:


1. Estructuras de control (repetitivas y condicionales):

Condicionales: Permiten tomar decisiones en el flujo del programa usando if, else if y
else.
Repetitivas: Permiten ejecutar un bloque de código múltiples veces usando bucles
como for, while y do-while.
Ejemplo de uso:

int x = 5;
if (x > 0) {
printf("x es positivo\n");
} else {
printf("x es negativo o cero\n");
}

for (int i = 0; i < 5; i++) {


printf("%d ", i);
}

#include <stdio.h>
int main() {
int i = 0;
// Bucle while: imprimimos números del 0 al 4
while (i < 5) {
printf("El valor de i es: %d\n", i);

5
i++;
}
return 0;
}

#include <stdio.h>
int main() {
int i = 0;
// Bucle do-while: imprimimos números del 0 al 4
do {
printf("El valor de i es: %d\n", i);
i++;
} while (i < 5);
return 0;
}

#include <stdio.h>
int main() {
int dia = 3;
// Estructura switch: determinamos el día de la semana
switch (dia) {
case 1:
printf("Lunes\n");
break;
case 2:
printf("Martes\n");
break;
case 3:
printf("Miércoles\n");
break;
case 4:
printf("Jueves\n");
break;
case 5:
printf("Viernes\n");
break;
case 6:
printf("Sábado\n");
break;
case 7:
printf("Domingo\n");
break;
default:
printf("Día inválido\n");
break;
}
return 0;
}

2. Arreglos:

6
Son colecciones de elementos del mismo tipo almacenados en ubicaciones de
memoria contiguas.
Se accede a los elementos por índices, comenzando desde 0.
Ejemplo de uso:

int arr[5] = {1, 2, 3, 4, 5};


printf("El primer elemento es: %d\n", arr[0]);

3. Strings:

Son arreglos de caracteres terminados en un carácter nulo ('\0').


En C, se pueden manipular usando funciones de la biblioteca estándar como
strlen, strcpy, strcat, etc.
Ejemplo de uso:

char str[20] = "Hola";


printf("La longitud de la cadena es: %lu\n", strlen(str));

Los strings en C son un tema fundamental, ya que manejarlos correctamente


implica trabajar con arreglos de caracteres y entender cómo terminan en un
carácter nulo ('\0'). Vamos a ver un ejemplo más completo que muestra cómo
manipular strings en C usando funciones comunes de la biblioteca string.h.

Ejemplo completo de manejo de strings


En este ejemplo, veremos cómo:
 Leer una cadena de caracteres desde el usuario.
 Determinar la longitud de la cadena.
 Copiar una cadena a otra.
 Comparar dos cadenas.
 Concatenar dos cadenas.

#include <stdio.h>
#include <string.h>

int main() {
char str1[100]; // Buffer para la primera cadena
char str2[100]; // Buffer para la segunda cadena
char str3[200]; // Buffer para la cadena concatenada
// Leer la primera cadena desde el usuario
printf("Ingrese la primera cadena: ");
fgets(str1, sizeof(str1), stdin);
str1[strcspn(str1, "\n")] = '\0'; // Eliminar el carácter de nueva línea

// Leer la segunda cadena desde el usuario


printf("Ingrese la segunda cadena: ");
fgets(str2, sizeof(str2), stdin);
str2[strcspn(str2, "\n")] = '\0'; // Eliminar el carácter de nueva línea

// Calcular y mostrar la longitud de ambas cadenas


printf("Longitud de la primera cadena: %lu\n", strlen(str1));
printf("Longitud de la segunda cadena: %lu\n", strlen(str2));

7
// Copiar la primera cadena a str3
strcpy(str3, str1);
printf("Copia de la primera cadena en str3: %s\n", str3);

// Comparar las dos cadenas


if (strcmp(str1, str2) == 0) {
printf("Las cadenas son iguales.\n");
} else {
printf("Las cadenas son diferentes.\n");
}

// Concatenar las dos cadenas y almacenarlas en str3


strcat(str3, " "); // Añadir un espacio entre las cadenas
strcat(str3, str2);
printf("Concatenación de ambas cadenas en str3: %s\n", str3);

return 0;
}

Explicación:
1. Lectura de Cadenas (fgets):

 fgets se utiliza para leer una línea de texto desde la entrada estándar (stdin).
 fgets incluye el carácter de nueva línea ('\n') al final de la cadena si hay espacio
suficiente en el buffer, por lo que se elimina con strcspn y se reemplaza con '\0'
para terminar correctamente la cadena.

2. Calcular Longitud (strlen):


 strlen devuelve la longitud de la cadena, excluyendo el carácter nulo.

3. Copiar Cadena (strcpy):

 strcpy copia la cadena de origen a la cadena de destino. En este caso, copia


str1 a str3.

4. Comparar Cadenas (strcmp):

 strcmp compara dos cadenas lexicográficamente. Retorna 0 si son iguales, un


valor negativo si la primera es menor que la segunda, y un valor positivo si es
mayor.

5. Concatenar Cadenas (strcat):

 strcat añade la cadena de origen al final de la cadena de destino. En el


ejemplo, str2 se concatena a str3 después de añadir un espacio para separar
las dos cadenas.

Uso de la Biblioteca string.h

8
Incluimos la librería string.h para acceder a las funciones estándar para manipulación
de cadenas:

 fgets: Para leer líneas de texto de la entrada estándar.


 strlen: Para obtener la longitud de una cadena.
 strcpy: Para copiar una cadena a otra.
 strcmp: Para comparar dos cadenas.
 strcat: Para concatenar dos cadenas.

4. Funciones:

Son bloques de código que realizan una tarea específica y pueden ser reutilizados.
Pueden recibir parámetros y devolver valores.
Ejemplo de uso:

int sumar(int a, int b) {


return a + b;
}

int main() {
int resultado = sumar(5, 3);
printf("La suma es: %d\n", resultado);
return 0;
}

5. Punteros:

Son variables que almacenan la dirección de memoria de otras variables.


Permiten la manipulación directa de la memoria y son esenciales para trabajar con
arreglos y funciones.
Ejemplo de uso:

int x = 10;
int *p = &x; // p es un puntero a un entero
printf("El valor de x es: %d\n", *p); // Uso de puntero para acceder al valor de x

6. Array de estructuras:
Permiten almacenar múltiples estructuras del mismo tipo en un arreglo.
Útil para manejar colecciones de datos más complejos, como registros de estudiantes,
productos, etc.
Ejemplo de uso:
struct Estudiante {
char nombre[50];
int edad;
};

9
struct Estudiante clase[3] = {{"Juan", 20}, {"Ana", 22}, {"Luis", 21}};
printf("El primer estudiante es: %s\n", clase[0].nombre);

7. Ordenamientos:
Son algoritmos que organizan los elementos de un arreglo en un orden específico
(ascendente o descendente).
Ejemplos comunes incluyen el ordenamiento por burbuja, selección y inserción.
Ejemplo de uso: (Ordenamiento burbuja)
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-i-1; j++) {
if (arr[j] > arr[j+1]) {
// Intercambiar arr[j] y arr[j+1]
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
8. Recursividad:

 Es una técnica donde una función se llama a sí misma.


 Útil para resolver problemas que pueden ser divididos en subproblemas
similares, como el cálculo del factorial, la serie de Fibonacci, etc.
Ejemplo de uso:
int factorial(int n) {
if (n == 0) return 1;
else return n * factorial(n-1);
}

int main() {

10
int num = 5;
printf("El factorial de %d es: %d\n", num, factorial(num));
return 0;
}

Ejemplo de código integrando varias librerías:


#include <stdio.h> // Para printf y otras operaciones de entrada/salida
#include <stdlib.h> // Para malloc, free y qsort
#include <string.h> // Para operaciones con cadenas de caracteres
#include <math.h> // Para funciones matemáticas
#include <time.h> // Para operaciones con el tiempo

int main() {
// Ejemplo de uso de cada biblioteca
printf("Hola, Mundo!\n"); // stdio.h
int *arr = (int *)malloc(5 * sizeof(int)); // stdlib.h
if (arr != NULL) {
for (int i = 0; i < 5; i++) {
arr[i] = i * i;
}
free(arr); // Liberar memoria
}
char str[50];
strcpy(str, "Programación en C"); // string.h
printf("Cadena copiada: %s\n", str);
double result = sqrt(25.0); // math.h
printf("Raíz cuadrada de 25: %.2f\n", result);
time_t now = time(NULL); // time.h
printf("Tiempo actual: %s", ctime(&now));
return 0;
}

11
1. Ejemplo de Punteros
Los punteros son fundamentales en C y permiten manipular directamente la memoria.
Vamos a ver cómo trabajar con punteros, incluyendo cómo cambiar el valor de una
variable a través de su dirección de memoria.
#include <stdio.h>
void intercambiar(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 10;
int y = 20;
int *p; // Puntero a entero
p = &x; // p apunta a la dirección de x
printf("Valor de x a través de p: %d\n", *p);
p = &y; // p ahora apunta a la dirección de y
printf("Valor de y a través de p: %d\n", *p);
// Intercambiamos los valores de x e y usando punteros
intercambiar(&x, &y);
printf("Después de intercambiar, x = %d, y = %d\n", x, y);
return 0;
}
Explicación:

 Definimos una función intercambiar que toma dos punteros a enteros y los
intercambia.
 En el main, declaramos dos enteros, x y y, y un puntero a entero p.
 Asignamos p a la dirección de x e imprimimos el valor de x a través de p.
 Luego, cambiamos p para que apunte a la dirección de y y mostramos el valor
de y.
 Finalmente, usamos la función intercambiar para intercambiar los valores de x
y y.

2. Ejemplo de Array de Estructuras

12
Los arrays de estructuras permiten manejar colecciones de datos más complejos. Aquí
veremos cómo definir una estructura para almacenar información sobre estudiantes y
cómo manipular un array de estas estructuras.
#include <stdio.h>
#include <string.h>
struct Estudiante {
char nombre[50];
int edad;
float calificacion;
};
int main() {
// Array de estructuras de estudiantes
struct Estudiante clase[3];
// Asignar valores a cada estudiante
strcpy(clase[0].nombre, "Juan");
clase[0].edad = 20;
clase[0].calificacion = 88.5;
strcpy(clase[1].nombre, "Ana");
clase[1].edad = 22;
clase[1].calificacion = 91.0;
strcpy(clase[2].nombre, "Luis");
clase[2].edad = 21;
clase[2].calificacion = 85.0;
// Imprimir información de los estudiantes
for (int i = 0; i < 3; i++) {
printf("Estudiante %d:\n", i + 1);
printf("Nombre: %s\n", clase[i].nombre);
printf("Edad: %d\n", clase[i].edad);
printf("Calificación: %.2f\n", clase[i].calificacion);
printf("\n");
}
return 0;
}

13
Explicación:

 Definimos una estructura Estudiante con tres campos: nombre, edad y


calificacion.
 Declaramos un array de 3 estructuras Estudiante.
 Usamos strcpy para copiar los nombres en el campo nombre y asignamos
valores a edad y calificacion.
 Recorremos el array y mostramos la información de cada estudiante.

3. Ejemplo de Ordenamiento (Burbuja y Quicksort)


a) Ordenamiento Burbuja (Bubble Sort)
El algoritmo de ordenamiento burbuja es simple pero ineficiente para grandes
conjuntos de datos. Consiste en recorrer el arreglo repetidamente y "burbujeando" el
elemento más grande hacia el final en cada pasada.
#include <stdio.h>
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr) / sizeof(arr[0]);
bubbleSort(arr, n);
printf("Arreglo ordenado con burbuja: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;

14
}
Explicación:

 El bubbleSort recorre el arreglo n-1 veces.


 En cada pasada, compara elementos adyacentes y los intercambia si están en
el orden incorrecto.
 Después de cada pasada, el elemento más grande "burbujea" al final del
arreglo.
b) Ordenamiento Rápido (Quicksort)
El algoritmo quicksort es más eficiente que el burbuja y utiliza la técnica de "divide y
vencerás". Elige un "pivote" y organiza los elementos en dos subarreglos, uno con
elementos menores al pivote y otro con elementos mayores.
#include <stdio.h>
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
int partition(int arr[], int low, int high) {
int pivot = arr[high];
int i = (low - 1);
for (int j = low; j < high; j++) {
if (arr[j] < pivot) {
i++;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
int temp = arr[i + 1];
arr[i + 1] = arr[high];
arr[high] = temp;
return (i + 1);

15
}
int main() {
int arr[] = {10, 7, 8, 9, 1, 5};
int n = sizeof(arr) / sizeof(arr[0]);
quickSort(arr, 0, n - 1);
printf("Arreglo ordenado con quicksort: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
Explicación:

 La función quickSort aplica recursivamente el algoritmo para ordenar los


elementos a la izquierda y a la derecha del pivote.
 La función partition organiza los elementos alrededor del pivote y devuelve su
posición final en el arreglo.

4. Ejemplo de Recursividad
La recursividad es una técnica en la que una función se llama a sí misma. Es útil para
resolver problemas que pueden ser descompuestos en subproblemas más pequeños,
como el cálculo del factorial o la secuencia de Fibonacci.
#include <stdio.h>
int factorial(int n) {
if (n == 0) {
return 1; // Caso base: el factorial de 0 es 1
} else {
return n * factorial(n - 1); // Llamada recursiva
}
}
int main() {
int num = 5;
printf("El factorial de %d es: %d\n", num, factorial(num));
return 0;
}

16
Explicación:

 La función factorial calcula el factorial de un número n llamándose a sí misma


con n-1 hasta que n llega a 0, momento en el que devuelve 1.
 Cada llamada recursiva multiplica el número actual por el factorial de su
predecesor, acumulando el resultado final.
#include <stdio.h>
// Función recursiva para imprimir números desde n hasta 1
void imprimirDescendente(int n) {
// Caso base: si n llega a 0, no hacemos nada (termina la recursión)
if (n <= 0) {
return;
}
// Imprimir el número actual
printf("%d ", n);
// Llamar recursivamente a la función con n-1
imprimirDescendente(n - 1);
}
int main() {
int numero;
printf("Ingrese un número entero positivo para comenzar la cuenta regresiva: ");
scanf("%d", &numero);
// Verificar si el número ingresado es positivo
if (numero <= 0) {
printf("El número debe ser positivo.\n");
return 1;
}
// Llamar a la función recursiva
printf("Contando desde %d hasta 1:\n", numero);
imprimirDescendente(numero);
printf("\n");
return 0;
}
Explicación del Código

17
1. Función imprimirDescendente:
 Esta es la función recursiva que imprime los números desde n hasta 1.
 Caso base: Si n es menor o igual a 0, la función simplemente retorna sin hacer
nada, lo que detiene la recursión.
 Paso recursivo: Imprime el número n y luego llama a imprimirDescendente(n -
1) para imprimir el número siguiente en orden descendente.
2. Función main:

 En main, se lee un número entero positivo desde el usuario.


 Se verifica si el número ingresado es positivo. Si no lo es, el programa muestra
un mensaje de error y termina.
 Llama a imprimirDescendente con el número ingresado para iniciar la cuenta
regresiva.
 Imprime los números en orden descendente.

Resumen

 Punteros: Permiten manipular datos y memoria de forma eficiente.


 Array de Estructuras: Facilitan la gestión de datos complejos y estructurados.
 Ordenamientos (Burbuja y Quicksort): Algoritmos para organizar datos en un
orden específico.
 Recursividad: Técnica poderosa para resolver problemas dividiéndolos en
subproblemas más pequeños.

void menu(){
int op=10;
do{
printf("****MENU DE OPCIONES*****\n");
printf("1.Ingresar Cantidad de Jugadores\n");
printf("2.Tirar Dado\n");
printf("3.Extraer Dinero\n");
printf("0.Cero para salir\n");
printf("Ingrese una opcion:\n");
scanf("%d",&op);
switch(op){
case 1:printf("INGRESO A LA OPCION 1\n:"); break;
case 2:printf("INGRESO A LA OPCION 2\n:"); break;
case 3:printf("INGRESO A LA OPCION 3\n:"); break;
case 0:printf("SALIENDO...\n"); break;
default:printf("INGRESO UNA OPCION NO VALIDA 2\n:");
break;
}
}while(op !=0);
printf("UD SALIO DEL MENU");
}
int main() {
menu();
return 0;
}

18
#include <stdio.h>
#include <string.h>
// Definición de la estructura Alumno
typedef struct {
char nombre[50];
char apellido[50];
float nota;
} Alumno;
// Función para ingresar los datos de varios alumnos
void ingresarAlumnos(Alumno alumnos[], int *numAlumnos) {
int n;
printf("Ingrese la cantidad de alumnos a registrar: "); // Solicita el número de
alumnos a registrar
scanf("%d", &n);
// Bucle para ingresar los datos de cada alumno
for (int i = 0; i < n; i++) {
printf("Alumno %d\n", *numAlumnos + 1); // Muestra el número del alumno que
se está ingresando
printf("Nombre: ");
scanf("%s", alumnos[*numAlumnos].nombre); // Lee el nombre del alumno
printf("Apellido: ");
scanf("%s", alumnos[*numAlumnos].apellido); // Lee el apellido del alumno
printf("Nota: ");
scanf("%f", &alumnos[*numAlumnos].nota); // Lee la nota del alumno
(*numAlumnos)++; // Incrementa el contador de alumnos
}
}
// Función para buscar un alumno por su apellido
void buscarAlumno(Alumno alumnos[], int numAlumnos) {
char apellido[50];

19
printf("Ingrese el apellido del alumno a buscar: "); // Solicita el apellido a buscar
scanf("%s", apellido);

// Bucle para buscar el alumno en la lista


for (int i = 0; i < numAlumnos; i++) {
if (strcmp(alumnos[i].apellido, apellido) == 0) { // Compara el apellido actual con
el buscado
printf("Alumno encontrado: %s %s, Nota: %.2f\n", alumnos[i].nombre,
alumnos[i].apellido, alumnos[i].nota);
return; // Si lo encuentra, muestra la información y sale de la función
}
}
printf("Alumno no encontrado.\n"); // Si no lo encuentra, muestra un mensaje
}
// Función para encontrar y mostrar al alumno con la nota más baja
void alumnoNotaMasBaja(Alumno alumnos[], int numAlumnos) {
if (numAlumnos == 0) {
printf("No hay alumnos registrados.\n"); // Verifica si hay alumnos registrados
return;
}
int indice = 0; // Inicializa el índice del alumno con la nota más baja
for (int i = 1; i < numAlumnos; i++) {
if (alumnos[i].nota < alumnos[indice].nota) { // Compara las notas para
encontrar la más baja
indice = i;
}
}
printf("Alumno con la nota mas baja: %s %s, Nota: %.2f\n", alumnos[indice].nombre,
alumnos[indice].apellido, alumnos[indice].nota);
}
// Función para encontrar y mostrar al alumno con la nota más alta
void alumnoNotaMasAlta(Alumno alumnos[], int numAlumnos) {
if (numAlumnos == 0) {
printf("No hay alumnos registrados.\n"); // Verifica si hay alumnos registrados

20
return;
}

int indice = 0; // Inicializa el índice del alumno con la nota más alta
for (int i = 1; i < numAlumnos; i++) {
if (alumnos[i].nota > alumnos[indice].nota) { // Compara las notas para
encontrar la más alta
indice = i;
}
}
printf("Alumno con la nota mas alta: %s %s, Nota: %.2f\n", alumnos[indice].nombre,
alumnos[indice].apellido, alumnos[indice].nota);
}
// Función para contar y mostrar la cantidad de alumnos reprobados
void cantidadReprobados(Alumno alumnos[], int numAlumnos) {
int contador = 0;
for (int i = 0; i < numAlumnos; i++) {
if (alumnos[i].nota < 60) { // Cuenta las notas menores a 60
contador++;
}
}
printf("Cantidad de reprobados: %d\n", contador);
}
// Función para contar y mostrar la cantidad de alumnos aprobados
void cantidadAprobados(Alumno alumnos[], int numAlumnos) {
int contador = 0;
for (int i = 0; i < numAlumnos; i++) {
if (alumnos[i].nota >= 60) { // Cuenta las notas iguales o mayores a 60
contador++;
}
}
printf("Cantidad de aprobados: %d\n", contador);
}

21
// Función que muestra el menú y gestiona las opciones del usuario
void menu() {
Alumno alumnos[100]; // Array para almacenar los datos de los alumnos
int numAlumnos = 0; // Contador de alumnos registrados
int opcion;
// Bucle que muestra el menú hasta que el usuario decida salir
do {
printf("* MENU *\n");
printf("1. Ingresar Alumnos\n");
printf("2. Buscar un Alumno\n");
printf("3. Alumno con Nota más Baja\n");
printf("4. Alumno con Nota más Alta\n");
printf("5. Cantidad de Reprobados\n");
printf("6. Cantidad de Aprobados\n");
printf("7. Salir\n");
printf("Ingrese una opción: ");
scanf("%d", &opcion);
// Gestión de las opciones del menú
switch (opcion) {
case 1:
ingresarAlumnos(alumnos, &numAlumnos); // Llama a la función para
ingresar alumnos
break;
case 2:
buscarAlumno(alumnos, numAlumnos); // Llama a la función para buscar
un alumno
break;
case 3:
alumnoNotaMasBaja(alumnos, numAlumnos); // Llama a la función para
mostrar el alumno con la nota más baja
break;
case 4:
alumnoNotaMasAlta(alumnos, numAlumnos); // Llama a la función para
mostrar el alumno con la nota más alta

22
break;
case 5:
cantidadReprobados(alumnos, numAlumnos); // Llama a la función para
mostrar la cantidad de reprobados
break;
case 6:
cantidadAprobados(alumnos, numAlumnos); // Llama a la función para
mostrar la cantidad de aprobados
break;
case 7:
printf("Saliendo del Sistema...\n"); // Opción para salir del programa
break;
default:
printf("Opción no válida\n"); // Mensaje en caso de opción inválida
break;
}
printf("\n");
} while (opcion != 7); // Repite el menú hasta que el usuario elija salir
}
// Función principal que inicia el programa llamando al menú
int main() {
menu(); // Llama a la función del menú
return 0;
}
Explicación de cada parte del código:
1. Definición de la Estructura Alumno:
 La estructura Alumno se define con tres campos: nombre, apellido y nota.

2. Funciones para Manejo de Alumnos:


 ingresarAlumnos:
 Permite al usuario ingresar la cantidad de alumnos especificada y sus datos
(nombre, apellido, nota).
 Los datos se almacenan en un array de estructuras alumnos.
 La cantidad de alumnos se incrementa conforme se añaden nuevos registros.

 buscarAlumno:
 Permite buscar un alumno en la lista por su apellido.

23
 Si se encuentra, se muestran sus datos; si no, se indica que no se encontró.

 alumnoNotaMasBaja:
 Encuentra y muestra al alumno con la nota más baja.
 Compara las notas de todos los alumnos registrados.

 alumnoNotaMasAlta:
 Encuentra y muestra al alumno con la nota más alta.
 Compara las notas de todos los alumnos registrados.

 cantidadReprobados:
 Cuenta y muestra la cantidad de alumnos con una nota menor a 60
(reprobados).

 cantidadAprobados:
 Cuenta y muestra la cantidad de alumnos con una nota igual o mayor a 60
(aprobados).

3. Menú:

 menu:
 Muestra un menú de opciones al usuario.
 Cada opción permite realizar una operación diferente sobre la lista de alumnos.
 El menú sigue apareciendo hasta que el usuario decide salir seleccionando la
opción 7.

 main:
Función principal del programa que inicia llamando a la función menu.

#include <stdio.h>
#include <string.h>
// Función para encriptar una frase cambiando las vocales por números
void encriptarFrase(char *frase) {
char *ptr = frase;
while (*ptr) {
switch (*ptr) {
case 'a': *ptr = '4'; break; // Cambia 'a' por '4'
case 'e': *ptr = '3'; break; // Cambia 'e' por '3'
case 'i': *ptr = '1'; break; // Cambia 'i' por '1'
case 'o': *ptr = '0'; break; // Cambia 'o' por '0'
case 'u': *ptr = '6'; break; // Cambia 'u' por '6'
}

24
ptr++; // Avanza al siguiente carácter
}
}
int main() {
char frase[100]; // Array para almacenar la frase ingresada
printf("Introduce una frase: ");
fgets(frase, sizeof(frase), stdin); // Lee la frase ingresada por el usuario
// Elimina el carácter de nueva línea al final de la frase si existe
char *nuevalinea = strchr(frase, '\n');
if (nuevalinea) {
*nuevalinea = '\0';
}
encriptarFrase(frase); // Llama a la función para encriptar la frase
printf("Frase encriptada: %s\n", frase); // Muestra la frase encriptada
return 0;
}
Explicación de cada parte del código:
1. Función encriptarFrase:
 Recibe una cadena de caracteres (char *frase) como parámetro.
 Usa un puntero ptr para recorrer cada carácter de la cadena.
 Dentro de un bucle while, reemplaza cada vocal con un número específico
usando una instrucción switch:
 'a' se convierte en '4'
 'e' se convierte en '3'
 'i' se convierte en '1'
 'o' se convierte en '0'
 'u' se convierte en '6'
 Avanza al siguiente carácter en cada iteración del bucle.

2. Función main:
 Declara un array frase para almacenar la entrada del usuario.
 Usa fgets para leer la frase completa, incluyendo espacios, hasta el tamaño del
buffer o hasta que se encuentra un salto de línea.
 Elimina el carácter de nueva línea (\n) si se encuentra al final de la cadena,
reemplazándolo con el carácter nulo (\0).
 Llama a la función encriptarFrase para procesar la frase.
 Muestra la frase encriptada al usuario.

25

También podría gustarte