Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - alt_369

#1
Buenas,

es la primera vez que utilizo las funciones qsort y bsearch, y miro y miro el código y no entiendo qué hago mal, así que si alguien lo ve, me haría un gran favor al decírmelo.

El programa se trata de crear una lista que ordene por el primer apellido (cognom1), y, si se da el caso de que hubieran dos iguales, se escribe la información sobre el DNI menor.

aquí lo dejo, y ante todo, ¡muchas gracias por vuestro tiempo!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
char carrer[16];
char num[5];
char poblacio[16];
char codiPostal[5];
}adreca;
typedef struct{
char nom[11];
char cognom1[16];
char cognom2[16];
adreca dir;
int dni;
char sexe;
}persona;
int ordenar(const void *,const void *);
int main(void){
int n, i;
persona *v, *trobat, p, *ap;
printf("numero persones: ");
scanf("%d", &n);
if(n<1){ printf("no hi ha suficients persones\n"); exit(1); }
v = (persona *)malloc(n*sizeof(persona));
if(v==NULL){ printf("no hi ha memoria\n"); exit(1); }
for(i=0; i<n; i++){
scanf(" %s", v[i].nom);
scanf(" %s", v[i].cognom1);
scanf(" %s", v[i].cognom2);
scanf(" %s", v[i].dir.carrer);
scanf(" %s", v[i].dir.num);
scanf(" %s", v[i].dir.poblacio);
scanf(" %s", v[i].dir.codiPostal);
scanf("%d", &v[i].dni);
scanf(" %c", &v[i].sexe);
}
qsort(v,n,sizeof(persona *),ordenar);
printf("cognom a buscar: ");
scanf(" %s", p.cognom1);
ap = &p;
trobat = (persona *)bsearch(ap,v,n,sizeof(persona *), ordenar);
if(trobat==NULL){ printf("no s'ha trobat %s\n", p.cognom1); exit(1); }
printf("nom: %s\n", trobat->nom);
printf("primer cognom: %s\n", trobat->cognom1);
printf("segon cogmon: %s\n", trobat->cognom2);
printf("carrer: %s\n", trobat->dir.carrer);
printf("numero del carrer: %s\n", trobat->dir.num);
printf("poblacio: %s\n", trobat->dir.poblacio);
printf("codi postal: %s\n", trobat->dir.codiPostal);
printf("DNI: %d\n", trobat->dni);
if(trobat->sexe=='H') printf("sexe: home\n");
else printf("sexe: dona\n");
return 0;
}
int ordenar(const void *a1, const void *a2){
persona p1, p2;
int k;
p1 = *(persona *)a1;
p2 = *(persona *)a2;
k = strcmp(p1.cognom1,p2.cognom1);
if(k!=0) return k;
return p1.dni - p2.dni;
}

#2
¡Saludos!

Estoy tratando de hacer el siguiente problema: dado un número natural n y una secuencia de n palabras, indicar cual es la palabra más frecuente.

Quiero hacerlo guardando las n palabras en una tira de caracteres, pero a la hora de utilizarla, no sé cómo hacerlo, ya que cuando hago por ejemplo palabras[1], llama a toda la palabra, no carácter por carácter (de ahí el problema para compararlo con otra).

No quiero hacer el problema a través de funciones programadas, sino crearla yo mismo.

Dejo el código por si sirve de algo (ahí es donde me que quedado parado):
#include <stdio.h>
int main(void){
        int n, i, contador[11]={0};
        char palabras[20][11];
        do{
                printf("introducir n (menor que 12): ");
                scanf("%d", &n);
        }while(n<0 || n>11);
        printf("introducir la secuencia de n palabras: ");
        for(i=0; i<n; i++) scanf("%[^\n]s", palabras[i]);


¡Gracias por vuestro tiempo!
#3
Buenas!

El programa ha de sumar dos polinomios p(x) y q(x). Al imprimir los polinomios y la suma lo han de hacer con sus correspondientes x (x^2, x^3...), y la base de los polinomios puede ser hasta 10.

No entiendo qué hago mal, porque cuando entro los siguientes datos:
3 1.2 0 -4.4 1.             (los 3 del inicio corresponden al grado de los poliomios, y lo siguiente a las cifras)
3 -2. 1. 3.3 -1.

me imprime:
p(x) +1.2 -4.4x^2 +1x^3                                                                                      
q(x) -2 +1x +3.3x^2 -1x^3                                                                                    
                                                                                                             
suma: -0.8 +1x -1.1x^2 -2

Es el -2 en negrita el que no entiendo.

Les dejo el código por si ven algún error, y muchas gracias de antemano:
#include <stdio.h>
int main(void){
int n, m, i;
float polin_n[10]={0}, polin_m[10]={0};
char x[9][4]={{"x"},{"x^2"},{"x^3"},{"x^4"},{"x^5"},{"x^6"},{"x^7"},{"x^8"},{"x^9"}};
do{ /*introduccion de datos*/
printf("introducir el grado de p(x): ");
scanf("%d", &n);
}while(n<0 || n>10);
for(i=0; i<=n; i++){
scanf("%f", &polin_n[i]);
}
do{
printf("introducir el grado de q(x): ");
scanf("%d", &m);
}while(m<0 || m>10);
for(i=0; i<=m; i++){
scanf("%f", &polin_m[i]);
}
if(polin_n[0]!=0){ /*imprimir el primer polinomio*/
printf("\np(x) %+g", polin_n[0]);
i=1;
}else{
i=0;
}
for(i=i; i<=n; i++){
while(polin_n[i]==0) i++;
printf(" %+g%s", polin_n[i], x[i-1]);
}
if(polin_m[0]!=0){ /*imprimir el segundo polinomio*/
printf("\nq(x) %+g", polin_m[0]);
i=1;
}else{
i=0;
}
for(i=i; i<=m; i++){
while(polin_m[i]==0) i++;
printf(" %+g%s", polin_m[i], x[i-1]);
}
if(m>n) n=m; /*imprimir la suma del los polinomios*/
printf("\n\nsuma: %+g", polin_n[0]+polin_m[0]);
for(i=1; i<=n; i++){
while((polin_n[i]+polin_m[i])==0) i++;
printf(" %+g%s", polin_n[i]+polin_m[i], x[i-1]);
}
printf("\n");
return 0;
}