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

#46
Hola

Quiero realizar un programa en donde me pida algunos datos y quiero guardar uno de ellos en un arreglo con la funcion gets(string). El problema es que al realizar la carga es como que se saltea la funcion y me pide ingresar los datos del proximo dato.

La parte donde falla es la siguiente

  fila=0;
        printf ("\nIngrese el nombre del alumno: ");
        gets(nombre);
        printf ("\nIngrese el numero de comision:  ");
        scanf ("%d",&comision);
        printf  ("\n%s",nombre);



Al ejecutarlo directamente se saltea el gets y empieza por "Ingrese el numero de comision". A este codigo le faltan declarar variables, etc pero quizas no estoy entendiendo el funcionamiento de la funcion, que desventajas tiene ,etc o porque se saltea?.

Muchas gracias
#47
Hola


Esta funcion devuelve 0 si las cadenas de texto son iguales (incluyendo mayúsculas y minúsculas); si la primera cadena es mayor que la segunda, devuelve un número positivo; si es mayor la segunda, devuelve un valor negativo..

Supongamos que tengo los siguientes arreglos:

char s1[5] = "Abeja";
char s2[5] = "Azul";

Mi duda es como se analiza cual es mayor o menor.
No entiendo como la funcion va recorriendo cada uno de los arreglos y decidir cual es mayor o menor.
La primera letra de ambos arreglos es la "A", luego ahi cambian de letra.
Como puedo pensar logicamente a esta funcion?....Va recorriendo letra x letra o que?...Y cuando dice mayor o menor se refiere al numero ascii de cada letra?
#48
Hola

Estoy recien empezando a ver archivos y queria saber como puedo copiar el contenido de un archivo de texto (.txt) en un arreglo bidemensional.
La idea seria que tengo un txt con varios nombres cargados

"Milan
Real Madrid
Ajax
Arsenal
Bayern Munich "

Y quiero pasar cada uno de los nombres a un arreglo de manera que si yo quiero imprimir el nombre "Milan", tendria que poner printf ("%s",arreglo[0]);

El codigo que hice hasta ahora es el siguiente.

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

int main()
{
    char arreglo[5][20],fila=0,columna=0,aux;
    FILE* arch;
    arch=fopen("C:\\Users\\Usuario\\Desktop\\Equipos.txt","r");

    while (!feof(arch))
    {
        fgets(arreglo,20,arch);
       
    }


    fclose(arch);
    return 0;
}


El problema es que al intentar poner un printf para que muestre lo que hay en la posicion 0, no me sale nada o sale cualquier cosa, entonces basicamente no entiendo lo que hace la funcion fgets.
Entiendo que copia linea por linea, pero no se la manera de pasar esto a un arreglo ya que no me sale.
#49
Hola

Tengo el siguiente problema. Necesito cargar nombres en una matriz y ordenar esa lista basandome en la primera letra. El nombre que tenga la primera letra mas cercana a la "A" iria primero y el mas cercano a la "Z" ultimo.

El codigo que hice hasta ahora es el siguiente.

#include <stdio.h>
#include <stdlib.h>
void IMPRIMIR(char arreglo[5][20]);
void ORDENAR(char arreglo[5][20]);
int main()
{
    char arreglo1[5][20];                ///ARREGLO DONDE GUARDO NOMBRES

    char letra='4';
    int bandera=0;
    int fila=0,columnachar=0;


    while ((arreglo1[fila][0]!='\0' || bandera==0)&& fila<5)
    {
        printf ("\nIngrese el nombre :  ");

        while (letra!='\r')
        {
            letra=getche();
            if (letra!='\r')
            {
                arreglo1[fila][columnachar]=letra;
                columnachar++;
            }
            if (letra=='\r')
            {
                if (columnachar==0)
                {
                    bandera=1;
                }
                if (bandera==0)
                {

                arreglo1[fila][columnachar]='\0';
                fila++;
                columnachar=0;
                }

            }

        }
        letra='4';


    }
    IMPRIMIR(arreglo1);


    return 0;
}


void IMPRIMIR(char arreglo1[5][20])
{
int fila=0,columna=0;

printf ("\n");
    while (fila<5)
    {
        printf ("%s\n",arreglo1[fila]);
        fila++;
    }
}





Este codigo solo incluye la carga en la matriz...pero nose como ordenarlo.
Me dicen que tengo que ordenarlo basandome en este codigo

void ordenar(int a[], int longitud)
{
int i, j, aux;
for (i = 0; i < longitud; i++)
{
for (j = i + 1; j < longitud; j++)
{
if (a[j] < a[i])
{
aux = a[i]; a[i] =
a[j]; a[j] = aux;
}
}
}
}


El problema es que intento hacerlo pero no me sale...La tanda de ejercicios incluye que lo ordenemos basandonos en la primera letra, y luego en todas las letras;..

Teoricamente tendria que comparar a cada posicion con la de la otra fila y si es mayor, crear un auxiliar, guardarlo y luego cambiarlos de lugar y asi para cada uno, lo he intentado pero no hay caso.
#50
Hola

Estaba haciendo un ejercicio de mi practica de informatica. El ejercicio es el siguiente



El codigo que hice hasta ahora es el siguiente

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void CARGADATOS(int arreglo2[5][8],int fila);
void IMPRIMIR(char arreglo1[5][20],int arreglo2[5][8]);
int main()
{
    char arreglo1[5][20];                ///ARREGLO DONDE GUARDO NOMBRES DE EQUIPOS
    int arreglo2[5][8];                  ///ARREGLO DONDE GUARDO LOS NUMEROS
    char letra='4';
    int bandera=0;
    int fila=0,columnachar=0;


    while (arreglo1[fila][0]!='\0' && bandera==0 && fila<5)
    {
        printf ("\nIngrese el nombre del equipo:  ");

        while (letra!='\r')               ///SI ES DISTINTO DE ENTER, GUARDA EN EL ARREGLO LA LETRA Y AUMENTA COLUMNA
        {
            letra=getche();
            if (letra!='\r')
            {
                arreglo1[fila][columnachar]=letra;
                columnachar++;
            }
            if (letra=='\r')            ///SI ES UN ENTER, SI LA COLUMNA ESTA EN 0, PONGO BANDERA EN 1 ASI NO ENCTRA Y TERNINA EL CICLO
            {
                if (columnachar==0)
                {
                    bandera=1;
                }
                if (bandera==0)   /// SI ES UN ENTER Y LA BANDERA ESTA EN 0, LLAMO A LA FUNCION PARA CARGAR LOS NUMEROS, Y PONGO \0
                {                 ///TERMINO LA FILA, PONGO UN \0, AUMENTA LA FILA Y LA COLUMNA LA VUELVO A 0..
                CARGADATOS(arreglo2,fila);
                arreglo1[fila][columnachar]='\0';
                fila++;
                columnachar=0;
                }

            }

        }
        letra='-4';    ///PONGO EN LETRA UN NUMERO PARA QUE ENTRE EN LA PROXIMA FILA.

    }
    IMPRIMIR(arreglo1,arreglo2);




    return 0;
}

void CARGADATOS(int arreglo2[5][8],int fila)
{
    int columna=0,puntos=0,ganados=0,empatados=0,perdidos=0,golesafavor=0,golesrecibidos=0,diferencia=0,partidosjugados=0;

    printf ("Ingrese la cantidad de partidos jugados: ");
    scanf ("%d",&partidosjugados);
    printf ("Ingrese la cantidad de partidos ganados: ");
    scanf ("%d",&ganados);
    printf ("Ingrese la cantidad de partidos empatados: ");
    scanf ("%d",&empatados);
    printf ("Ingrese la cantidad de goles a favor: ");
    scanf ("%d",&golesafavor);
    printf ("Ingrese la cantidad de goles recibidos: ");
    scanf ("%d",&golesrecibidos);

    puntos=ganados*3 + empatados;
    diferencia=golesafavor-golesrecibidos;


    arreglo2[fila][columna]=puntos;
    columna++;
    arreglo2[fila][columna]=partidosjugados;
    columna++;
     arreglo2[fila][columna]=ganados;
    columna++;
     arreglo2[fila][columna]=empatados;
    columna++;
     arreglo2[fila][columna]=perdidos;
    columna++;
     arreglo2[fila][columna]=golesafavor;
    columna++;
     arreglo2[fila][columna]=golesrecibidos;
    columna++;
     arreglo2[fila][columna]=diferencia;








}

void IMPRIMIR(char arreglo1[5][20],int arreglo2[5][8])
{
    int fila=0,columna=0;

   for (fila=0;fila<5;fila++)
   {
       printf ("%s",arreglo1[fila]);    ///IMPRIMO EL NOMBRE DE UN EQUIPO
       for (columna=0;columna<8;columna++)
       {

           printf ("  %d  ",arreglo2[fila][columna]);  /// CON EL FOR DE ADENTRO IMPRIMO TODA LA COLUMNA DE NUMEROS.


       }
       printf ("\n");
   }




}



El problema es que al momento de ejecutarlo tira todos numeros y letras raras. El compilador que uso es el codeblocks que informa si tengo algun error, en este caso lanzo lo siguiente que no logro entender que significa.

Linea 44

Warning: multi-character character constant (-Wmultichar)
Warning: overflow in implicit constant conversion (-Woverflow)
#51
Hola

Tengo una consulta sobre este tipo de operadores. Por ejemplo en el siguiente codigo

int main()
{
int x;
if (!(!(2<x) || (x>7)))
{
    printf ("Excelente");
}

}


Este codigo lo que hace es que si x es mayor  o igual a 3 y x es menor o igual a 7, que entre al if y que imprima la palabra "Excelente".
Lo que no entiendo es en que momento del codigo, el || se vuelve un && y en que momento del codigo los <> se vuelven >= o <=.
Que es lo que hace el negado exactamente este tipo de situaciones?


#52
Hola

Tengo el siguiente problema pero nose como resolverlo.

Complete la instruccion de asignacion apra que la variable x almacene un valor generado al azar que pertneezca al conjunto : 45,48,51,54,57,60,63,66,69,72,75

Actualmente hice lo siguiente

x=((4+rand()%4)*10)+5;

Esto me va a dar valores entre el 45 y el 75, pero nose como sumarle +3. Tengo pensando que tengo que usar otro rand adicional pero no se como armarlo.
#53
Hola

Tengo el siguiente ejercicio

Realizar una función que reciba como parámetro un arreglo de enteros positivos (cuyo tamaño se desconoce, termina en 0). La función debe retornar la cantidad de parejas de "números amigos" presentes en el arreglo. Dos números amigos son dos números enteros positivos a y b tales que a sea la suma de los divisores propios de b, y b sea la suma de los divisores propios de a. (Divisores propios son todos los divisores menos el propio numero).  Un ejemplo es el par de naturales (220, 284), ya que:
los divisores propios de 220 son 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 y 110, que suman 284;
los divisores propios de 284 son 1, 2, 4, 71 y 142, que suman 220.

Ej: Para el arreglo a={7,56,1184,2,6232,220,33,11,6368,1210,100,284,0}
la función deberá retornar 3 ya que estan presentes las parejas de amigos
(1184, 1210), (6232, 6368) y (220, 284),.

No debo usar arreglos auxiliares.
Hasta ahora hice lo siguiente:


#include <stdio.h>
#include <stdlib.h>
#define N 9001
void carga(int arreglo[N]);
void contador(int arreglo[N]);
int suma(int numero);
int suma2(int numero2);
int main()
{
int arreglo[N];
printf ("Ingrese arreglo:\n");
carga(arreglo);
contador(arreglo);



   return 0;
}

void carga(int arreglo[N])
{
   int numerin=-1,i=0;

   do
   {
       scanf ("%d",&numerin);

           if (numerin!=0)
           {
               if (numerin>0)
               {
                   arreglo[i]=numerin;
                   i++;

               }
           }

   }
   while (numerin!=0 && i<N);

arreglo[i]=0;
}

void contador(int arreglo[N])
{
   int numerin,i=0,j=0,numero=0,sumatoria=0,contador=0,numero2=0,sumatoria2=0;

   for (i=0;arreglo[i]!=0;i++)
   {
       numero2=arreglo[i];    ///GUARDO EL NUMERO
       sumatoria2=suma(numero2); ///HAGO LA SUMATORIA DE DIVISORES DE ESE NUMERO

       for (j=1;arreglo[j]!=0;j++)
       {
           numero=arreglo[j];  ///GUARDO ESTE NUEVO NUMERO
           sumatoria=suma2(numero);   ///HAGO LA SUMATORIA DE DIVISORES DE ESE NUMERO
           if (numero2==sumatoria && numero==sumatoria2)
           {
               contador++;
           }
       }
   }


   printf ("\n%d",contador);

}
int suma(int numero2)
{
   int div=1,sumita=0;
   for (div=1;div<numero2;div++)
   {
       if (numero2%div==0)
       {
           sumita=sumita+div;
       }





   }
   return sumita;
}
int suma2(int numero)
{
   int div=1,sumita=0;

   for (div=1;div<numero;div++)
   {
       if (numero%div==0)
       {
           sumita=sumita+div;
       }


   }
   return sumita;
}


Lo que hice fue cargar el arreglo, luego usar un for dentro de un for. En el primer for guarde el numero y realice la sumatoria de divisores del numero, dentro del otro for hice lo mismo y luego hice un if para comparar ambos  y si son iguales, suma en el contador

El problema es que el resultado siempre me da el doble de lo que me tendria que dar y nose donde esta el error. He probado el codigo de la sumatoria de divisores por separado es correcto.
Asi que probablemente el error este en los 2 for pero nose cual es. Si me pueden ayudar se los agradezco
#54
Hola


Tengo una duda. Supongamos que tengo un main en donde pongo la mayor parte de mi programa, luego desde el main invoco a otra funcion que sea de tipo int y tome como parametro un valor del main (por ejemplo un numero).

Supongamos que en la función tengo 2 variables llamadas "numero" (el que agarre del main) y "deb" una variable que cree dentro de la nueva función.

Cuando hago el return de esa funcion pongo "numero==deb".

Que significa?.
Basicamente mi pregunta significa que pasa cuando en el return igualo 2 variables ...Que valor retornaria?.


#55
Hola

Tengo el siguiente ejercicio de funciones.

4) Definir una función que reciba como parámetro un arreglo de enteros (cuyo tamaño se desconoce, termina en 0) y que retorne la longitud promedio de las secuencias de números pares consecutivos.
Ej: En el arreglo a={1, 3, 2, 4, 16, 5, 2, 9, -4, 10, 22, 8, 14, 11, 39, 4, 63, 12, 60, 0};   se encuentran las secuencias (2, 4, 16) de longitud 3, (2) de longitud 1, (-4, 10, 22, 8, 14) de longitud 5, (4) de longitud 1 y (12, 60) de longitud 2.
La función retorna 2.4 que es la longitud promedio de las 5 secuencias de números pares consecutivos (3+1+5+1+2=12/5=2.4)

Les adjunto mi codigo

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 1000
void CARGA(int arreglo[N]);
double PROMEDIO(int arreglo[N]);
int main()
{
    int arreglo[N];

    printf ("Ingrese una secuencia de numeros: \n");
    CARGA(arreglo);
    printf ("El promedio es %.2lf",PROMEDIO(arreglo));


    return 0;
}

void CARGA(int arreglo[N])   ///CARGA DEL ARREGLO
{
    int i=0,numerin;

    do
    {
        scanf ("%d",&numerin);
        if (numerin!=0)
        {
            arreglo[i]=numerin;
            i++;
        }
    }
    while (numerin!=0 && i<N);
    arreglo[i]=0;
}
double PROMEDIO(int arreglo[N])
{
    int i=0,suma=0,longitud=0,secuencia=0,bandera=0;
    double promedion=0;

    for (i=0;arreglo[i]!=0;i++)
    {
        if (arreglo[i]%2==0)   ///SI ES PAR
        {
            longitud++;        ///LONGITUD DE LA SECUENCIA

            if (bandera==0)
            {
                secuencia++;   
                bandera=1;
            }
        }
        else       ///SI NO ES PAR
        {
            bandera=0;
            suma=suma+longitud;
            longitud=0;
        }
    }

    printf ("\nLa suma es %d",suma);
    printf ("\nEl numero de secuencias es %d",secuencia);
    promedion=(double)suma/secuencia;
    return promedion;
}





En teoria me tendria que dar 2.4 pero me da 2.0
Evalue que habia en la variable suma y habia 10 en vez de haber 12.
El numero de secuencias por lo que veo, lo calcule bien ya que dio el mismo : 5.
Entonces de alguna forma algo le estoy pifiando con la variable suma=suma+longitud que no me calcula bien, pero no se que es. Alguna idea?.Gracias de antemano
#56
Hola


Tengo este ejercicio, es un multiple choice y no lo entiendo porque cuando yo empiezo el for llega un momento en que  en la primera vuelta queda frase[0]=frase[12]...esto es lo que no entiendo, como el codigo puede continuar si el frase[12] va mas alla del \0 que supuestamente es el fin del arreglo. La respuesta correcta es "join the navy" pero no se porque.



int main()
{  char frase[50]= {'y','v','a','n',' ','e','h','t',' ','n','i','o','j','\0'};
    char aux;
    int i,j,k;

    for(k=0;k<=6;k++)
    {  aux=frase[k];
       frase[k]=frase[12 - k];
       frase[12 - k]=aux;
    }
    printf("%s\n",frase);


El printf imprime:
a-yvan eht nioj
b-jhon envy tia
c-join the navy
d-No compila
e-Da error de ejecución
f-Ninguna de la anteriores


Por otro lado, este es mas sencillo

Completar el siguiente fragmento de programa para validar el ingreso por teclado de un número entero en la variable num y aceptar solamente números pares o múltiplos de 5.

do
{
    printf("Ingrese un carácter: ");
    ____________________;

} while (_____________________);


Me pide que complete en solo una linea. Podria hacerlo si pongo un if  y el scanf en la misma linea muy chiquitito, pero hay alguna otra forma de hacerlo, porque no pareceria correcta la forma.


Muchas gracias de antemano
#57

Hola

Quiero que lea un archivo, pero me aparece este tipo de error "Universal character name,etc" y nose que es. Como lo soluciono?. Estoy usando codeblocks en C.

#58
Hola

Tengo una practica de Informatica donde hay un problema que es el siguiente.

Complete la instruccion de asignacion para que la variable x almacene un valor generado al azar que pertenezca al conjunto: 30,40,50,60,70,80,90.

x=----------------;

Osea debo completar el problema en una sola linea.
Mi idea es hacer un rand que de valores aleatorios entre 1 y 7 y hacer un par de IF que si toca 1 sea igual a 30....si toca 2...sea igual a 40 ,etc.
Pero para eso necesitaria mas lineas de codigo.
Por lo tanto me gustaria saber como hacer para que la variable X tenga esos numeros aleatorios en una sola linea.

#59
Hola

Queria saber porque el siguiente codigo

printf ("%.2lf\n",pow(25.0,1/2));


En vez de dar el valor 5.00, da el valor 1.00

Muchas gracias
#60
Hola

Como veran soy bastante novato en C ,y desde la facultad me piden este tipo de ejercicio pero no logro hacerlo funcionar. He logrado realizar la carga de un arreglo sin incluir repetidos pero cuando estamos ingresando los datos...Pero una vez que tengo el arreglo cargado nose como modificar el arreglo para que me de sin repetidos.

Agradeceria cualquier ayuda