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

#791
1) Colocas los canales a procesar en un array.
2) En el bucle iteras un numero de veces igual a los canales a procesar. Utilizas el contador como indice del array para conocer que canal procesar.

Un programa de ejemplo:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   int canal[] = {2, 4, 5};
   size_t num_canales = sizeof canal / sizeof canal[0];
   size_t i;

   /* ... */

   for (i = 0; i < num_canales; i++)
   {
      /* Procesamos canal[i] */
      printf("El canal a procesar en esta iteracion es %d\n", canal[i]);
   }
   
   return EXIT_SUCCESS;
}


Un saludo
#792
Lo primero que debes hacer es cambiar la definición de la función main y evitar el uso de la biblioteca conio de Borland, las razones se encuentran en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

El error principal ya lo indica el mensaje de error:
Citarpassing argument 1 of strcmp makes pointer from integer without a cast
Se genera en la llamada a strcmp:
char  palabra, ...

x = strcmp (palabra, "uabc");

Y la razón es: la función strcmp espera como argumentos las direcciones en memoria de (punteros a) los arrays que almacenan las cadenas a comparar pero tu pasas como primer argumento la variable "palabra" y esta es de tipo char.

Para solucionarlo debes declarar esa variable como un array de caracteres con la capacidad suficiente para cualquier palabra que indique el usuario. También debes agregar el carácter delimitador de cadena '\0' al final de ella y también de todas las almacenadas en el array letras:
char letras[][10] = {
   "012345678",
   "1BUKJHSTU",
   "2CLAF2RCW",
   "3DEUBLPIX",
   "4XSLOCQTY",
   "5ORFJHLEZ",
   "6PALMASCK",
   "7QRMCTOUP",
   "8ZKCEETBQ"
};
char palabra[10];
char n;


Otros errores se encuentran en la parte donde pides cada uno de los caracteres, esta debes cambiarla a:
puts("Introduce en orden las coordenadas de las letras:");
for (i = 0; i < f; i++){
   puts("Numero de fila:");
   scanf("%d", &r);
   
   printf("Numero de columna:");
   scanf("%d", &c);
   
   palabra[i] = letras[r][c];
}
palabra[i] = '\0';


Un saludo
#793
Cita de: leosansan en 23 Mayo 2013, 18:45 PMY para que esta aportación no se quede en unas meras disculpas, propongo el método alternativo de generar los números por comparación con los previamente introducidos, sería para sustituir por lo que hay "encima" de estas palabras:

Código (cpp) [Seleccionar]
for( i = 0; i < 100; i++){
   numeros[i]=rand() % 1000+1;
   for( j = i-1; j >=0 ; j--){
      if(numeros[i] == numeros[j]){
         i--;
         break;
      }
   }
}


Aunque seguro que se puede mejorar, la verdad no me termina de convencer el for con el if y el i-- con break
Se pueden evitar ambos cambiando el bucle interno y condicionando el incremento del contador. En C seria mas o menos así:
#define NUM_ELEM  1000

/* ... */

int num[NUM_ELEM];
int i;
int j;

/* ... */

i = 0;
while (i < NUM_ELEM){
   num[i] = rand() % (NUM_ELEM + 1);
   
   for (j = 0; j < i && num[j] != num[i]; j++)
      ;
   
   if (i == j)
      i++;
}


----

Cita de: mr.blood en 24 Mayo 2013, 08:35 AMDejo una alternativa que me parece que es más eficaz. (No recorre toda la matriz para comprobar si existe o no el valor).

Como necesitas tener todos los números del 0-99 es mejor aleatorizar la posición que el valor (Creo). ;)

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

int main()
{
srand(time(NULL));
int matriz[10][10], i, j, x, y;

memset(matriz, 0, sizeof(int)*100);

for(i=0;i<100;i++)
{
x=rand()%10;
y=rand()%10;
if(matriz[x][y]==0)
{
matriz[x][y]=i;
}
else
{
i--;
continue;
}
El problema es: en lugar de preocuparnos por repeticiones en los valores ahora nos preocupamos por repeticiones en las posiciones. Para el caso es lo mismo en el sentido de no evitar la verificación por repetidos.

----

Cita de: leosansan en 24 Mayo 2013, 09:56 AMLamentablemente no tengo compilador en este momento y no puedo comparar, pero creo que siguiendo lo que planteaste de obtener aleatorios de 0 a 100, aunque recuerda que en realidad era "entre" 0 y 10000, el siguiente código podría ser de eficiencia/velocidad semejante.:
Código (cpp) [Seleccionar]
// ...
   
for (i = 0; i < 10; i++, k++){
   for (j = 0; j < 10; j++, k++){
      m[i][j] = n[k];
      cout << m[i][j] << "\t";
   }
   
   k--;
   cout << endl;
}
No es necesaria una variable para calcular la posición del array "n", en su lugar puedes calcular esta en base a los contadores de fila y columna:
// ...
   
for (i = 0; i < 10; i++){
   for (j = 0; j < 10; j++){
      m[i][j] = n[i * 10 + j];
      cout << m[i][j] << "\t";
   }
   
   cout << endl;
}


Un saludo
#794
No se recomienda porque es innecesaria: en C la conversión de un valor de tipo "void *" a uno de tipo "T *" es automática y eso coloca la conversión al mismo nivel que las palabras reservadas "auto" y "register" (no tiene caso utilizarlas).

Un saludo
#795
Como ya te indico amchacon el error se genera al tratar de comparar el campo estado (de tipo "char [5]") con el valor 1 (de tipo signed int).

En su lugar debes compararlo con otra cadena utilizando la función strcmp y verificando si el valor de retorno de la función es cero, si es así las cadenas son iguales. Suponiendo que utilizas "baja" para eliminar de forma lógica un registro esa función se debe cambiar a:
void guardar()
{
   FILE *fp;
   
   fp = fopen("Final.txt", "w" );
   
   for (i = 0; i < nn; i++){
      // Si la cadena NO es igual a "baja" se imprime en el archivo
      if (strcmp(lista[i].estado, "baja") != 0){
         fprintf(fp, "%s\n", lista[i].nombre);
         fprintf(fp, "%d\n", lista[i].edad);
      }
   }
   
   fclose(fp);
}


Aparte de eso se deben corregir otras partes del programa, por ejemplo declaras todas las funciones con el tipo de retorno "alumnos" pero ninguna retorna un valor, hay que cambiarlas para que retornen "void".

También hay que evitar el uso de la biblioteca conio de Borland y el uso de fflush(stdin). Explicaciones del porque de ello en el tema |Lo que no hay que hacer en C/C++. Nivel basico|

Un saludo
#796
Programación C/C++ / Re: duda con arreglos
29 Mayo 2013, 16:03 PM
Primero: cuando publiques código fuente utiliza las etiquetas de código. Estas se agregan mediante el cuadro desplegable con el texto "GeSHi" en la pagina de composición de mensajes, solo tienes que seleccionar ahí el lenguaje (C, C++, etc.).

Errores y deficiencias en ese programa hay varios. Por ejemplo en la función "llenar" lo primero que haces con el parámetro "archivo" es sobrescribir su valor y por ello no debe ser un parámetro sino una variable local a la función.

El error principal se debe a que tratas de leer los números del archivo con dos bucles:
while (!feof (archivo) ) {
   for (i = 0; i < MAX; i = i + 1) {
      fscanf (archivo, "%d", &c);
      A[i] = c;
      printf ("%d ", A[i]);
   }
}

En su lugar debes utilizar solo uno donde primero verificas que haya espacio en el array (validación del indice) y a continuación si se leyó con éxito un valor del archivo (valor de retorno de la función fscanf).

El programa corregido:
#include <stdio.h>
#include <stdlib.h>

#define MAX 100

void llenar(int A[]);

int main(void)
{
   int arreglo[MAX];
   
   llenar(arreglo);
   return 0;
}

void llenar(int A[])
{
   FILE *archivo;
   char nombreArchivo[20];
   int i;
   
   while (1){
      printf("Nombre de archivo a trabajar con extension (txt):");
      fflush(stdout);
      scanf("%s", nombreArchivo);
     
      if ((archivo = fopen(nombreArchivo, "r")) == NULL)
         puts("El archivo no pudo abrirse");
      else
         break;
   }
   
   for (i = 0; i < MAX && fscanf(archivo, "%d", A + i) == 1; i++)
      printf(" %d", A[i]);
   putchar('\n');
   fclose(archivo);
}


----

En cuanto a tu segunda pregunta la respuesta es no, no puedes calcular el tamaño de un array pasado como argumento. Ello porque toda función declarada en alguna de estas dos formas:
int fn(char a[]);

int fn(char a[123]);

En realidad se procesa como:
int fn(char *a);
Para solucionarlo no hay opción mas que pasar de forma manual (mediante un parámetro adicional) el numero de elementos:
int fn(char *a, size_t num_elem);

Un saludo
#797
Otros dos comentarios:

1) La función main se debe definir como "int main(void) ..." o "int main() ..." y se debe indicar su valor de retorno con (al menos) "return 0;". También se debe evitar el uso de la biblioteca conio de Borland. Mas información sobre estos dos temas en |Lo que no hay que hacer en C/C++. Nivel basico|.

2) El tipo de la variable "select" debe ser "int" ya que ese es el tipo de retorno de la función getchar.

Un saludo
#798
Cita de: The_C_Coder en 28 Mayo 2013, 22:52 PM
La linea en cuestion es scanf("%s__%s" , &str1 , &str2); Se supone que si yo pongo qqq__zzz , deberia guardar qqq en str1 y zzz en str2. La cuestion es que me lo guarda todo en str1 y me deja vacio str2.
Ese es el comportamiento normal de scanf con el especificador de formato "%s": leer una palabra (secuencia de caracteres delimitada por espacio blanco).

Para leer dos secuencias cuyo separador es "__" debes utilizar, por poner un ejemplo:
#include <stdio.h>
#include <stdlib.h>

#define NUM_CHARS  80

int main(void)
{
   char a[NUM_CHARS];
   char b[NUM_CHARS];
   
   printf("Palabras separadas por \"__\": ");
   fflush(stdout);
   if (scanf(" %[^_]__%[^_\n]", a, b) == 2){
      printf("a: %s\n", a);
      printf("b: %s\n", b);
   }
   
   return EXIT_SUCCESS;
}


----

Cita de: The_C_Coder en 28 Mayo 2013, 23:38 PM
Cita de: Black Master en 28 Mayo 2013, 23:22 PM
Código (cpp) [Seleccionar]
scanf("%s__%s" , str1 , str2);
Prueba así a ver...
Gracias por la respuesta , aunque en el mejor de los casos el compilador pone los ampersand y en el peor da error. En mi caso compila pero sigue igual que antes. Aun asi eso no se debe hacer , scanf recibe direcciones de memoria de las variables donde guarda los datos , no las propias variables ...
Si str1 y str2 son los nombres de dos arrays de caracteres no es necesario utilizar el operador "dirección de" en la llamada a scanf.

----

Cita de: amchacon en 29 Mayo 2013, 00:27 AM
Cita de: CCross en 29 Mayo 2013, 00:03 AM
De esta forma te deberia funciónar

Código (cpp) [Seleccionar]
#include <stdio.h>

int main()
{
    char cad[5], cad1[5];

    scanf("%s" "%s", &cad, &cad1);
    printf("%s__%s", cad, cad1);

    return 0;
}
Los & del scanf sobran. Y aun asi no te compilara porque has puesto dos comillas en un mismo argumento.
El uso de dos cadenas literales seguidas:
scanf("%s" "%s", &cad, &cad1);
No es un error ya que se concatenan resultando en una sola. Esa llamada a funcion es equivalente a:
scanf("%s%s", &cad, &cad1);

Un saludo
#799
Cita de: leosansan en 26 Mayo 2013, 17:21 PMpor ejemplo, se podría calcular sin usar strlen la longitud de la cadena, pero estoy un poco vago hoy
No es necesario multiplicar cada dígito por la potencia de 2 correspondiente, en su lugar antes de procesar cada dígito se multiplica el acumulado por la base:
Código (cpp) [Seleccionar]
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

int main()
{
   char binario[11];
   cout << "Escriba un numero en binario: ";
   cin >> binario;
   
   int num = 0;
   for (int i = 0; binario[i] != '\0'; i++)
      num = num * 2 + binario[i] - '0';
   cout << binario << " == " << num << endl;
   
   return 0;
}


Cita de: leosansan en 26 Mayo 2013, 17:21 PMlamento recordarle que no es así, pues estas limitado al número de dígitos capaz de calcular/manejar en C/C++, que anda por las quince cifras si mal no recuerdo, toda vez  que estas haciendo uso de la función ""pow" en una parte del código.
Ya que no es necesario el uso de la función pow para pasar de binario a decimal la limitante es el numero de bits del acumulador, si se utiliza una variable de tipo int se tienen como mínimo 16, 32 en el caso del tipo long.

Un saludo
#800
Cita de: NivekiyeR en 26 Mayo 2013, 09:22 AMTengo un duda con respecto a la libreria conio.h de c++
Conio no es parte de la biblioteca estándar de C++ y no se recomienda su uso. Mas información en la pagina |Lo que no hay que hacer en C/C++. Nivel basico|.

Cita de: NivekiyeR en 26 Mayo 2013, 09:22 AMla duda surge por q yo intento programar en un emulador de C para android
Tienes que explicarte de una forma clara y precisa para que alguien en los foros pueda ayudarte. Empieza aclarando cual es el lenguaje de programación que utilizas.

Cita de: NivekiyeR en 26 Mayo 2013, 09:22 AMy se q se una scanf(""); y printf(""); pero el problema es como ago para q el printf me de el valor de la variable "x" por ejemplo y no q me escriba X en la pantalla; no se si me explico ??
Me temo que no.

En C se utiliza scanf para leer un valor y printf para imprimirlo mientras que en C++ la forma políticamente correcta es mediante los objetos cin (para lectura) y cout (para escritura).

Un saludo