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

#46
Hola gente.
No quería molestarlos por esta nimiedad pero en realidad no logro realizar el código correcto para demostrarlo, en todos los manuales dice que los punteros se pasan a las funciones por valor, ¿es este un Ej. correcto para demostrarlo? porque estoy pasando el puntero y en main se modifica el valor al pasar un puntero a la función, y en el otro caso es correcto porque estoy pasando la variable "a" por referencia pasando la dirección de memoria.-

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

void funcionCp(int *q);
void funcionDm(int *q);


int main( void ){
int a=100, *p = &a;

funcionCp(p);

printf("\n Variable *p = %d", *p);

funcionDm(&a);

printf("\n Variable *p = %d", *p);

return 0;
}

void funcionCp(int *q) {
*q+=1;
}

void funcionDm(int *q) {
*q+=1;
}


Saludos.
#47
Hola.
El programa que dejo a continuación funciona perfectamente en Linux pero no en Windows, la primera línea borra la pantalla y la segunda cambia la posición del cursor. -
La pregunta es ¿conocen algo tan sencillo como esto para hacer lo mismo en Windows?, sin utilizar bibliotecas externas o el API de Windows. -
Solo que las coordenadas no las puedo hacer funcionar utilizando los valores insertados en una variable, estoy practicándolo. -

int x = 10, y = 10;
printf("\033[x;yH");


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

int main( void ){

printf("\033[2J\033[1;1H");
printf("\033[10;10H");

printf( "\n Pulse una tecla para cambiar la posicion del cursor en pantalla..." );
getchar();

printf("\033[2J\033[1;1H");
printf("\033[1;1H");
printf( "\n Ahora estoy en otro lugar..." );

getchar();

return 0;
}


Eternal , Littlehorse desconozco la legalidad en los foros por ello si necesitan la fuente me lo dicen y la posteo.- 

Saludos.
#48
Hola a todos.
Bueno esa es mi intriga, estoy haciendo un programa para practicar y note que tiene más de 10 bucles y sin pensar demasiado los hice todos con while, quisiera saber si esto de utilizar uno u otro pude afectar la memoria como a la velocidad del programa. -

Saludos.
#49
Hola.
Estoy realmente trabado con esto, hace más de 2 días que le doy vueltas (tire unas 30 hojas oficio) al asunto y nada, como estoy a punto de abandonarlo por unos días me dije seguramente en ese foro debe haber mentes iluminadas que me puedan tirar una soga. - :huh: :huh: :huh:
Para comenzar, les dejo unos posibles ingresos que se pueden dar, la pregunta es: ¿alinearían las 2 cifras con respecto al punto o lo harían directamente? -

Se trata de la opción: Sumar

123.45  ==> 123.45
6.5                    6.5

12.34     ==>       12.34
1234.56            1234.56

1234.56  => 1234.56
123                123

Si desean no poner código no importa, solo necesitaría un poco de pseudocódigo para aclarar un poco el panorama.-

Saludos.
#50
Hola, gente.
Después de declarar una cadena de caracteres en C ¿se puede inicializar todos los elementos a cero, sin tener que realizarlo a través de un bucle?. -

Saludos.
#51
Hola, gente.
Tengo un inconveniente en la validación para que no se supere el máximo y el mínimo que soporta el tipo float, en internet no encuentro nada relacionado y modifique el código muchas veces y nada, solo me deja ingresar números negativos.

#include <stdio.h>
#include <float.h>

float suma( const float o1, const float o2 );
float resta( const float o1, const float o2 );
float division( const float o1, const float o2 );
float multiplicacion( const float o1, const float o2 );


int main( void ){
float (*ptrf[]) ( float, float ) = {suma, resta, division, multiplicacion};
int ok, ch, opc;
float opeUno, opeDos, result;

printf( "\n ========== Calculadora ==========\n\n" );

do{
printf("\n Introduzca el primer operando....:");
ok = scanf("%g", &opeUno) == 1 && opeUno <= FLT_MIN && opeUno <= FLT_MAX;
while ((ch = getchar()) != EOF && ch != '\n');
}while(!ok);

do{
printf("\n Introduzca el segundo operando...:");
ok = scanf("%g", &opeDos) == 1 && opeDos <= FLT_MIN && opeDos <= FLT_MAX;
while ((ch = getchar()) != EOF && ch != '\n');
}while(!ok);

printf( "\n 1 - Suma \n 2 - Resta \n 3 - Divide \n 4 - Multiplica" );
do{
printf( "\n\n Ingrese una opcion...:" );
ok = scanf("%d", &opc) == 1 && opc >= 1 && opc <= 4;
while ((ch = getchar()) != EOF && ch != '\n');
}while(!ok);

result = ( ptrf[opc-1] ) ( opeUno, opeDos );

printf( "\n El resultado es %g", result );

return 0;
}


float suma( const float o1, const float o2 ){
return o1 + o2;
}

float resta( const float o1, const float o2 ){
return o1 - o2;
}

float division( const float o1, const float o2 ){
return o1 / o2;
}

float multiplicacion( const float o1, const float o2 ){
return o1 * o2;
}


Saludos a todos y espero puedan ayudarme a encontrar la solución.-
#52
Hola a todos.
Copie el código de la siguiente página que me indico Eternal Idol, referente a realloc:
http://www.cplusplus.com/reference/cstdlib/realloc/

Y grande fue mi sorpresa cuando descubrí que utilizando memoria dinámica se podía hacer lo mismo que con un array, digo sorpresa porque considero haber leído bastante sobre punteros y en ninguno hace referencia a esto. -
Si esto es correcto, tengo 1 pregunta para hacerles. -
¿Que es más eficiente, utilizar array o memoria dinámica?, para el caso. -  

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int main ( void ){
size_t ingresos, n, contador = 0, ok, ch;
int* numeros = NULL;
int* mas_numeros = NULL;

do{
do{
printf("\n Ingresa un numero entero(maximo %d  => 0 finaliza )....: ", INT_MAX);
ok = scanf("%u", &ingresos) == 1 && ingresos >= 0 && ingresos <= INT_MAX;
while( (ch = getchar()) != EOF && ch != '\n' );
if( ok == 0 ){
printf( "\n El ingreso es incorrecto, intentelo nuevamente...\n\n\t Pulse una tecla para continuar..." ); getchar();
}
}while(!ok);

contador++;

mas_numeros = (int*)realloc( numeros, contador * sizeof(int) );

if( mas_numeros!=NULL ){
numeros=mas_numeros;
numeros[contador-1]=ingresos;
}
else{
free( numeros );
puts( "Error (re)allocating memory" );
exit(1);
}
}while (ingresos!=0);

printf ("\n Numeros introducidos.....: ");
for( n=0; n < contador - 1; n++ )
printf( "%d ",numeros[n] );

free (numeros);

return 0;
}


Es redundante decir que al código original le efectué bastante modificaciones, pero la esencia es la misma.

Saludos.
#53
Hola, gente. -
¿Es necesario liberar los 2 punteros por separado?, como lo hago en el código que dejo a continuación o es suficiente con liberar el puntero que devuelve malloc (tengo claro que malloc retorna un puntero void). -

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

int main( void ){
char *string1, *string2;
string1 = (char*) malloc(16);
strcpy(string1, "0123456789AB");

string2 = realloc(string1, 8);
printf("string1 Valor: %p [%s]\n", string1, string1);
printf("string2 Valor: %p [%s]\n", string2, string2);


free(string1);
free(string2);

return 0;
}


Bueno es todo, espero aclaración.
Un abrazo.
#54
Hola, gente.
Nuevamente con cositas que no puedo resolver consultando al amigo Google, de la manera como está planteado el programa ¿es imposible liberar la memoria asignada al puntero arr?, el manual aconseja que nunca se reserve memoria de esta manera, pero aunque sea para tener un conocimiento más, es realmente cierta mi pregunta. -

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

int *asignar_Array(int size, int valor);

int main( void ){
size_t i;
int *vector = asignar_Array(5,45);

for( i=0; i<5; i++ ){
printf("\n %d", vector[i]);
}

free(vector);

return (EXIT_SUCCESS);
}

int *asignar_Array(int size, int valor) {
size_t i;
int *arr = (int*)malloc( size * sizeof(int ));

for( i=0; i<size; i++ ) {
arr[i] = valor;
}

return arr;
}



Saludos.
#55
Hola, gente.
Lo que me trae en este caso es una duda con la función free, con el libro que estoy estudiando punteros a cada instante remarca que la función free es insegura, no pongo aquí los argumento porque necesitaría 2 post, la pregunta es ¿por su experiencia consideran que esto es cierto?, debería utilizar la función que dejo a continuación o es esto una falacia. -

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

#define safeFree(p) saferFree((void**)&(p))

void saferFree(void **pp);

int main( void ){
int *pi;
pi = (int*) malloc(sizeof(int));
*pi = 5;

printf("\n Antes.....: %p\n",pi);

safeFree(pi);

printf("\n Despues...: %p\n",pi);

safeFree(pi);

return (EXIT_SUCCESS);

}

void saferFree(void **pp) {
if (pp != NULL && *pp != NULL) {
free(*pp);
*pp = NULL;
}
}


Saludos.
Daniel
#56
Hola gente.
Como veo que por allí MAFUS hizo un desafío, bueno esto es algo parecido solo que yo no tengo suficientes conocimientos para desafiar a nadie, la consulta es ¿conocen otra manera para logrear lo mismo?.-

#include<stdio.h>

int main( void ){
int numero = 12345, i, b = 1, temp = 0, x;

for( i = 0; i < 32; i++ ){
temp += numero & b;
x = numero & b;
if( x > 0 ) printf("\n bit encendido ==> [%2d] = %d", i, x);
b <<= 1;
}

printf( "\n\n La direccion de memoria %p contiene el valor %d\n\n", &numero, temp );

return 0;
}


Cuando el número es positivo, el simple pero cuando es negativo se me complica un poco entenderlo.-




Saludos.
Daniel
#57
Hola, a todos.
Desearía  que alguien me ayude a entender la utilidad práctica de los punteros dobles, entiendo que una variable puntero apunta a la dirección de memoria donde está alojada una variable del mismo tipo, o sea su valor es la dirección de memoria de una variable común.-
Un puntero doble apunta a otro puntero, si bien mi descripción no es para escribir un libro pero es lo que hay.-
Por ahí leí que los punteros dobles se asemejan a los array de 2 dimensiones, es esto cierto y porque?.-
El manual con el que estoy estudiando punteros pone este ejemplo pero no tengo claro el beneficio en utilizar punteros dobles, el autor en este caso no da demasiadas explicaciones sobre el tema, no me cabe dudas que más adelante profundizara  sobre el particular pero me gustaría aprenderlo de Uds. El libro tiene más de 200 páginas dedicadas exclusivamente a punteros y de paso está en inglés.-

#include <stdio.h>

int main( void ){
char *titles[] = {"A Tale of Two Cities",
"Wuthering Heights","Don Quixote",
"Odyssey","Moby-Dick","Hamlet",
"Gulliver's Travels"};

char **bestBooks[3];
char **englishBooks[4];

bestBooks[0] = &titles[0];
bestBooks[1] = &titles[3];
bestBooks[2] = &titles[5];
englishBooks[0] = &titles[0];
englishBooks[1] = &titles[1];
englishBooks[2] = &titles[5];
englishBooks[3] = &titles[6];

printf("%s\n\n",*englishBooks[1]); /*Wuthering Heights*/

return 0;
}
   

Bueno es todo por el momento y desde ya muchas gracias.-
Daniel
#58
Hola, gente.
Esta vez los molesto por poco, me podrían decir que tengo que agregar a mi código para medir el tiempo que tarda en ejecutarse, busqué en foros y lo que intené no funcionó. -
Es probable que me quieran dar un tirón de orejas por tratar de reinventar la rueda, pero créanme que es tan solo para practicar con punteros y de paso cotejarlo con el método de la burbuja y saber que es más rápido si un doble for o un bucle while. -

#include <stdio.h>

void ordenar(size_t *ptrV, size_t elementos);
void mostrar(size_t *ptrV, size_t elementos);

int main( void ){
size_t vector[] = {99, 8, 13, 6, 104, 40, 7, 2, 1}, *ptrV = vector;
static size_t elementos = sizeof (vector) / sizeof (size_t);

ordenar(ptrV, elementos);
mostrar(ptrV, elementos);

return 0;
}

void ordenar(size_t *ptrV, size_t elementos){
size_t i, tmp = 0;

while(1){
if( *(ptrV+i) >  *(ptrV+(i+1)) ){
tmp = *(ptrV+i);
*(ptrV+i) = *(ptrV+(i+1));
*(ptrV+(i+1)) = tmp;
}
if( i+1 == elementos ){
if( tmp == 0) break;
else{tmp = 0; i = -1;}
}
i++;
}
}

void mostrar(size_t *ptrV, size_t elementos){
size_t i;

for( i = 0; i < elementos; i++ )
printf( " %u", *(ptrV+i) );
}


Desde ya muchas gracias. -

Saludo.
Daniel

#59
Hola, gente.
Tengo un error que por más que investigo no logro solucionar, hice un montón de pruebas como con la función printf para saber si accedía a la posición de memoria correcta y realmente en todos los casos imprimía la fila correcta y el contenido de la primer columna, pero siempre al acceder a esta parte del programa el mismo se cierra. -
Un favorcito más, si alguien conoce otra manera para lograr lo mismo le agradecería me dé alguna pista. - 


lineas 67 y 73
#include <stdio.h>
#include <ctype.h>
#include <windows.h>

int ingreso( int monto[] );
void mostrar( int monto[], int contador );


int main( void ){
int monto[3], contador = 0;

contador = ingreso( monto );
mostrar( monto, contador );

return 0;
}

int ingreso( int monto[] ){
int ch, ok, contador ;

do{
system("cls||clear");
ok = 1; contador = 0;
printf("\n\n Ingrese monto del cheque (superior a \"0\" e inferior a \"1000\")....:" );
while(( ch = getchar()) != '\n'){
if( isdigit(ch) ){
if( contador < 3 ){
monto[contador] = ch - '0';
contador++;
}
else{
ok = 0;
}
}
else{
ok = 0;
}
}
if( ok == 0 || monto[0] == '0'){
printf( "\n Ingreso incorrecto...\n\n\tPulse <Enter> para intentarlo nuevamente..." );
getchar(); 
ok = 0;
}
}while(!ok);

return contador;
}

void mostrar( int monto[], int contador ){
char  *unidades[] = { "", "uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve", "diez" },
      *decenas[]  = { "veinte", "treinta", "cuarenta", "cincuenta", "sesenta", "setenta", "ochenta", "noventa" },
  *centenas[] = { "", "Cien", "Doscientos", "Trescientos", "Cuatrociento", "Quinientos",
"Seiscientos", "Setecientos", "Ochocientos", "Novecientos" },
  *especiales[] = { "Diez", "Once", "Doce", "Trece", "Catorce", "Quince", "Dieciseis", "Diecisiete",
  "Dieciocho", "Diecinueve", "Veinti" };
int tmp;
 
if( contador == 1 ){
printf( "\n %s", unidades[monto[0]] );
}

if( contador == 2 ){
tmp = monto[0]-2;
if( monto[0] == 1)
printf( "\n %s ", especiales[monto[1]] );
else if( monto[1] == 0 ){
decenas[tmp][0] = toupper(decenas[tmp][0]); 
printf( "\n %s", decenas[monto[0]-2] );
}
else if( monto[0] == 2 && monto[1] > 0 )
printf( "\n %s%s", especiales[10], unidades[monto[1]] );
else{
decenas[tmp][0] = toupper(decenas[tmp][0]); 
printf( "\n %s y %s", decenas[monto[0]-2], unidades[monto[1]] );
}
}

if( contador == 3 ){
printf( "\n %s ", centenas[monto[0]] );
if( monto[1] == 0 )
printf( "%s", unidades[monto[2]] );
else if( monto[1] == 1 )
printf( "%s", especiales[monto[2]] );
else
printf( "%s y %s", decenas[monto[1]-2], unidades[monto[2]] );
}
}


/*
Ejercicio 6-1. Escriba un programa que solicite un número entero positivo menor que 1000
y a continuación, cree y genere un valor de tipo string que es el valor del entero en palabras.
Por ejemplo, si 941 es introducido, el programa creará la cadena "Novecientos cuarenta y uno".
*/


Saludos.
Daniel
#60
Hola.

fgets( word[i], MAX_COL , stdin );

if((p=strchr(word[i], '\n'))){
*p='\0';
}
else{
while((ch = getchar()) !='\n' && ch!=EOF);
word[i][MAX_COL] = '\0';
}



En este trozo de código está mi gran duda, según lo que tengo leído es que si ingreso menos caracteres que  MAX_COL fgets los guarda desde el buffer de teclado en la variable indicada, en este caso word y también el carácter de nueva línea (\n) que se produce al apretar < Enter >, la primera duda, ¿es estrictamente necesario remplazar el carácter \n por \0? -
En el caso de ingresar más caracteres del establecido por MAX_COL fgets lee  MAX_COL – 1 y en la última casilla de memoria asignada a MAX_COL copia el carácter \n, de ser esto cierto la otra duda es:  ¿la sentencia else no se ejecuta nunca en este caso, o estoy equivocado?

Es todo y desde ya muchas gracias por el tiempo que le dediquen al tema,-

Saludos.
Daniel

#61
Hola, gente.
Debo aclarar que con mis 64 años nunca instale ningún so Windows, lo que necesito saber es si con el  WinXP MiniOS es necesario tener una copia de los drivers, como comprenderán estoy en babia con el tema. -
Utilizo W7 pero no me funciona, cada tanto me queda la máquina congelada con rallas diagonales en la pantalla, quiero probar con algo más liviano.-

Saludos.
Daniel
#62
Hola, gente.
Lamento molestarlos por tan poco, en realidad tendría que tener un "amigo" para hacerle estas consultas tan poco relevantes, pero lamentablemente y a pesar de tener mucho tiempo en los foros no lo consigo todavía, bueno basta de prólogo y al grano, alguien me podría decir que hacen las 2 lineas que resalto a continuación. -

size_t length = strlen(nombre);
nombre[length-1] = nombre[length];

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

int main( void ){
char inicial[2] = {0}, nombre[80] = {0};


printf("\n Ingrese su primer inicial....: ");
fgets(inicial, sizeof(inicial), stdin);
fflush(stdin);

printf("\n Ingrese su nombre............: " );
fgets(nombre, sizeof(nombre), stdin);

size_t length = strlen(nombre);
nombre[length-1] = nombre[length];


if(inicial[0] != nombre[0])
printf("\n%s,Usted consiguió su aparejo mal..\n", nombre);
else
printf("\n Bien, %s. Ingreso correcto. Bien hecho!\n", nombre);
return 0;
}


Saludos.
Daniel


#63
Hola a todos.
Bueno esa es la consulta, ¿no hay la posibilidad en este foro de subir archivos? ¿o yo no tengo el suficiente permiso? -
Lo que ocurre es que es un poco incomodo subir la imagen a otra página y luego copiar la dirección de la misma en el panel de edición de mensajes. -

Desde ya muchas gracias por el tiempo que le dediquen.-

Saludos.
Daniel
#64
Hola, gente. -
Quiero poner lo siguiente en el foro de C/C++ cada vez que alguien (normalmente nuevo) se olvida utilizar las etiquetas GeSHi pero me lo toma como un código en C, como debo hacer para que aparezca cono un texto normal. -

Por favor, edita el código y ponle antes del primer #include y después del cierre de la función main, se ve mucho mejor y además es más fácil de interpretar el error o la(s) duda(s) que tengas, gracias. -
Por favor, díganme si no corresponde que haga esto por no pertenecer a la comunidad y todo ok, es solo con el afán de colaborar.

Saludos.
Daniel
#65
Hola.
No estoy seguro si esto va en este foro o en el de los sistemas operativos, Eternal lo decidirá. -
¿Alguien conoce alguna forma para borrar terminal en Windows y Linux con una misma sentencia? (lenguaje C).-

Saludos.
Daniel



#66
Hola a todos.
Estoy haciendo algunas practicas para hacer que el ingreso de datos en c no traiga sorpresas, En cuanto a las cadenas me parece que con el primer programa está todo resuelto, no debería haber errores (me refiero a no escribir más aya del límite de la variable).-
El inconveniente lo tengo con el ingreso de números, no logro validar que el número ingresado sea menor o igual a UINT_MAX, pensé en crear una variable con mayor capacidad y así no tendría sorpresas, pero lo que quisiera saber si hay alguna otra manera,-

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

#define MAX_CARACTERES 9

int main(void){
char cadena[MAX_CARACTERES]={'\0'}, *p=NULL;
unsigned int ch=0;

printf("\n\n ----- Programa que muestra el comportamiento de fgets -----");
printf("\n\n Ingrese una frase (maximo %d caracteres)....:", MAX_CARACTERES - 1);
fgets(cadena, MAX_CARACTERES, stdin);
if((p=strchr(cadena, '\n'))){
*p='\0';
}
else{
while((ch = getchar()) !='\n' && ch!=EOF);
}
printf("\n  Ingreso.............:%s", cadena);
return 0;
}


#include <stdio.h>
#include <ctype.h>
#include <limits.h>

int main(void){
unsigned int numero = 0, c;

printf("\n\n Ingrese una numero entero (maximo permitido %u)....:", UINT_MAX);

while((c = getchar()) != '\n' && c != '\r'){
if(isdigit(c)){
numero *= 10;
numero += c-48;
}
else{
printf( "\n Ingreso invalido..." );
numero = 0;
break;
}
}

printf("\n Ingreso.............:%u", numero);
return 0;
}




Otra cosita, alguien me podría decir como poner estas 2 líneas en una sola, le puse paréntesis, pero de cualquier manera el resultado es erróneo,-

numero *= 10;
numero += c-48;


Bueno es todo, espero puedan ayudarme.-
Saludos.
Daniel 
#67
GNU/Linux / Instalar hubiC en linux Mint 17.2
3 Febrero 2016, 14:13 PM
Hola, gente.
Me encontré ayer con el inconveniente que el 1 de Mayo de 2016 Copy no existe más para subir archivos a la nube, es una verdadera lástima ya que me funcionaba de maravillas. -
Reconozco que no leí mucho para remplazarlo, me encontré con hubiC y lo instale en Windows 7 todo bien, pero tengo otra máquina con Linux Mint y por más que busco en internet no allo la manera de instalarlo.
Supongo que Habrá una manera estándar para instalar programas en Linux, pero como hace poco tiempo que lo estoy utilizando la desconozco y no tengo tiempo (en estos momentos) para estudiar algún manual de Linux, por eso los consulto .-

Desde ya muchas gracias.
Daniel
#68
Hola, a todos.
El caso es que en este tiempo de estudio de C me tope un montón de oportunidades con el tipo size_t, cada vez que esto ocurría consultaba en Internet, pero nunca lo pude comprender del todo, en el programa que dejo a continuación el autor lo utiliza y desearía que me digan (si lo desean) el efecto que tiene en el mismo,-

#include <stdio.h>

const size_t BUFFER_LEN = 512;

int main( void ){
char buffer[BUFFER_LEN];
char *pS[3] = { NULL };
char *pbuffer = buffer;
size_t index = 0;
int i;

printf("\n Introduzca 3 mensajes en total menos de %u caracteres.", BUFFER_LEN-2);


for( i=0 ; i<3 ; i++ ){
printf("\n Ingrese %s Mensaje....:", i>0? "otro" : "primer" );
pS[i] = &buffer[index];
for( ; index<BUFFER_LEN ; index++)
if((*(pbuffer+index) = getchar()) == '\n'){
*(pbuffer+index++) = '\0';
break;
}

if((index == BUFFER_LEN) && ((*(pbuffer+index-1) != '\0') || (i<2))){
printf("\nSe agoto el espacio en el bufer.");
return 1;
}
}

printf("\nLas cadenas introducidas son...:\n\n");
for( i = 0 ; i<3 ; i++ )
printf("%s\n", pS[i]);

printf("\n El bufer tiene %d caracteres sin usar.\n", BUFFER_LEN-index);

return 0;
}


Tengo muchas dudas más con este programa que luego les iré consultando (de ser necesario modificaré el enunciado). -

Saludos.
#69
Hola.
El programa que muestro a continuación lo que hace es separar los dígitos que se encuentran a la izquierda de la coma y los que se encuentran a la derecha, o sea, la parte entera y la parte fraccionaria de una variable double, hasta hay todo bien, el error lo tengo cuando el bucle for no coincide con la cantidad de dígitos fraccionarios.-
Alguien me puede decir si es posible establecer cuantos dígitos ha ingresado el operador a la derecha de la coma, he intentado por todos los medios a mi alcance (lectura y búsqueda en la web) y no pude lograrlo.-

#include <stdio.h>
#include <float.h>

int main( void ){
double numero , decimal;
int entero, x = 1, ok, ch;

do{
printf("\n Ingrese un numero con decimales...: ");
ok = scanf( "%lf", &numero ) == 1 && numero > 0.00 && numero <= DBL_MAX;
while ((ch = getchar()) != EOF && ch != '\n');
}while(!ok);

entero = (int)numero;
decimal = numero - entero;

while(x <= 4 ){
decimal  *=10;
x++;
}

printf("\n La parte fraccionaria..:%g\n", decimal);

return 0;
}


Desde ya muchas gracias
Saludos
#70
Hola a todos.
Bueno como el enunciado lo dice es lo que quiero hacer, lo que pasa es que la parte fraccionaria no sale limpia como yo deseo, o sea, el programa que expongo a continuación la parte fraccionaria da como resultado 0.345000 y lo que necesito es 345000 a secas sin el cero y el punto, hay alguna manera de lograrlo.-

#include <stdio.h>
#include <windows.h>

int main(void){
   float numero = 12.345;
   int parte_entera;
   double parte_decimal;   
   
   parte_entera = numero/1;
   parte_decimal = numero-parte_entera;
   
   system( "cls" );   
   printf( "\n La parte entera   %d", parte_entera );
   printf( "\n La parte decimal  %f", parte_decimal );
   
   return 0;
}

Desde ya muchas gracia y un abrazo.
Daniel
#71
Hola a todos y que tengan un muy buen día,

#include <stdio.h>

int main(int argc, char **argv){
int c;

printf("\n Para finalizar ==> Ctrl + d (linux) == Ctrl + c (Windows)");
printf("\n\n Por favor introduzca una numero entero...: ");

while(EOF != (c = getchar())){
if( c >= 48 && c <= 57 )
putchar(c);
}

printf("\n EOF == %d\n", EOF);

return 0;
}


Creo que no es necesario que comente demasiado sobre lo que quiero lograr que es finalizar el bucle de una forma autómatica sin tener que apretar Ctrl + d, tengo muchas horas leyendo y practicando sobre el tema pero no logro solucionarlo,-

Saludos.
Daniel
#72
Hola a todos y que tengan un muy buen día.

int (*a)[35]; //declara un apuntador a un arreglo de 35 enteros.

int *a[35]; //declara un arreglo de 35 apuntadores a enteros.


Estudiando apuntadores en c me encontré con estas 2 declaraciones pero no las entiendo, alguien seria tan amable de poner algunas líneas de código para comenzar a entender algo del tema?.-
Es todo, intenté hacer un poco de práctica pero no logro hacer que el programa corra y no tengo nada para mostrar.-

Saludos.
Daniel
#73
Hola a todos.
Como lo dice el enunciado, no logro ingresar más de 8 dígitos para pasar de binario a decimal, si ingreso 8 o menos dígitos el resultado es correcto, pero si por Ej. ingreso 110011001 me aparece un número mayor a 1 en el noveno dígito y de la manera que está validado regresa a la función principal,-
Cómo he buscado y buscado en la web y no ayo la manera de solucionarlo recurro una vez más a Uds.
El error está en la función decimal que se encuentra en la línea 99, dejo todo el programa por si a alguien se le ocurre alguna sugerencia para mejorarlo, me parece que error de lógica no tiene, me parece. -

#include <stdio.h>
#include <limits.h> 
#include <float.h>
#include <stdlib.h>
#include <string.h>

void sumar(float, float);
void restar(float, float);
void dividir(float, float);
void multiplicar(float, float);
void porcentaje(float, float);
void binario(float, float);
void decimal(float, float);
void hexadecimal(float, float);

int main(void){
void ( * calc[] ) (float, float) = { sumar, restar, dividir, multiplicar, porcentaje, binario, decimal, hexadecimal };
float opUno, opDos;
int  operador, ch, ok, opc;

while( opc != 1 ){
system( "clear" );
opUno = 0.00;
do{
printf( "\n Introduzca un numero..........:" );
ok = scanf("%f",&opUno) == 1 && opUno > 0.00 && opUno <= FLT_MAX; 
while ((ch = getchar()) != EOF && ch != '\n');
}while(!ok);

do{
printf( "\n 1 - Sumar\n 2 - Restar\n 3 - Dividir\n 4 - Multiplicar\n 5 - Porcentaje" );
printf( "\n 6 - Binario\n 7 - Decimal\n 8 - Hexadecimal\n\n Introduzca opcion..............:" );
ok = scanf("%d",&operador) == 1 && operador >= 1 && operador <= 7; 
while ((ch = getchar()) != EOF && ch != '\n');
}while(!ok);

if( operador >= 6 ){
(* calc[ operador-1 ]) (opUno, opDos);
}
else{
if( operador == 5){
printf( "\n Introduzca el porcentual.......:" );
}
else{
printf( "\n Introduzca segundo operando....:" );
}
do{
ok = scanf("%f",&opDos) == 1 && opDos > 0.00 && opDos <= FLT_MAX; 
while ((ch = getchar()) != EOF && ch != '\n');
}while(!ok);

(* calc[ operador-1 ]) (opUno, opDos);
}

do{
printf( "\n\n 1 - para finalizar \n 2 - Otra operacion\n\n Introduzca opcion....:" );
ok = scanf("%d",&opc) == 1 && opc >= 1 && opc <= 2; 
while ((ch = getchar()) != EOF && ch != '\n');
}while(!ok);
}

return 0;
}

void sumar( float opUno, float opDos ){
printf( "\n resultado ==> %5.3f\n", opUno + opDos );
}

void restar( float opUno, float opDos ){
printf( "\n resultado ==> %5.3f\n", opUno - opDos );
}

void dividir( float opUno, float opDos ){
printf( "\n resultado ==> %5.3f\n", opUno / opDos );
}

void multiplicar( float opUno, float opDos ){
printf( "\n resultado ==> %5.3f\n", opUno * opDos );
}

void porcentaje(float opUno, float opDos){
float porc, restado, sumado;
porc = (opUno * opDos)/100;
restado = opUno - porc;
sumado  = opUno + porc;

printf( "\n Porcentual = %5.3f  Restado = %5.3f  Sumado = %5.3f", porc, restado, sumado );
}

void binario( float opUno, float opDos ){
int entero, i, bits=sizeof(int)*8;
entero=(int)opUno;

printf("\n El numero %d en binario es: ", entero);
for(i=0;i<bits;++i)
if (((entero>>(bits-i-1))&1)==1) printf("1"); else printf("0");
}

void decimal( float opUno, float opDos ){
char cadena[33];
int elementos, decimal = 0, operando = 1, i;

elementos = sprintf(cadena,"%1.0f",opUno);

for( i = 0; i < elementos; i++){
printf("\n %c", cadena[i]);
if( cadena[i] > '1' ){
printf( "\n El numero ingresado es incorrecto para esta operacion" );
printf( "\n Pulse [Enter] para continuar... " ); getchar();
return;
}
}

for( --elementos; elementos >= 0; elementos-- ){
if( cadena[elementos] == '1' ){
decimal += operando;
}
operando *= 2;
}

printf( "\n Decimal %d", decimal );
}

void hexadecimal( float opUno, float opDos ){
int entero;
entero=(int)opUno;
printf("\n El numero %d en hexadecimal es: %X\n", entero, entero);
}


Saludos y muchas gracias desde ya.-
Daniel
#74
Hola, gente, que tengan un muy buen día.-
Les dejo este código para que me digan de que otra manera se puede lograr lo mismo, los consulto porque siempre los expertos como Uds. tienen una manera distinta de lo que yo me pude imaginar, no realice muchas pruebas pero las que realice me dan el resultado correcto, la lógica me parece que es coherente.-
En cuanto al float es porque forma parte de una calculadora que además de sumar, restar, etc., transforma un decimal en binario, en hexadecimal y viceversa.-

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

int main(void){
char cadena[33];
float binario = 1100110;
int elementos, decimal = 0, operando = 1;

sprintf(cadena,"%1.0f",binario);
elementos = strlen(cadena) ;

for(--elementos; elementos >= 0; elementos-- ){
if( cadena[elementos] == '1' ){
decimal += operando;
}
operando *= 2;
}

printf( "En binario %s  ==> en decimal %d", cadena, decimal );

return 0;
}

Bueno es todo.-
Saludos.
Daniel
#75
Hola gente, que tengan un muy buen día.
Paso a explicarles lo que me pasa, soy nuevo en Linux y si no encuentro la solución en un tiempo prudencial tengo miedo de acobardarme (espero que eso no ocurra) el caso es que instalé Ubuntu 15.04, si lo uso desde el DVD todo funciona normalmente, pero si lo utilizo desde el rígido pasan pocos minutos y queda todo congelado, principalmente si abro el navegador,
tengo 2 GB de RAM y comparto Ubuntu con W7.-       

Espero que puedan darme alguna idea del porque me pasa esto.-
Un fuerte abrazo para todos.-
Daniel.
#76
Hola y que tengan un muy buen día.
Como verán me estoy poniendo un poco pesado pero prometo que después de esto y por un tiempo voy a exponer mis dudas en otro foro, prometido.-
Al grano, esta operación no es factible en c:
unsigned a = 2147483648, b = 2, c = a * b; 
Tengo conocimiento de las variable con más capacidad pero no importa en este caso, lo que quiero hacer es multiplicaciones realmente grandes y para ello quiero hacerlo con 2 variables char, también sé que esto si se puede hacer:
char a[] = "2147483647", b[] = "2";
unsigned int c = atoi(a) * atoi(b);

pero me limita al valor máximo que puede contener una variable unsigned int.-
Alguien sabe de alguna curiosidad matemática, algo a nivel de bist, algo que me dé el inicio para multiplicar 2 números alojados en variables char y poner el resultado  en otra del mismo tipo?, Cualquier ayuda será bien venida.-

Saludos.
Daniel   
#77
Programación C/C++ / Números perfectos (lenguaje C)
25 Septiembre 2014, 20:05 PM
Hola a todos.

#include <stdio.h>

#define MAX 10000
void numerosPerfectos();

int main(void){

numerosPerfectos();

return 0;
}

void numerosPerfectos(){
int acumulador=0, i, j=1;

printf("\n\n N%cmeros perfectos...: ", 163);

for(i=1; i<MAX; i++){
acumulador = 0;
for(j=1; j<i; j++){
if(i % j == 0){
acumulador += j;
}
}
if(i == acumulador){
printf(" %d ", i);
}
}
}


El inconveniente es que si pongo #define MAX 10000 el resultado lo muestra en un periodo de tiempo aceptable, pero si deseo saber del 1 al 100000 muestra ==> 6- 28 – 496 – 8128 y de aquí en más tarda en términos de computación una eternidad (para terminar el programa).-
La consulta es, ¿sabe alguien otra manera de hacerlo?, mi computadora si bien es un poco vieja (2gb de ram) me parecería que tendría que mostrarlo al instante, pero no es así.-

Desde ya muchas gracias.-
   
Saludos.
Daniel   
#78
Hola a todos.
El asunto es simple por lo menos para explicarlo, sólo que no se si se puede hacer, lo que quisiera saber es si en cada iteración además de generar los número ir ordenándolos, me parece que no quedaría del todo ordenado pero por lo menos ir intercambiando los posibles.-
El juego es de Argentina y se llama Quini6, los números a asertar son 6 y van del 0 al 45.-
En este caso no tiene mucho sentido porque el bucle se realiza sólo 6 veces, pero en el caso de generar por ejemplo 500.000 números tal vez acelere el tiempo que tardaría una manera y la otra.-
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void generar();

int main(void){
generar();

return 0;
}

void generar(){
int guardar[6], numero=0, i=0, hora = time(NULL);
srand(hora);

for(; i<6; i++){
numero = rand()%46;
guardar[i] = numero;
}
}
   


Desde ya muchas gracias y muchos saludos.-
Daniel
#79
Hola a todos y que tengan un muy buen día.-

CitarEl programa debe leer un entero de cuatro dígitos y cifrar la información de la siguiente manera: reemplace cada dígito con residuo de la división entre 10 de la suma de dicho dígito mas 7. Posteriormente, intercambie el primer digito con el tercero, e intercambie el segundo dígito con el cuarto. Luego despliegue el entero cifrado.

Bueno con el enunciado tan bien explicado no me queda mucho para agregar, sólo decirles que estoy trabado con la última parte la de intercambio de dígitos, lo he intentado de varias manera pero no me funciono.-

#include <stdio.h>

int main(void){
int numero=5724, digito=0, div=1000, auxiliar=0, cifrado=0;
while(numero>0){
digito = numero/div;
numero = numero-(div*digito);
auxiliar = (digito+7)%10*div;
cifrado += auxiliar;
div /= 10;
}


printf("\n El n%cmero cifrado es...: %d\n", 163, cifrado);

return 0;
}


Una cosita más, no tengan reparos en postear código que sea totalmente distinto al mío, el código es de mi propia idea y seguramente Uds. lo sabrán hacer de una manera más eficiente.-       

Saludos.
Daniel
#80
Hola Amigos.
El enunciado del manual es el siguiente.-



//http://dacap.com.ar/blog/cpp/medir-el-tiempo-de-una-rutina/
#include <stdio.h>
#include <windows.h>

/* retorna "a - b" en segundos */
double performancecounter_diff(LARGE_INTEGER *a, LARGE_INTEGER *b){
LARGE_INTEGER freq;
QueryPerformanceFrequency(&freq);
return (double)(a->QuadPart - b->QuadPart) / (double)freq.QuadPart;
}

int main(int argc, char *argv[]){
int contador=0;
LARGE_INTEGER t_ini, t_fin;
double secs;

QueryPerformanceCounter(&t_ini);
while(contador <= 300000000){
contador++;
if(contador % 100000000 == 0){
QueryPerformanceCounter(&t_fin);
secs = performancecounter_diff(&t_fin, &t_ini);
printf("%.16g milliseconds\n", secs * 1000.0);
QueryPerformanceCounter(&t_ini);
}
}
 
getchar();
return 0;
}



El programa que logré a partir de los ejemplos de la página me funciona correctamente (por lo menos es lo que a mí me parece) lo que pasa es que no entiendo casi ninguna línea (creo que tiene que ver con las API's de windows), la pregunta es ¿alguien me puede decir si se puede lograr lo mismo con con un programa en C puro?, de ser así ¿podrian poner algún ejemplo?.-

Saludos.
Daniel
#81
Hola a todos.-

Bueno simplemente eso, no me queda muy claro si es simplemente para obtener un número mayor o tiene otro significado, recuerdo que en una oportunidad(en este foro) me daba un error por declarar una variable como unsigned, no puedo encontrar el post, por lo tanto hago esta consulta a Uds. que seguramente con tanta práctica y sapiencia me lo podrán aclarar.-

Saludos.
Daniel
#82
Hola gente.
Tengo un error con la validación de datos en este programa y por más que práctico no logro dar con la tecla.-
Debo reconocer que puedo estar cometiendo un error que ya debería resolver por mi mismo pero me pase 2 días de 8 horas cada uno para hacer que funcionara la matriz de punto de silla y cuando lo logré (bueno creo que lo logré porque lo corrí más de 50 veces y nunca me sale la tabla con la coincidencia) me aparece este error que deseo que me ayuden a resolver porque quiero dejar perfectamente establecida la forma correcta de utilizar fgets.-

/*
Se dice que una matriz tiene un punto de silla si alguna posición de la matriz
es el menor valor de su fila, y a la vez el mayor de su columna.-
*/

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

#define MAX_VECTOR 2
#define MAX_F_C 10


void verificaFil(int *intFil);
void verificaCol(int *intFil);
void ingreso(int matriz[], int intFil, int intCol);
void puntoDeSilla(int matriz[], int intFil, int intCol);


int main(void){
int intFil=0, intCol=0, *matriz=NULL;

printf("\n\n ===== El programa le mostrara los puntos de silla (si los hay) =====\n\n");
verificaFil(&intFil);
verificaCol(&intCol);
matriz = malloc(intFil * intCol * sizeof(int));

ingreso(matriz, intFil, intCol);

puntoDeSilla(matriz, intFil, intCol);

free(matriz);
printf("\n\n");
return 0;
}

void verificaFil(int *intFil){
char charFil[MAX_F_C+1]={'\0'}, *p=NULL;
unsigned int ch=0, i=0, ok=0;

do{
printf(" Ingrese un entero para establecer la cantidad de filas (m%cximo %d)......:", 160,MAX_F_C);
fgets(charFil,  MAX_F_C, stdin);

if((p=strchr(charFil, '\n'))!=0){
*p='\0';
}
else{
while((ch = getchar()) !='\n' && ch!=EOF);
}

ok=0;
for(; charFil[i]; i++){
if(!isdigit(charFil[i])){
ok++;
}
}
if(ok==0){
*intFil = atoi(charFil);
(*intFil == 0 || *intFil > MAX_F_C) ? ok=1 : ok;
}
}while(ok !=0);
}

void verificaCol(int *intCol){
char charCol[MAX_F_C+1]={'\0'}, *p=NULL;
unsigned int ch=0, i=0, ok=0;

printf("\n");
do{
printf(" Ingrese un entero para establecer la cantidad de columnas (m%cximo %d)...:", 160,MAX_F_C);
fgets(charCol,  MAX_F_C, stdin);

if((p=strchr(charCol, '\n'))!=0){
*p='\0';
}
else{
while((ch = getchar()) !='\n' && ch!=EOF);
}

ok=0;
for(; charCol[i]; i++){
if(!isdigit(charCol[i])){
ok++;
}
}

if(ok==0){
*intCol = atoi(charCol);
(*intCol == 0 || *intCol > MAX_F_C) ? ok=1 : ok;
}
}while(ok !=0);
}

void ingreso(int matriz[], int intFil, int intCol){
unsigned int hora = time(NULL), i=0, j=0, indice=0;
srand(hora); 

for(; i < intFil; i++){
for(j=0; j < intCol; j++){
indice = i * intCol + j;
matriz[indice] = rand ()% 100;
}
}

printf("\n");
for(i=0; i<intFil; i++){
for(j=0; j<intCol; j++){
indice = i * intCol + j;
printf(" %3d", matriz[indice]);
}
if(j%intCol==0) printf("\n");
}

}

void puntoDeSilla(int matriz[], int intFil, int intCol){
int i, j, elMenor=0, colMen=0, indice=0, noPds;

for(i = 0; i < intFil; i++){
noPds = 0;
indice = intCol * i;
elMenor=matriz[indice];
colMen =  indice-(intCol*i);

for(j=0; j < intCol; j++){
if(matriz[indice] < elMenor){
elMenor = matriz[indice];
colMen =  indice-(intCol*i);
}
indice++;
}

for(j=0; j < intFil; j++){
indice = j * intCol + colMen;
if(matriz[indice] > elMenor){
noPds++;
}
}
if(noPds == 0)
printf("\n en la fila %d columna %d hay punto de silla", i, colMen);
}
}


  Uno de los ingresos incorrectos:
  Ingreso...: -4 (incorrecto)
  Ingreso...: aa (incorrecto)
  Ingreso...: 11 (incorrecto)
  Ingreso...: -4 (correcto)

Bueno espero que me puedan ayudar y no vacilen en cambiar todo lo que deseen cambiar de mi código, es así como puedo aprender cosas que no están en los manuales.- 
   
Saludos y un gran abrazo
Daniel.
#83
Hola a todos.
Me pase con este tema unas cuantas horas y hasta aquí llegue, espero que me puedan ayudar a resolverlo.-

En primer lugar les pongo el enunciado.


Lo que llevo hecho es lo siguiente.

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

int main(void){
char tempFrase[] = "La casa de Juan es de color azul", *token, frase[32];
int ocurrencias=0;

strcpy(frase, tempFrase);

token = strtok(tempFrase," ");
while (token != NULL){
printf("\n En la direccion %p se encuentra la palabra...: %s\n", token ,token);
(strlen(token) == 4) ? ocurrencias++ : ocurrencias;
token = strtok(NULL," ");
}

printf("\n La frase \"%s\" contiene %d palabras de 4 letras\n\n", frase, ocurrencias);

return 0;
}



/*
#include <stdio.h>
#include <string.h>

#define MAX_FRASES 5
#define MAX_LONGITUD 30

void verificaIngreso(char frases[][MAX_LONGITUD], int i);

int main(void){
char frases[MAX_FRASES][MAX_LONGITUD];
int i=0, j=0, ocurrencias=0, com=0, fin=0;

for(; i<MAX_FRASES; i++){
printf("\n Ingrece frase[%d]...:", i+1);
fgets(frases[i], MAX_LONGITUD, stdin);
verificaIngreso(frases, i);
}

for(i=0; i<MAX_FRASES; i++){
printf("\n La frase[%d] tiene una longitud de %d caracteres", i+1,  strlen(frases[i]));
}

for(i=0; i<MAX_FRASES; i++){
for(j=0; frases[i][j]; j++){
if(frases[i][j] == 32)
com = frases[j]

}
}

printf("\n %d", espacios);
printf("\n\n");
return 0;
}

void verificaIngreso(char frases[][MAX_LONGITUD], int i){
char *p=NULL;
unsigned int ch=0;

if((p=strchr(frases[i], '\n'))!=0){
*p='\0';
}
else{
while((ch = getchar()) !='\n' && ch!=EOF);
}

}*/


Lo que no puedo saber es ¿Qué referencia debo utilizar para acceder a la variable frase y sustituir todas las palabras de 4 letras con asteriscos ?.- 

Saludos y desde ya muchas gracias por el tiempo.-
Daniel
#84
Hola a todos y que tengan un muy buen día.-
Les traigo una sugerencia, ¿podrían poner  una opción en el sub-foro de c/c++ para que el que edite el post tenga "obligatoriamente"que especificar el motivo de la modificación?,  les traigo esta idea porque analizando las modificaciones y más en el caso de leo que http://foro.elhacker.net/programacion_cc/prioridad_y_asociatividad_de_los_operadores_en_c_programa_propio-t412169.0.html después de la sugerencia escribió casi una biblia, a los que estamos pidiendo ayuda y a los que ayudan porque no nos resultaría harto beneficioso, por lo menos es lo que yo creo.-

Saludos.
Daniel
#85
Hola a todos y que tengan un muy buen día.-
Por el enunciado se darán cuenta de lo que deseo hacer, si me dejan ser prejuicio muchos dirán que ganas de complicarse por algo que el compilador de C lo efectúa perfectamente, si bien esto es cierto tengo mucha fe que este hilo me proporcionara mucho conocimiento (intuición, corazonada).-
Lo primero que deseo hacer es poner en una variable int (9 - 2) y borrarlo de la variable cadena, si bien logro extraer la cadena con un inicio correcto pero no logro el corte en el último paréntesis.-
Por último ¿lo harian de otra manera?.-     

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

int main(){
char cadena[100] = "3 * 5 + (9 - 2) + 5", *enc = NULL;

enc = strchr(cadena, '(');

printf("\n %s", enc);

printf("\n\n");
return 0;
}


Saludos y desde ya muchas gracias.
Daniel
#86
Hola a todos y que tengan un muy buen día.-
En este caso estoy estudiando operadores, Prioridad y asociatividad y realmente estoy trabado, en el programa, la segunda sentencia logro establecer qué el resultado sea 119 (creo estar en lo correcto).-

#include <stdio.h>

int main(){
int a = 3 + 4 *(8 * (4 - ( 9 + 3) /6)); //67
int b = 4 * 3 * 5 + 8 * 4 * 2 - 5; //119

printf("\n El resultado de 3 + 4 *(8 * (4 - ( 9 + 3) /6)) es...: %d", a);
printf("\n\n El resultado de 4 * 3 * 5 + 8 * 4 * 2 - 5 es........: %d", b);

printf("\n\n");
return 0;
}


Citar
  4 * 3 * 5 + 8 * 4 * 2 - 5

4 * 3 = 12
12 * 5 = 60

8 * 4 = 32
32 * 2 = 64

64 + 60 = 124

124 – 5 = 119


Pero la primera ni hay logro plasmar los pasos, bueno espero como siempre que me ayuden a descifrar el enigma que me tiene bastante ocupado.-
Por otro lado, quisiera saber si les parece muy difícil hacer un programa para emular el compilador, o sea, mostrar paso a paso la fórmula para llegar al resultado final, alguien lo hizo alguna vez.-   
   
Saludos.
Daniel
#87
Hola a todos y que tengan un muy buen dia.

Lenguaje......................: "C"
Sistema operativo......: Windows XP
Compilador..................: MinGW
Problema.....................: No puedo concluir el programa porque no logro mover
                                asía la izquierda los dígitos restantes e insertar el '\0'.-                                                   
Error..............................: Ninguno.
Otras Observaciones: Para todo aquellos que tengan mucho tiempo, me
                                podrían indicar que debo cambiar para obtimizarlo .     
Código..........................:

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

int verifica(char ingreso[], int ok, int longitud, int maxDescartar);

int main(){
unsigned int descartar=0, numeroFinal=0, i=0, ok=0, longitud=11;
char digitos[12] = {'\0'}, cualDescartar[2] = {'\0'};
printf("\n ---------- Programa que descompone un numero entero sin signo ----------");
do{
ok=0;
printf("\n\n Ingrece un numero entero sin signo [minimo 100 maximo %u].........: ", UINT_MAX);
fgets(digitos, longitud, stdin);
ok = verifica(digitos, ok, longitud, i);
}while(ok);

printf("\n\n");
for(; digitos[i] != NULL; i++){
printf(" [%d] = %c \n", i, digitos[i]);
}

do{
longitud=2;
ok=0;
printf("\n\n Indique con un entero sin signo del [0] al [%d] que numero desea descartar..: ", i-1);
fgets(cualDescartar, longitud, stdin);
ok = verifica(cualDescartar, ok, longitud, i);
}while(ok);

descartar = atoi(cualDescartar);
//En este lugar va lo que me falta...

printf("\n\n");
return 0;
}


int verifica(char ingreso[], int ok, int longitud, int maxDescartar){
long long temp=0, auxiliar=0;
int ch=0, i=0, ingresoInt=0;
char *p=NULL;

if((p=strchr(ingreso, '\n'))){
*p='\0';
}
else{
ingreso[longitud] = '\0';
while((ch = getchar()) !='\n' && ch!=EOF);
}

for(; ingreso[i] != NULL; i++){
if(ingreso[i] <= 47 || ingreso[i] >= 58){
ok=1;
return ok;
}
}

if(longitud == 11){
for(i=0; ingreso[i] != NULL; i++){
auxiliar = ingreso[i] - 48;
temp=10*temp+auxiliar;
}

if(temp <= 99 || temp > UINT_MAX){
ok=1;
return ok;
}
}
else{
ingresoInt = atoi(ingreso);
if(ingresoInt > maxDescartar){
ok=1;
return ok;
}
}
return ok;
}

/*
sprintf(digitos, "%d", 56789);
*/


Saludos y muchas pero muchas gracias por el tiempo dedicado a este tema.-
Daniel
#88
Hola a todos.

Lenguaje....................: "C"

Sistema operativo.....: Windows XP

Compilador.................: MinGW

Problema....................:Esta estructura puede tener el mismo problema que plantea rir3760 en este post. 
                              http://foro.elhacker.net/programacion_cc/operadores_a_nivel_de_bits_lenguaje_c-t410671.0.html
                                                       
Error...........................: Ninguno.

Otras Observaciones..:http://foro.elhacker.net/programacion_cc/de_minuscula_a_mayuscula_a_nivel_de_bits_en_lenguaje_c-t405856.0.html


Código.........................:


//Con uniones y campos de bit.

#include <stdio.h>

union caracteres
{
unsigned char c;
struct c_bits
{
unsigned b0:1;
unsigned b1:1;
unsigned b2:1;
unsigned b3:1;
unsigned b4:1;
unsigned b5:1;
unsigned b6:1;
unsigned b7:1;
} bits;
};

int main(void){
union caracteres caracter = {110};

printf("\n\n union caracteres caracter = {110};");
printf("\n\n La variable caracter contiene la letra...: \"%c\"", caracter.c);

printf("\n\n caracter.bits.b5 = 0; //Apaga el bits 5 para que la letra 'n' se transforme en 'N'");
caracter.bits.b5 = 0;
printf("\n\n Ahora la variable caracter contiene la letra...: \"%c\"", caracter.c);

printf("\n\n");
return 0;
}


//Con máscaras y operaciones a nivel de bit.

#include <stdio.h>

int main(void){
char letra = 'n';

printf("\n\n char letra = 'n';");
printf("\n\n La variable letra contiene la letra...: \'%c\'", letra);

letra &=0xDF;
printf("\n\n letra &=0xDF; // 0xDF es en binario = 1101 1111 --> pones a 0 el bit 5");

printf("\n\n Ahora la variable letra contiene la letra...: \'%c\'", letra);

printf("\n\n");
return 0;
}


Saludos y como siempre muchas gracias.
Daniel 
#89
Hola a todos.
Estoy estudiando "Operadores a nivel de bits" y no sólo deseo aprender la sintaxis sino también interpretar lo que hace cada línea de código.-

Lenguaje: "C"

Problema: (dudas) Expuesta en el código. 
                                                                                 
Error: Ninguno.

Otras Observaciones: Ninguna.

Código:


# include <stdio.h>

void despriegaBits(unsigned valor);

int main(void){
unsigned x; //No entiendo esta declaracion de variable, cual es el tipo?
printf("\n\n Introduzca un entero sin signo....:");
scanf("%u", &x);

despriegaBits(x);

return 0;
}

void despriegaBits(unsigned valor){
unsigned c; //No entiendo esta declaracion de variable, cual es el tipo?

unsigned despliegaMascara = 1 << 31; //Esta sentencia como se llama?, pareceria una funcion, pero no
                                             //tiene parentesis, me desconcierta, y lo mas importante, como funciona?, que hace?.

printf("\n %10u = ", valor);

for(c = 1; c <= 32; c++){
putchar(valor & despliegaMascara ? '1' : '0');
valor <<= 1;

if(c % 8 == 0){
putchar(' ');
}
}
putchar('\n');
}


Desde ya muchas gracias por la ayuda que puedan brindarnos.-
Saludos.
Daniel
#90
Hola.
rir3760 si en algún post no respondo a tus ayudas es porque me lleva tiempo asimilarlas.-
Voy al grano, sigo con mis prácticas de punteros y el programa que estoy haciendo es para que el operador ingrese por ejemplo 8 nombres y luego ordenarlos.-
Hay 2 cosas que no sé hacer, la primera, alguien me podría decir como pasar un array de punteros a función y la segunda, ¿como puedo hacer para que la cantidad de punteros se pida que se ingrese por teclado y no ponerlo a mano?.-

printf("\n Ingrese un entero para establecer la cantidad de nombres a ordenar...:");

Aclaro que el programita es para poner algo sino me van a tirar de las orejas.-
Otra cosita, la validación de ingreso de entero la copié de un post de rir3760, ya la adopte como definitiva, funciona a la perfección.-

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

void ingresoCorrecto(int*, int);

int main(void){
char *ptrNombres[] = {"Rosita", "Alberto", "Claudio", "Yanina", "Pedrito", "Jorge", "Daniel", "Leo"};
int indice=0, longitud=0;

longitud = sizeof ptrNombres / sizeof *ptrNombres;

printf("\n");
for(indice=0; indice<longitud; indice++){
printf("[%d] %s - ", indice, ptrNombres[indice]);
}

ingresoCorrecto(&indice,longitud);

printf("\n Su eleccion fue...: %s", ptrNombres[indice]);

return 0;
}

void ingresoCorrecto(int *ingreso, int longitud){
int ch=0, ok=0, temp=0;
do{
printf("\n\n ingrese un entero del [0] al [%d] para extraer un nombre..:", longitud-1);
ok = scanf("%d", &temp) == 1 && temp >= 0 && temp <= longitud-1;
while ((ch = getchar()) != EOF && ch != '\n');
}while(!ok);
*ingreso = temp;
}


Saludos.