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ú

Mensajes - rir3760

#1001
Debes utilizar una tercera tabla para almacenar ahí los indices de los elementos una vez ordenados. En base a ella ya puedes imprimir la segunda tabla con el orden de la primera.

Para ejemplificar (el array ndx es la tabla de indices):
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   int num[3] = {3, 1, 2};
   int ndx[3] = {0, 1, 2}; /* Indices de los elementos */
   char ch[3] = {'a', 'b', 'c'};
   int N = 3;
   int i;
   int j;
   
   /* Ordenacion mediante BubbleSort */
   for (i = N - 1; i > 0; i--){
      for (j = 0; j < i; j++)
         if (num[ndx[j]] > num[ndx[j + 1]]){
            int aux;
           
            aux = ndx[j];
            ndx[j] = ndx[j + 1];
            ndx[j + 1] = aux;
         }
   }
   
   for (i = 0; i < N; i++)
      printf(" %c", ch[ndx[i]]);
   putchar('\n');
   
   return EXIT_SUCCESS;
}


Un saludo
#1002
Cita de: rod00x3 en  5 Enero 2013, 00:03 AMLo que quiero es saber si me pueden ayudar para en lugar de comparar caracter por caracter de la cadena pueda comparar toda una cadena [...]

el codigo actual que tengo es el siguiente:

if(((((adl_ioDefs_t *)Param)[ 7 ]) & ADL_IO_LEV_HIGH)==0){
   adl_atSendResponse(ADL_AT_RSP,"\n detonado");
   adl_smsSend(smshandle,"5543299041","ATM sucursal COSMOBIT a detonado",ADL_SMS_MODE_TEXT);
}
La condición es:
1) Convertir la variable "Param" al tipo "adl_ioDefs_t *"
2) Comparar ambos valores con el operador a nivel de bits AND.
Y es verdadera si ningún par de bits esta a uno.

Honestamente no creo que busques una comparación de cadenas. Aquí lo mejor es explicar en detalle la operación que deseas realizar en base al tipo "adl_ioDefs_t *" y la macro ADL_IO_LEV_HIGH. También indica el compilador, plataforma y bibliotecas que estas utilizando para el programa.

Un saludo
#1003
En el caso de los arrays cuando su identificador se utiliza en una llamada a funcion no es necesario el operador "direccion de" (el '&'). Esta sentencia:
Trasposada(fil,col,&mat);
Se puede reducir a:
Trasposada(fil, col, mat);
Sin problemas.

Un saludo
#1004
Cita de: n3t_3rr0r en  3 Enero 2013, 13:30 PMbuenas, yo por aqui de nuevo poblando el foro con mis dudas y preguntas :P..como ya dije en otro post estoy siguien un libro y en uno de sus capitulos ...
Revisa con cuidado el libro para asegurarte del tipo de la variable "key", este debe ser de tipo "int" ya que ese es el valor de retorno de la función getchar.

Un saludo
#1005
Programación C/C++ / Re: mediana en c++
3 Enero 2013, 16:20 PM
Como ya te comentaron el segundo parámetro de la función esta de mas ya que ese es su valor de retorno, también deberías pasar el vector por referencia.

El problema se debe a que la división entre dos se debe usar al indicar el indice para así encontrar el elemento (o los dos) al medio. De esta forma:
Código (cpp) [Seleccionar]
#include <vector>
using namespace::std;

// ...

double mediana(vector<int>& v)
{
   vector<int>::size_type i = v.size();
   return i % 2 == 1 ? v[i / 2] : (v[i / 2 - 1] + v[i / 2]) / 2;
}


Un saludo
#1006
Cita de: muymuyperdido en 28 Diciembre 2012, 12:47 PMGracias! Acabé planteandolo similar [...]

Pero aun no sé si funciona
No funciona por varios errores como leer dos veces el numero de columnas, utilizar feof para controlar los bucles y utilizar 1 como primer indice de un array.

Una forma correcta es:
i = 0;
j = 0;
if (fscanf(fe, "%d", &m) == 1)
   while (fscanf(fe, "%f", tab2[i] + j) == 1)
      if (++j == m){
         j = 0;
         i++;
      }


Un saludo
#1007
Otra opción es, en la caso de C, utilizar la función difftime para obtener la diferencia entre dos fechas. Mas o menos así:
#include <time.h>

/* ... */

/* Retorna 1 si no se ha sobrepasado la fecha, 0 en caso contrario */
int expired(struct tm *ini)
{
   return difftime(time(NULL), mktime(ini)) >= 0.0;
}


Un saludo
#1008
Programación C/C++ / Re: warnings
29 Diciembre 2012, 01:33 AM
Cita de: m@o_614 en 29 Diciembre 2012, 00:19 AM
NODO *ultimo;
    ultimo=*cabeza;
    while(ultimo->sig!=NULL)
       ultimo=ultimo->sig;
Con esto el programa revienta al procesar una lista vacía.

Cita de: m@o_614 en 29 Diciembre 2012, 00:19 AMNODO *ultimo;
    ultimo=*cabeza;
    while(ultimo!=NULL)
       ultimo=ultimo->sig;
Y aquí no se actualizaría correctamente si, de nuevo, la lista esta vacía.

Para insertar un nodo al final:
void insertar_ultimo(struct nodo **p, struct nodo *nodo)
{
   while (*p != NULL)
      p = &(*p)->sig;
   
   *p = nodo;
}

Donde el primer argumento es la dirección en memoria de la variable que almacena la dirección en memoria del primer nodo (Ouch!), usualmente "&primero". El segundo argumento es la dirección en memoria del nodo a insertar.

Por ultimo y en el caso ideal cada función debe realizar una sola operación, por ejemplo la función que agrega pide los datos y llama a las funciones para 1) Crear un nodo y 2) Insertarlo en la lista.

Un saludo
#1009
Programación C/C++ / Re: warnings
28 Diciembre 2012, 18:16 PM
Para imprimirlos en orden inverso se puede desarrollar una función recursiva, mas o menos así:
void imprimir_rev(struct nodo *p)
{
   if (p != NULL){
      imprimir_rev(p->sig);
     
      /* Imprimir informacion del nodo apuntado por p */
   }
}


Un saludo
#1010
Programación C/C++ / Re: problema if's anidados
27 Diciembre 2012, 03:45 AM
El error principal es lógico y se debe a utilizar el mismo operador en las operaciones de suma y resta:

}else if(operacion==43){
   printf("%d %c %d = ",numero1,operacion,numero2);
   scanf("%d",&respuesta);
   resultado=numero1+numero2;
}else if(operacion==45){
   printf("%d %c %d = ",numero1,operacion,numero2);
   scanf("%d",&respuesta);
   resultado=numero1+numero2; /* <== */


Ademas el programa es demasiado largo. Se puede reducir a:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define NUM_INTENTOS  5

int main(void)
{
   int i, a, b, respuesta, resultado, aciertos = 0;
   char oper;
   
   srand(time(NULL));
   
   for (i = 0; i < NUM_INTENTOS; i++){
      while (1){
         a = rand() % 10 + 1;
         b = rand() % 10 + 1;
         oper = rand() % 6 + 42;
         
         if (strchr("*+-", oper) || (oper == '/' && a > b && b != 0))
            break;
      }
      printf("%d %c %d = ", b, oper, a);
      scanf("%d", &respuesta);
     
      switch (oper){
      case '+':
         resultado = a + b;
         break;
      case '-':
         resultado = a - b;
         break;
      case '*':
         resultado = a * b;
         break;
      case '/':
         resultado = a / b;
         break;
      }
     
      if (respuesta == resultado)
         aciertos++;
   }
   printf("Aciertos: %d Calificacion %d\n", aciertos, aciertos * 20);
   
   return 0;
}

No lo probé pero debería funcionar, eso te toca a ti.

Un saludo