elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


  Mostrar Mensajes
Páginas: 1 ... 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 [96] 97 98 99 100 101 102
951  Programación / Programación C/C++ / Re: Ordenamiento de nombres en C# en: 24 Noviembre 2018, 16:42 pm
Es cierto, aquí al ser sólo 3 elementos ha dado la casualidad de que por el orden en que han sido introducidos con un ciclo quedan ordenados pero es cierto que faltaría otro ciclo ya que ese solo ordena el elemento <i> con el <i+1> pero no compara el <i+1> con el <i-1> para valores de <i> mayores que 0.
Es decir que tienes razón, faltaría un segundo ciclo para ordenar completamente el array si la situación en que son introducidos los elementos no es favorable, ya que en este caso sí que lo es y por eso no me había dado cuenta.
952  Programación / Programación C/C++ / Re: Ordenamiento de nombres en C# en: 24 Noviembre 2018, 16:24 pm
Parece mejor hacer una funcion que compare y solo 1 intercambio, algo asi como:
Código
  1. if( mayor( student1, student2 ) ) {
  2.     // intercambiar
  3. }
Sugiero corregir la funcion de ordenamiento que al parecer le falta un ciclo al interior del que ya esta, sino no va a ordenar completamente el arreglo.

Exacto con una función puedes modularizar el programa para no hacerlo como lo he hecho en el código de ejemplo, claro que yo lo había hecho para dar la idea de como ordenar por eso no he creado una función auxiliar.
Y a qué te refieres con que le falta un ciclo? No lo veo.
953  Programación / Programación C/C++ / Re: Ordenamiento de nombres en C# en: 24 Noviembre 2018, 16:03 pm
Sí que es cierto que si quieres concatenar todo podrías hacerlo concatenando un espacio entre palabra y palabra para saber donde acaba cada campo pero te metes en muchos líos. La mejor opción creo que sería (como hacemos lo mismo 3 veces cambiando sólo el campo que comparamos) crear una función que reciba dos parámetros y los compare y así podemos llamarla 3 veces usando como parámetros primero el apellido paterno, luego el materno y luego el nombre y así ese trozo de código queda más limpio. Es decir buscar el trozo de código que repetimos y crear una función (principio de una única vez).
954  Programación / Programación C/C++ / Re: Ayuda con programa en: 24 Noviembre 2018, 14:31 pm
<getch()> es una función de la librería <conio.h> pero esta librería no es estándar por eso no se recomienda su uso. Hay alternativas estándar para <getch()> como por ejemplo <cin.get()>.
Prueba a cambiar eso y me comentas. Suerte.

Edit: El <system("pause")> también puede sustituirse por <cin.get()> ya que su objetivo es hacer una pausa pero de esta manera no tienes que hacer una llamada al sistema lo cual es bastante costoso.
955  Programación / Programación C/C++ / Re: ¿Como filtrar todo tipo de datos de entrada en un programa? en: 24 Noviembre 2018, 13:25 pm
Existe una librería que es <cctype> o <ctype.h> para C++ y C respectivamente que tienes algunas funciones como por ejemplo <isalnum> (comprueba si el caracter es alfanumérico), <isalpha> (comprueba si el caracter es alfabético) o <isdigit> (comprueba si el caracter es un digito decimal).
Esas son las que más te pueden interesar pero si le echas un vistazo a la librería entera tiene más funciones para hacer muchas más comprobaciones, como puede ser ver si hay espacios en blanco, ver si son mayúsculas o minúsculas o comprobar si el caracter es hexadecimal, entre otras más...

Espero que esto te sirva, suerte.

Como te comenté existen unas funciones en la librería <ctype.h>. Por ejemplo para ver si lo que ha introducido es un caracter podemos hacer lo siguiente:
Código
  1. char caracter;
  2. do{
  3.    printf("Introduce un caracter alfabetico: ");
  4.    scanf("%c", &caracter);
  5. }   while(!isalpha(caracter));

No he comprobado al tratarse de C si eso tendría el resultado esperado la verdad ya que aquí las variables se guardan usando el formato entonces por ejemplo si metes un número se convertirá en el caracter al que corresponde ese código ASCII. Entonces para evitar dudas la forma segura sería hacerlo como te han comentado, guardas la entrada en una cadena C y luego haces las comprobaciones. Por ejemplo para ver que no hay ningún signo como un guión o una exclamación sería recorrer la cadena y comprobar cada caracter.
956  Programación / Programación C/C++ / Re: ¿Como filtrar todo tipo de datos de entrada en un programa? en: 24 Noviembre 2018, 12:46 pm
Depende de lo que quieras filtrar.
Si quieres filtrar que cuando pides un número te introduzcan un número positivo claro que puedes con un filtro <do while> que es lo que se suele usar.
Sin embargo si quieres filtrar que una cadena de caracteres cumpla una condición o condiciones específicas pues tendrás que hacer más comprobaciones y lo mejor será crear una función que se encargue de eso ya que no existen funciones para todo lo que se puede hacer.

Lo que te ha mostrado AlbertoBSD sería una forma fácil de entender y segura de filtrar datos ya que usando <gets> te quitas de problemas con el buffer. Si lo quieres más simple todavía puedes hacer uso de <scanf> pero ten en cuenta que entonces puedes tener problemas de buffer.

Código
  1. int num;
  2. do{
  3.    printf("Introduce un numero positivo: ");
  4.    scanf("%d", &num);
  5. }   while(num < 0);

Ahí tienes un ejemplo de lo que sería un filtro para enteros positivos lo más simple que creo que puede hacerse.
Espero que te sirva de ayuda.
957  Programación / Programación C/C++ / Re: Ordenamiento de nombres en C# en: 24 Noviembre 2018, 11:05 am
El problema es que no tienen porqué ser la misma cantidad de caracteres. Entonces no puedes formar una única palabra. No sé si me entiendes.
958  Programación / Programación C/C++ / Re: Ordenamiento de nombres en C# en: 24 Noviembre 2018, 07:20 am
Aquí te dejo una versión que acabo de hacer simplificada para que veas la parte del ordenamiento. Lo que hay que hacer una vez se tienen los alumnos con sus respectivos nombres y apellidos, se comparan los apellidos del padre y el que sea menor se pone primero; si son iguales, se compara el de la madre y el menor se pone primero; y si son iguales, se comparan los nombres y el primero se pone primero.

Si tienes dudas sobre el valor de retorno de <strcmp> es el siguiente:
< 0 si la primera cadena es menor que la segunda.
> 0 si la primera cadena es mayor que la segunda.
= 0 si las dos cadenas son iguales.

Adapta esto a tu programa. Suerte.

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #define TAM 20
  5. #define MAX_STUDENTS 3
  6.  
  7. typedef struct{
  8. char name[TAM];
  9. char lastNameFather[TAM];
  10. char lastNameMother[TAM];
  11. } Student;
  12.  
  13. void initializeStudent(Student*, char*, char*, char*);
  14. void showStudent(Student);
  15. void sortStudents(Student*);
  16.  
  17. int main(){
  18. Student st1, st2, st3;
  19.  
  20. initializeStudent(&st1, "aaaa", "baba", "cccd");
  21. initializeStudent(&st2, "aaaa", "abab", "cccc");
  22. initializeStudent(&st3, "aaab", "baba", "cccc");
  23.  
  24. Student students[MAX_STUDENTS] = {st1, st2, st3};
  25.  
  26. puts("Alumnos sin ordenar");
  27. for(size_t i = 0; i < MAX_STUDENTS; i++)
  28. showStudent(students[i]);
  29.  
  30. sortStudents(students);
  31.  
  32. puts("\nAlumnos ordenados");
  33. for(size_t i = 0; i < MAX_STUDENTS; i++)
  34. showStudent(students[i]);
  35. }
  36.  
  37. void initializeStudent(Student *st, char *name, char *lastNameFather, char *lastNameMother){
  38. strncpy(st->name, name, TAM);
  39. strncpy(st->lastNameFather, lastNameFather, TAM);
  40. strncpy(st->lastNameMother, lastNameMother, TAM);
  41. }
  42.  
  43. void showStudent(Student st){
  44. printf("%s\t%s\t%s\n", st.lastNameFather, st.lastNameMother, st.name);
  45. }
  46.  
  47. void sortStudents(Student *students){
  48. Student assistant;
  49. for(size_t i = 0; i < MAX_STUDENTS-1; i++){
  50. if(strcmp(students[i].lastNameFather, students[i+1].lastNameFather) > 0){
  51. assistant = students[i];
  52. students[i] = students[i+1];
  53. students[i+1] = assistant;
  54. }
  55. else if(strcmp(students[i].lastNameFather, students[i+1].lastNameFather) == 0){
  56. if(strcmp(students[i].lastNameMother, students[i+1].lastNameMother) > 0){
  57. assistant = students[i];
  58. students[i] = students[i+1];
  59. students[i+1] = assistant;
  60. }
  61. else if(strcmp(students[i].lastNameMother, students[i+1].lastNameMother) == 0){
  62. if(strcmp(students[i].name, students[i+1].name) > 0){
  63. assistant = students[i];
  64. students[i] = students[i+1];
  65. students[i+1] = assistant;
  66. }
  67. }
  68. }
  69. }
  70. }
959  Programación / Programación C/C++ / Re: Ordenamiento de nombres en C# en: 24 Noviembre 2018, 06:05 am
Manda el código para ver cómo estás almacenando los alumnos, para ver si son estructuras, arrays...

De todas formas es simple, comparas un apellido con otro y si uno es menor, ese va primero y si son iguales, comparas el otro.
960  Programación / Programación C/C++ / Re: ¿Como filtrar todo tipo de datos de entrada en un programa? en: 24 Noviembre 2018, 05:35 am
Existe una librería que es <cctype> o <ctype.h> para C++ y C respectivamente que tienes algunas funciones como por ejemplo <isalnum> (comprueba si el caracter es alfanumérico), <isalpha> (comprueba si el caracter es alfabético) o <isdigit> (comprueba si el caracter es un digito decimal).
Esas son las que más te pueden interesar pero si le echas un vistazo a la librería entera tiene más funciones para hacer muchas más comprobaciones, como puede ser ver si hay espacios en blanco, ver si son mayúsculas o minúsculas o comprobar si el caracter es hexadecimal, entre otras más...

Espero que esto te sirva, suerte.
Páginas: 1 ... 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 [96] 97 98 99 100 101 102
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines