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 - bsantana

#1
Cita de: boctulus en 19 Abril 2016, 01:16 AM
Las definiciones de las funciones (que son opcionales en ciertos casos) se pueden colocar en un archivo aparte de "headers" (de extension .h y con el mismo nombre que tu .c)


// palindromos.c

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

using namespace std;

/*
Capicupa (palindromo) ?

*/

// todo esto podria estar en palindromos.h
const char* r_bool(bool b);
bool es_capicua(int x);
void print_capicua_rango(int a, int b);


int main(void)
{
cout << r_bool(es_capicua(10000)) << endl; // false
cout << r_bool(es_capicua(10001)) << endl; // true
cout << r_bool(es_capicua(10501)) << endl; // true
cout << r_bool(es_capicua(807)) << endl; // false
cout << r_bool(es_capicua(808)) << endl; // true

print_capicua_rango(19,100);

getchar();
}

void print_capicua_rango(int a, int b){
int i,count=0;
for (i=a; i<b; i++){
if (es_capicua(i)){
cout << i << endl;
count++;
}
}
cout << "El numero de terminos capicua es " << count;
}

bool es_capicua(int x){
char buffer [10];
int i;
bool exito = true;

itoa(x,buffer,10);

int len = strlen(buffer);
for (i = 0; i<(int)len/2 && exito; i++)
exito = buffer[i]==buffer[len-1-i];

return exito;
}

const char* r_bool(bool b){
  return (b ? "true" : "false");
}



Se convierte en......


// palindromos.h

const char* r_bool(bool b);
bool es_capicua(int x);
void print_capicua_rango(int a, int b);




// palindromos.c

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "palindromos.h"

using namespace std;

/*
Capicupas (palindromos)
*/


int main(void)
{
cout << r_bool(es_capicua(10000)) << endl; // false
cout << r_bool(es_capicua(10001)) << endl; // true
cout << r_bool(es_capicua(10501)) << endl; // true
cout << r_bool(es_capicua(807)) << endl; // false
cout << r_bool(es_capicua(808)) << endl; // true

print_capicua_rango(19,100);

getchar();
}

void print_capicua_rango(int a, int b){
int i,count=0;
for (i=a; i<b; i++){
if (es_capicua(i)){
cout << i << endl;
count++;
}
}
cout << "El numero de terminos capicua es " << count;
}

bool es_capicua(int x){
char buffer [10];
int i;
bool exito = true;

itoa(x,buffer,10);

int len = strlen(buffer);
for (i = 0; i<(int)len/2 && exito; i++)
exito = buffer[i]==buffer[len-1-i];

return exito;
}

const char* r_bool(bool b){
  return (b ? "true" : "false");
}



Muchas gracias, muy claro todo.
Si es que sabes algo del test.c te lo agradeceria mucho!
#2
Buenas, tengo una duda con unos requerimientos raros que tengo en un proyecto de la universidad.
Tengo mi programa listo para entregar, pero me solicitan entregar esto junto al programa.
Citar14.Construir un archivo separado llamado test.c donde se encuentre el procedimiento o función main a fin de demostrar el uso de sus funciones. Procure entregar resultados por pantalla sobre cada llamado.
15.Estructurar programa empleando archivos de cabecera (.h) y los códigos fuentes (.c)

Bueno la verdad no nos dan ningun ejemplo de como son estos archivos ni nada, por lo que les consulto si alguien tiene idea alguna de como hacerlos. Saludos
#3
Cita de: engel lex en 12 Abril 2016, 05:28 AM
te recomiendo que para resolver errores de tiempo de ejecución (no entra al else) uses el debugger de tu IDE, seguramente si buscas en google "debugger [el nombre de tu IDE]" consigues como usarlo y puede ser sumamente practico

Ya resolvi todos los problemas, y gracias por el dato, investigaré!
#4
Cita de: engel lex en 12 Abril 2016, 05:06 AM
la primera si observas bien es un poco obvia, estás rompiendo el flujo del if

}
                printf("as");
                else if (contador<=columDisponibles){



el if debe ser
if(x){
a();
}else if(y){
b();
}


tu estás rompiendo el if al hacer

if(x){
a();
}//rompes el flujo
algo_fuera_de_lugar();
else if(y){
b();
}


el segundo probablemente es heredado por el primero (rompiste el flujo y no sabe ya donde va que)
Mmh gracias no tenia claridad con eso, pero puse ese printf porque la funcion no ingresa al "else if", no realiza nada de lo que está dentro de él.
Pero gracias me sirve para comprender mejor el elif.
#5
En esta funcion me arroja dos errores:
1)expected '}' before 'else'
2)break statement not within loop or switch

El primer error corresponde a la linea del

               printf("as");
               else if (contador<=columDisponibles){

Y el segundo error correponde al de

           if(palabra[h]=='\0'){
               break;
           }


Es como si perdiera la referencia del while o de los if, siendo que revisando cada llave, estan bien segun yo. Dejo el codigo de la funcion completa:

char** definirDificultad(char ** nuevaMatriz,int N, int M ,int dificultad){
   int i,j,h,contador, filasDisponibles,columDisponibles;
   char caracter;
   char palabra[200];
   //palabra=(char*)malloc(sizeof(char));

   for(i=0;i<N;i++){
       for(j=0;j<M;j++){
           nuevaMatriz[i][j]='&';
       }
   }

   FILE *diccionario;
   diccionario=fopen("Diccionario.txt","r");

   posicion *posicionActual;
   posicionActual=malloc(sizeof(posicion));

   //Palabras horizontales
   if(dificultad==1){

       for(i=0;i<N;i++){
           for(j=0;j<M;j++){
               fscanf(diccionario,"%c",&caracter);
               if(feof(diccionario)){
                   break;
               }
               if (caracter!='\n'){
                   nuevaMatriz[i][j]=caracter;
               }
           }
       }

   }
   // Palabras verticales
   else if(dificultad==2){
       rewind(diccionario);
       h=0;
       while(!feof(diccionario)){
           fscanf(diccionario,"%c",&palabra[h]);
           h++;
       }
       palabra[h-1]='\0';
       h=0;
       j=0;
       int k=0;
       posicionActual->x=0;
       posicionActual->y=0;
       while(palabra[h]!='\0'){
           contador=0;
           while(palabra[h]!='\n'){
               contador++;
               h++;
           }
           k=h-contador;
           if(contador<=N && contador<=M && contador!=0){
               filasDisponibles=N-(posicionActual->x);
               columDisponibles=M-(posicionActual->y);
               if(contador<=filasDisponibles){
                   for(i=posicionActual->x;i<(contador+posicionActual->x);i++){
                       if(i>=N){
                           break;
                       }
                       else if(nuevaMatriz[i][j]=='&' || nuevaMatriz[i][j]==palabra[k]){
                           nuevaMatriz[i][j]=palabra[k];
                           k++;
                       }
                   }
                   i=posicionActual->x;
                   while(nuevaMatriz[i][j]!='&'){
                       j++;
                       if(j>=M){
                           j=0;
                           i++;
                       }
                   }
                   posicionActual->y=j;
                   posicionActual->x=i;
               }
               printf("as");
               else if (contador<=columDisponibles){
                   for(j=posicionActual->y;j<(contador+posicionActual->y);j++){
                       if(j>=M){
                           break;
                       }
                       else if(nuevaMatriz[i][j]=='&' || nuevaMatriz[i][j]==palabra[k]){
                           nuevaMatriz[i][j]=palabra[k];
                           k++;
                       }
                   }
                   j=posicionActual->y;
                   while(nuevaMatriz[i][j]!='&'){
                       j++;
                       if(i>=N){
                           i=0;
                           j++;
                       }
                   }
                   posicionActual->y=j;
                   posicionActual->x=i;
               }
           }
           if(palabra[h]=='\0'){
               break;
           }
           h++;
       }
   }
   //free(palabra);
   free(posicionActual);
   fclose(diccionario);
   return nuevaMatriz;
}
#6
Cita de: MAFUS en 10 Enero 2016, 23:06 PM
C no tiene operadores para comparar cadenas de caracteres, por tanto lo que haces es comparar dos direcciones de memoria. Para ello debes usar la función de librería strcmp.

Salió perfect, muchas gracias!
#7
Cita de: MAFUS en 10 Enero 2016, 20:01 PM
Eso es porqué no has dimensionado la posición i de arregloNombres. Piensa que es solo un puntero y no puedes alojar nada en él.

Puedes resolver eso de dos formas:
Declaras dos dimensiones en arreglonombres:arregloNombres[10][80];


Hola denuevo, usé esta solución, pero al querer comparar
fscanf(lectura,"%s",nombre1);
while(arregloNombres[i]==nombre1)


simplemente no cumple la condición, alguna recomendacion?
#8
Solucionado con arreglo de dos dimensiones! gracias
#9
Cita de: MAFUS en 10 Enero 2016, 19:20 PM
Solución:
Usa la función strncpy para realizar una copia por valor de la variable nombre. Acuérdate de que antes de eso debes dimensionar la posición i de arregloNombres para dar cabida al dato.

Hola gracias por la respuesta, uso la solución que me diste pero al ejecutar se me cae el programa, en el momento que debería salir del ciclo for
for(i=0;i<cantidadNombres;i++){
        fscanf(archivoLectura, "%s", nombre);
        strncpy(&arregloNombres[i],nombre,9);
    }

    printf("%s",arregloNombres[0]);

Si es algo de asignación de memoria que no hay, soy medio ignorante, espero tu respuesta!
#10
Quiero asignar a un arreglo de arrays diferentes palabras, sacadas de un archivo de texto, sé que debo utilizar:

const char *arregloNombres[10];

Y mi idea es que el arreglo arroje:

arregloNombres[0]="Esteban"
arregloNombres[1]="Alexis"
etc...

Pero al leer el archivo con los nombres de esta manera:
fscanf(lectura,"%s %s %d", nombre1,nombre2,&aux);
arregloNombres[i]=nombre1; //i va en aumento


Lo unico que hace es dejarme todas las posiciones del arreglo con el mismo nombre.
¿Como puedo dejar una posicion con un nombre especifico obtenido de un archivo sin que despues se modifique?
Saludos