Y seguimos con C...

Hola chicos, de verdad perdonarme por ser tan pesado!!! Pero es que justo este finde me ha tocado un intensivo de C y no hay manera... Esta vez lo que me pasa, aunque suene ridículo, es que no se si he entendido bien el enunciado y he hecho lo que tenía que hacer... A ver si alguno me puede sacar de la duda!! Otra vez, mil gracias!!
Se dispone de dos vectores paralelos con 8 elementos, en primer vector es de tipo numérico entero (contiene códigos de artículos desordenados). Los elementos del segundo vector, son cadenas de caracteres el segundo (contienen títulos libros).
Codificar un programa que realice el siguiente proceso:
-Inicializar los vectores en tiempo de compilación. -Mostrar el contenido de los vectores en paralelo. -Realizar búsquedas secuenciales: introduciendo por teclado un código de libro se mostrara el titulo que le corresponde, en caso de que el código tecleado no exista deberá mostrar un mensaje de aviso.

#include <stdio.h>
#define MAXEL 8
typedef int Tcodigos[MAXEL];
typedef char Tdesc[MAXEL][30];
Tcodigos codigos = {8016, 2038, 7856, 2730, 4564, 6574, 9809, 3421};
Tdesc desc = {"El Hobbit", "Un mundo feliz", "El dardo en la palabra", "Historia de la Gestapo", "Harry Potter", "Angeles y demonios", "El codigo Da Vinci", "Venganza en Sevilla"};
void main(){
int i, num, encontrado = 0;
for(i=0; i<MAXEL; i++){
printf("El libro %s tiene el codigo %i\n", desc[i], codigos[i]);
}
printf("Introduzca el codigo del libro a buscar\n");
scanf("%i", &num);
for (i=0; i< MAXEL; i++)
if (codigos[i] == num){
printf ("Libro encontrado\n");
printf ("El libro es %s\n", desc[i]);
i = MAXEL;
encontrado = 1;
}
else if((i == 5)&&(encontrado == 0)){
printf("El codigo introducido no existe \n");
}

}
Pues yo creo que esta todo bien excepto en un detalle. La comprobacion sobre si se ha encontrado el codigo o no seria mejor hacerla fuera del bucle for(). Simplemente compruebas si (encontrado == 0) y listo.
Un par de cosillas.

Para código se utiliza la etiqueta code, no quote. code mantiene la indentación.

En este caso es una tontada, ya que se trata de 8 elementos, pero cuando encuentras el libro buscado, continúas buscando en los siguientes elementos del vector. Es más eficiente terminar de buscar en cuanto se encuentra el libro, y para eso está el break.

También sacaría fuera del for el imprimir nada por pantalla, simplemente mira después del bucle el valor de encontrado.
Muchas gracias chicos, ahora tengo otro problema:
me piden esto:
Practica 19:
Se dispone de dos vectores paralelos con 8 elementos, en primer vector es de tipo numérico entero (contiene códigos de artículos desordenados). Los elementos del segundo vector, son cadenas de caracteres el segundo (contienen títulos libros).
Codificar un programa que realice el siguiente proceso: -Inicializar los vectores en tiempo de compilación. -Mostrar el contenido de los vectores en paralelo. -Ordenar el primer vector, los datos del segundo vector se sincronizaran con la ordenación de códigos del primer vector.
-Mostrar el contenido de los vectores en paralelo. -Realizar búsquedas dicotómicas: introduciendo por teclado un código de libro se mostrara el titulo que le corresponde, en caso de que el código tecleado no exista deberá mostrar un mensaje de aviso.


y tengo esto:
#include <stdio.h>
#include <stdlib.h>
#define MAXEL 8
typedef int Tcodigos[MAXEL];
typedef char Tdesc[MAXEL][30];
Tcodigos codigos = {8016, 2038, 7856, 2730, 4564, 6574, 9809, 3421};
Tdesc desc = {"El Hobbit", "Un mundo feliz", "El dardo en la palabra", "Historia de la Gestapo", "Harry Potter", "Angeles y demonios", "El codigo Da Vinci", "Venganza en Sevilla"};
void ordenar(int xt[MAXEL])
{
int i,sw,g;
  do
  {
     sw=0;

    for(i=0;i<MAXEL;i++)

       if (xt[i]>xt[i+1])
      {
          g=xt[i];
         xt[i]=xt[i+1];
         xt[i+1]=g;
         sw=1;
      }

  } while (sw !=0);

}
int busquedabin (int vector[], int N, int buscado){
int izq = 0;
int der = N-1;
int centro = (izq+der)/2;
while ((izq<=der) && (vector[centro]!=buscado)) {
   if (buscado<vector[centro])
      der = centro - 1;
   else
      izq = centro + 1;
   centro = (izq+der)/2;
}
if (izq>der)
   return -1;
else
   return centro;
}

void main(){
   int i, num, encontrado = 0;
   for(i=0; i<MAXEL; i++){
      printf("El libro %s tiene el codigo %i\n", desc[i], codigos[i]);
   }
   ordenar(codigos);
   for(i=0; i<MAXEL; i++){
      printf("El libro %s tiene el codigo %i\n", desc[i], codigos[i]);
   }
   printf("Introduzca el codigo del libro a buscar\n");
   scanf("%i", &num);
   num = busquedabin(codigos, MAXEL, num);
   if (num == -1)
      printf("El codigo introducido no existe\n");
   else
      printf("El codigo introducido corresponde al libro %s", desc[num]);
}


El programa funciona a las mil maravillas, pero lo que no sé como hacer es que el array que contiene los libros, se ordene solo, despues de haber ordenado el de los códigos, no sé si me entendeis...
Mil gracias!
Sólo tienes que hacer los mismos cambios en ambos vectores a la vez. Si en el primer vector cambias el 3er dato por el 1º, en el segundo vector cambias el 3er dato por el 1º, etc.
4 respuestas