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

#1
Java / Sistema de control vacacional en JAVA
23 Agosto 2018, 17:59 PM
Muy buenas a todos, estoy empezando a programar en JAVA y para practicar estoy haciendo un pequeño sistema vacacional donde al usuario le estoy pidiendo que introduzca su nombre y aparte que introduzca sus años de antigüedad, PERO cuando quiere introducir el nombre, se pasa directo a los años de antigüedad así evitando que introduzca su nombre.

Alguien que me ayude en eso, porfa, tal vez estoy haciendo algo mal, este es el codigo:



Código (java) [Seleccionar]
package sistemadecontrolvacacional;
import java.util.Scanner;

public class SistemaDeControlVacacional {

   public static void main(String[] args) {
       
       Scanner in = new Scanner (System.in);
       int antiguedad, opcion;
       String nombre = "";
       
       System.out.println("\tSistema de Control de vacaciones");
       
       System.out.println("1) Departamento de Contabilidad");
       System.out.println("2) Departamento de Negocios");
       System.out.println("3) Departamento de Administración");
       System.out.println("Escoga una opcion: ");
       opcion = in.nextInt();
       
       switch(opcion){
           case 1:
               System.out.println("Introduzca su nombre: ");
               nombre = in.nextLine();
               
               System.out.println("¿Cuantos años de antiguedad tiene?");
               antiguedad = in.nextInt();
               
               if(antiguedad <= 1){
                   System.out.println(nombre + ", usted cuenta con 7 dias de vacaciones");
               }
               else{
                   if(antiguedad > 1 && antiguedad <= 2){
                       System.out.println(nombre + ", usted cuenta con 15 dias de vac
aciones");                    }
                   else{
                       System.out.println(nombre + ", usted cuenta con 20 dias de vacaciones");
                   }
               }
               break;    
           case 2:
               System.out.println("Introduzca su nombre: ");
               nombre = in.nextLine();
               
               System.out.println("¿Cuantos años de antiguedad tiene?");
               antiguedad = in.nextInt();
               
               if(antiguedad <= 1){
                   System.out.println(nombre + ", usted cuenta con 10 dias de vacaciones");
               }
               else{
                   if(antiguedad > 1 && antiguedad <= 2){
                       System.out.println(nombre + ", usted cuenta con 20 dias de vacaciones");
                   }
                   else{
                       System.out.println(nombre + ", usted cuenta con 25 dias de vacaciones");
                   }
               }
               break;
           case 3:
               System.out.println("Introduzca su nombre: ");
               nombre = in.nextLine();
               
               System.out.println("¿Cuantos años de antiguedad tiene?");
               antiguedad = in.nextInt();
               
               if(antiguedad <= 1){
                   System.out.println(nombre + ", usted cuenta con 15 dias de vacaciones");
               }
               else{
                   if(antiguedad > 1 && antiguedad <= 2){
                       System.out.println(nombre + ", usted cuenta con 25 dias de vacaciones");
                   }
                   else{
                       System.out.println(nombre + ", usted cuenta con 30 dias de vacaciones");
                   }
               }
               break;
           default:
               System.out.println("No se encuentra ningun departamento");
               break;
       }
       
   }
   
}




Mod: Obligatorio utilizar etiquetas GeSHi.
#2
Programación C/C++ / Re: serie chingona
30 Mayo 2018, 04:03 AM
Cita de: MAFUS en 24 Mayo 2018, 19:42 PM
Sorry, es en C, pero creo que podrás seguirlo, es sencillo. Se basa en que con numeradores impares éstos se repiten 3 veces seguidas, con impares solo 2. De igual forma todos los numeradores impares hacen la fracción positiva, los impares la hacen negativa. La serie dura mientras el denominador sea positivo:

#include <stdio.h>

int main() {
    int n;
    int i;
    int k;
    int numerador;
    int denominador;
    int repeticiones;

    printf("> ");
    scanf("%d", &n);
    printf("S =");

    numerador = 1;
    denominador = 1;
    i = 0;
    k = 0;
    while(denominador>0) {
        // Calculo las veces que se repite el numerador
        repeticiones = 2 + numerador%2;

        printf(" %d/%d ", numerador, denominador);

        // Calculo el próximo denominador
        if(k<n-1)
            denominador += 2;
        else if(k>n-1)
            denominador -= 2;
        ++k;

        // Control del bucle de las repeticiones
        if(++i==repeticiones) {
            ++numerador;
            i=0;
        }

        // Escribo el signo
        if(denominador>0) {
            if(numerador%2)
                putchar('+');
            else
                putchar('-');
        }
    }
}




Gracias MAFUS, y si, pude entender el código en C, muchas gracias!!!!
#3
Programación C/C++ / Re: serie chingona
30 Mayo 2018, 04:01 AM
Cita de: NEBIRE en 24 Mayo 2018, 18:23 PM
Pero tu mismo te has respondido en parte...

Tienes  4 series... la del numerador, la del denominador, la del signo de operacion, y la de cambio del numerador.
Además se pueden simplificar ya que parece que el cambio de signo coinciden con el cambio del valor del numerador.
1, 1, 1, 2, 2,
+, +, +, -, -,

Una de las series es 3,2, 3,2, 3,2, 3,2... Si simplemente alterna entre dos valores, puedes poner sendos bucles uno tras otro limitados por dichos valores.


   bucle para A desde 1 a 3
       ...
   siguiente

   bucle para B desde 1 a 2
       ...  
   siguiente


Luego el numerador se mantiene con su valor en el bucle A, pero al salir aumenta en uno y se mantiene así en el bucle B, al salir aumenta... Además se ha constatado que el signo sigue 'el ritmo' del numerador, luego en el bucle A suma y en el bucle B resta
y ahora con todo esto actualizamos el código:


entero valor = Pedir numero ¿positivo?

entero numerador = 1
entero acumulador = 0
entero denominador = 1

   bucle para A desde 1 a 3
       acumulador  = acumulador + (numerador / x) //x porque aún no hemos determinado el valor del denominador.
   siguiente
   numerador +=1

   bucle para B desde 1 a 2
       acumulador  = acumulador - (numerador / x)
   siguiente
   numerador +=1



Ahora estudiemos el denominador... dices que empieza en 1 hasta alcanzar un tope. entiendo que el tope será aquel que luego le permita descender nuevamente hasta acabar en 1. Saber ese tope exige conocer cuantos quebrados compondrán la serie.
Entonces empezaremos por calcularlo, después de todo, necesitábamos saber esto aunque no se pidiera...cuando acaba la serie.
Veamos... el denominador aumenta 2 cada vez, empieza en 1 debe acabar en 1, en tanto que el numerador se repite 3 veces y luego dos antes de cambiar, es decir
El numerador necesita 5 quebrados para aumentar en 2 su valor. Luego podemos sumar 5 quebrados por cada 2 valores que se resten al tota...
numquebrados = ((Total -1) /2) * 5
Ahora bien, esa división de 2, implica que si total-1 no es par, dará decimales... miremos dos casos de ejemplo uno par y otro impar para ver como se comporta:
v = 7
v= 8
con v = 7 (mirando sólo el numerador) 111,22,,333,44,,555,66 = 15 quebrados
con v = 8 (mirando sólo el numerador) 111,22,,333,44,,555,66,,777 = 18 quebrados.
Es decir, la conclusión es clara, tal como se preveía... si v es impar (o v-1 es par), la fórmula se cumple (7-1)= 6; 6/2= 3; 3*5 = 15 justo lo que nos da...
en cambio si v= par, con la fórmula nos da: 8-1= 7; 7/2= 3'5; 3'5*5 = 17'5
Cono resulta exactamente, consideremos no restarle 1, para que sea para y la división sea entera: 8/2= 4; 4*5= 20, luego excede en 2... pues ya esta, cuando sea par seguimos esta otra formula:
quebrados = (((v/2) * 5) -2)

Todavía podría reqerir un ajuste a casua de denominador, pero éste requiere saber de antemano el número teórico de quebrados, luego primero calculamos el número teórico, y luego se actualizaría. Sin embargo debido a una ambigüedad, sin aclarar, no se lleva a cabo tal ajuste...

entero quebrados
   si ((v and 1) = 0 ) luego  // 'plis': v and 1, no: v modulo 2
       quebrados = (((v/2) * 5) -2)
   sino
       quebrados = (((v-1) /2) * 5)
   fin si


Una vez conocido la cantidad de quebrados, ahora ya podremos conocer el valor máximo del denominador:, pués llegará justo a la mitad de los quebrados.
demoninadorMax = (1 + (((quebrados-2)/2) *2)) ... lo abreviaremos a dMax...
+1, porque el denominador comienza en 1, quebrados -2, porque los dos quebrados de los extremos ya se consideran, entre 2, porque la serie crece, y luego decrece y por 2 porque el siguiente denomindador el el previo aumentado en 2.

Veamos si resulta acertado, para los valores ya conocidos (6, 7 y 8)
dMax(x) viene a decir valor máximo del denominador cuando el valor introducido sea x.
dMax(6) = (1 + (((12-2)/2*2)) = 11 (coincide con lo que pusiste)
dMax(7) = (1 + (((15-2)/2)*2) = 14
dMax(8) = (1 + (((18-2)/2)*2) = 17
Antes de comprobar si los últimos coinciden, queda claro que se puede, simplificar ya que /2*2 se anulan mutuamente. dividir algo entre 2 para luego inmediatamente multiplicalro por dos, es lo mismo que no hacer nada. Luego simplificado quedaría:
dMax = (1 + quebrados-2) , y como ahora son sumas, también se pueden simplificar...
dMax = (quebrados -1)
A hora la comprobación para v=7 y v=8 (con v=6, es 11, como ya colocaste en el enunciado).
La comprobación la hacemos colocando los numeradores y debajo la línea resultante denominadores (se antecede con 0, para que todos tengan dos cifras y visualmente coincidan las líneas).
para v = 7;  01 01 01 , 02 02 ,,, 03 03 03 , 04 04 ,,, 05 05 05 , 06 06 (15 quebrados)
denominaD; 01 03 05 , 07 09 ,,, 11 13 15 , 13 11 ,,, 09 07 05 , 03 01

para v = 8;  01 01 01 , 02 02 ,,, 03 03 03 , 04 04 ,,, 05 05 05 , 06 06 ,,, 07 07 07 (18 quebrados)
denominaD; 01 03 05 , 07 09 ,,, 11 13 15 , 17 17 ,,, 15 13 11 , 09 07 ,,, 05 03 01

Vemos que en realidad, a causa de valores pares o impares no se ajusta con la formulación... realmente no es complicado ajustarla, pero como decía más arriba hay una ambigüedad en tu especificación, luego no lo toco y resumo que como este resultado ofrece básicamente la misma cantidad de quebrados que los que nos daban pero sujeto también al condicionante de si v es par o impar, podemos simplificar que:
Si v = par; dMax = quebrados  (el máximo se repite 2 veces);
y Si v=impar; dMax= (quebrados-1) (no se repite) que es exactamente la misma conclusión a la que llegamos.

Entonces volvemos al código previo para completarlo:

entero quebrados, dMax
   si ((v and 1) = 0 ) luego  // v es par
       quebrados = (((v/2) * 5) -2)
       dMax = quebrados       // denominador central se repite.
   sino                               // v es impar
       quebrados = (((v-1) /2) * 5)
       dMax = (quebrados -1)  // denominador central no se repite.
   fin si


Y finalmente si montamos todo el código junto, con la lógica que une todas las partes...

entero valor = Pedir numero ¿positivo?
entero resultado

resultado = CalcularCustomSerie(valor)


entero = funcion CalcularCustomSerie(entero valor)
   entero numerador = 1
   entero acumulador = 0
   entero denominador = 1
   entero inc = 2
   entero quebrados, dMax, q //q lleva la cuenta de los quebrados.
   buleano vPar


   // calcular número de quebrados y valor máximo del denominador.
   vPar = ((valor and 1) = 0)      // 'plis': v and 1, no: v modulo 2    
   si (vPar = TRUE ) luego  
       quebrados = (((valor / 2) * 5) -2)
       dMax = quebrados            // denominador central se repite.
   sino // vPar = FALSE
       quebrados = (((valor -1) / 2) * 5)
       dMax = (quebrados -1)      // denominador central no se repite.
   fin si

   Hacer
       bucle para A desde 1 a 3
           acumulador  = acumulador + (numerador / denominador)
           q +=1
           si  (q = quebrados)  devolver acumulador
           
           si (q = dMax) luego  
               si (vPar = TRUE) luego  // denominador, se repite, no se incrementa esta vez.
                   inc = -inc   // pero si se activa que el incremento sea negativo en lo sucesivo (decremento).
               sino
                   inc = -inc                      
                   denominador += inc          
               fin si                
           sino
               denominador += inc
           fin si
       siguiente
       numerador +=1

       bucle para B desde 1 a 2
           acumulador  = acumulador - (numerador / denominador)
           q +=1
           si  (q = quebrados)  devolver acumulador
         
           si (q = dMax) luego  
               si (vPar = TRUE) luego  // denominador, se repite, no se incrementa esta vez.
                   inc = -inc   // pero si se activa que el incremento sea negativo en lo sucesivo (decremento).
               sino
                   inc = -inc                      
                   denominador += inc          
               fin si                
           sino
               denominador += inc
           fin si
       siguiente
       numerador +=1

   Repetir //mientras (q < quebrados) // este bucle es indefinido, hay salida desde cada uno de los previos bucles.

   //devolver acumulador
Fin funcion

El pseudocódigo se puede optimizar, pero ya queda a tu esfuerzo... así funciona correctamente, si la ambigüedad que se plantea a continuación sale favorable a lo que he tenido que asumir como correcto...

Y ahora toca hablar de la ambigüedad...
Hay un dato ambiguo (que has dejado al aire y que no queda claro). Si los denominadores, deben ser duplicados o no, es decir el quebrado central puede ser central para ambas partes?, Si el número de quebrados debe ser siempre par, el denominador central se repetirá dos veces, pero cuando el número de quebrados sea impar, se repetirá solo 1 (ó 3 veces...) yo asumo que solo 1, pero es arriesgado, toda vez que en la serie que tú mismo pones, al final incumples tu propia regla de 3,2 ,, 3,2 ,, 3,2, pués los dos numeradores finales se repiten: 2,2 (44,55; de 4/7, 4/5, 5/3, 5/1)...
Dicho de otro modo, con tus propias reglas, la serie que pones debería ser:
S = 1/1 + 1/3 + 1/5  - 2/7 - 2/9  + 3/11 + 3/13 + 3/11 - 4/9 - 4/7 + 5/5 + 5/3 + 5/1

Separando la serie en los numeradores y denominadores (visualmente deja más claro ver la relación entre ellos):
numeradores: 01 01 01 , 02 02 ,,, 03 03 03 , 04 04 ,,, 05 05 05
denominado.: 01 03 05 , 07 09 ,,, 11 13 11 , 09 07 ,,, 05 03 01

Dada tal ambigüedad, puede ser preciso reajustar, el pseudocódigo... y eso ya lo dejo a tu esfuerzo, toda vez que ya te lo he dejado totalmente masticado y digerido. Solo te falta ensamblar las piezas... con alguna corrección menor si procede.



Nota que los bucles internos solo cambian en dos sencillas cosas: la cuenta del bucle  y el signo, ahí te lo dejo para que pienses...




Gracias Neberi, pude responderme algunas dudas, gran aporte
#4
Programación C/C++ / serie chingona
24 Mayo 2018, 07:54 AM
Buenas a todo el foro y al que vea este asunto.
Quisiera que alguien me pueda ayudar o guiar en esta serie que les presentare a continuación.
El numerador tomara como limite de la serie.
Supongamos que le pido un numero de limite a un usuario, este introduce el numero "6". Entonces la serie tiene que ir de esta forma:


S = 1/1 + 1/3 + 1/5  - 2/7 - 2/9  + 3/11 + 3/11 + 3/9 - 4/7 - 4/5 + 5/3 + 5/1


Como se puede observar, los 3 primeros números tienen que sumar, los dos siguientes se empiezan a restar, luego nuevamente se suman 3 números, se restan 2 números y así sucesivamente.
Hay que tener cuenta que el denominador va aumentando de 2 en 2 hasta un cierto punto y que luego se va reduciendo.
En el numerador, los 3 primeros dígitos son el numero " 1 " , luego "2", luego "3", e ira así sucesivamente hasta el limite introducido.


La verdad solo pude llegar hasta la mitad del problema, "3/11" donde ambos números tienen que ser iguales y luego reducirse.
Cualquier ayuda es buena.


Solo pude llegar hasta aquí, si hay errores, tan solo díganlo.
Gracias de Anticipo...




Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {
int numero, deno = 1,posi = 0, ban = 1, nega = 0;
float serie1 = 0, serie2 = 0, serieT = 0, T;

cout << "Introduzca un numero: ";
cin >> numero;
cout << endl;
for(int i = 1; i <= numero / 3; i++){
if(ban == 1){
while(posi < 3){
cout << " + " << i << "/" << deno << " ";
T = T + i / deno;
serie1 += T;
posi += 1;
deno += 2;
}
posi = 0;
ban = 0;
}
else{
while(nega < 2){
cout << " - " << i << "/" << deno << " ";
T = T - i / deno;
serie2 += T;
nega += 1;
deno += 2;
}
nega = 0;
ban = 1;
}
serieT = serie1 + serie2;
}

return 0;
}



· Los códigos deben ir en etiquetas GeSHi
· No se debe escribir en mayúsculas
>aquí las reglas del foro
-Engel Lex
#5
Programación C/C++ / Re: ayuda basica
9 Diciembre 2017, 23:18 PM
Cita de: Lurker en  9 Diciembre 2017, 17:26 PM
Si postearas la soluciòn que encontraste quizás le serviria a alguien en tu misma situación, lo bueno es compartir.....



Saludetes.


Cierto, gracias por la sugerencia, esta es la solución que encontré para que simplifique una fracción totalmente...



for(int i=1; i<=nume; i++){
      for(int j=1; j<=deno; j++){
         if(nume%i==0){
            if(deno%i==0){
               nume /= i;
               deno /= i;
            }
         }
      }
   }
#6
Programación C/C++ / Re: ayuda basica
9 Diciembre 2017, 13:22 PM
Cita de: Erius en  9 Diciembre 2017, 13:15 PM
Algo tonto, pero algún crack que me ayude a mejorar este código para simplificar totalmente una fracción y no hasta cierto punto...


for(int i=2;i<=nume;i++){
      if(nume%i==0){
         if(deno%i==0){
            nume=nume/i;
            deno=deno/i;
         }
      }
   }


Eso es lo que hice....


Ahaha ya no, gracias de todas formas, ya pude hacerlo....
#7
Programación C/C++ / ayuda basica
9 Diciembre 2017, 13:15 PM
Algo tonto, pero algún crack que me ayude a mejorar este código para simplificar totalmente una fracción y no hasta cierto punto...


for(int i=2;i<=nume;i++){
      if(nume%i==0){
         if(deno%i==0){
            nume=nume/i;
            deno=deno/i;
         }
      }
   }


Eso es lo que hice....
#8
Solo tratas de reducir una fracción, no es así??
Pues si te ayuda... puedes acoplarlo a tu código...



 for(int i=2 ; i<=num ; i++){
       for(int j=2 ; j<=deno ; j++){
       if(num%i==0){
         if(den%i==0){
            num=num/i;
            den=den/i;   
         }
       }
   }
}

Tienes un pequeño error en la división, creo que ya debiste darte cuenta, algo sencillo y ademas estas declarando de nuevo a una variable que ya declaraste anteriormente....
Saludos...

#9
Programación C/C++ / vectores C++
4 Diciembre 2017, 04:55 AM
Que tal foro, como andan, espero que bien...
Bueno no se si me pueden guiar, no quiero que me lo hagan el código, eso lo haré yo, mi problema es como puedo ordenar un vector, es decir, lleno el vector por ejemplo (3,2,1,5,4), y tengo que mostrarlo ordenado, así (1,2,3,4,5)...
Cabe recalcar que el vector puede tener cualquier dimensión de acuerdo al usuario...

Alguna sugerencia???
#10
Muy buenas a todos del foro, quisiera que me puedan ayudar con la programación modular en C++, especialmente en vectores y matrices, quisiera que me puedan ayudar a como debo llamar a los vectores para que puedan trabajar en diferentes modulos, que variables deben ser locales y cuales globales..
Porfa una ayuda..

Tal vez con este ejercicio una ayuda, para que me de cuenta como debo hacerlo...

Me dice que llene un vector con n elementos y que calcule su promedio...

Y para hacerlo modular mente debo tener por los menos 3 módulos, uno de introducción donde pida o llene el vector, otro donde estén las operaciones necesarias para resolver y un ultimo donde se muestre el resultado.

Por el momento solo puedo llenar el primer modulo, es decir solo llenar el vector, pero para un segundo modulo, donde calcularía el promedio de todos los números del vector no tengo idea de como llamarlo, esto es lo que codifique, ayudaaaaaa!!!


#include <iostream>
using namespace std;

int X, vector[10000]; 

int leer(int n){
   
   cout<<"introduzca el tamaño de su vector: "; cin>>n;
   
   for(int i=0;i<n;i++){
      cout<<i+1<<") Introduzca un numero: "; cin>>vector;
   }
   return n;
}

int main(int argc, char *argv[]) {
   leer(X);
   return 0;
}