Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - Kabuto

Páginas: 1 ... 33 34 35 36 37 [38] 39 40 41 42 43 ... 50
741
Hola.

No estoy muy seguro de que ordenar el array sea al mejor forma para encontrar "trabajadores menores" que ganen más que los "mayores".

A mí la solución que se me ocurre es usar bucles for anidados.

- El bucle principal recorre el array buscando trabajadores menores.

- Cuando encuentra a uno, podemos hacer una copia de él en una variable de tipoPersona(no es necesario hacer la copia pero así al leer el código se entiende mejor lo que hacemos)

- Hecha la copia, arranca el bucle anidado que hace su propio recorrido del array pero buscando trabajadores mayores.

- Cada vez que encuentra a uno, compara su salario anual con el del trabajador menor que hemos hecho una copia.
Si el trabajador menor tiene mayor salario anual que el trabajador mayor, entonces mostramos sus datos en pantalla e interrumpimos el bucle anidado con la sentencia break.
Interrumpimos porque ya no es necesario que siga buscando, ya hemos encontrado al menos un trabajador mayor que gana menos que el menor, así que interrumpimos el bucle anidado y entonces el bucle principal retoma su búsqueda de otros empleados menores y repetirá el proceso hasta que haya recorrido todo el array.


Te dejo un nuevo código con esta nueva opción añadida.

Además he cambiado el código de la opción para añadir un nuevo trabajador.
Como dije antes, ahí pusiste un bucle que no tenía mucho sentido porque cada vez que añadías un trabajador, se recorría todo el array recalculando los atributos de los trabajadores añadidos anteriormente.
He quitado el bucle y reordenado la estructura del do .... with y el if.

Creo que ahora queda más ordenado, pero comprueba tú mismo que todos los atributos se calculan correctamente según el salario, por si me he equivocado.

También he hecho otros cambios menores. He visto que usabas distintas variables/atributos para el salario mensual (sal_men y sal_mensual), el anual (sal_anu y sal_anual), vacaciones... según si el trabajador era  de salario menor o salario mayor.
Esto es innecesario, el nombre de estos atributos pueden ser iguales en ambos casos.
Lo único que ha de ser diferente es como se calculan sus valores, pero los nombres no es necesario que cambien. De hecho, es mejor que sean iguales.

Otra cosa que he cambiado ha sido declarar la variable cesta como una constante, ya que según entiendo por el enunciado, su valor siempre va a ser el mismo.

Aquí el código, pregunta si algo no lo entiendes o dime si me equivocado en algo interpretando el enunciado.

Código: [Seleccionar]
program ACME;

type
 
    tipoPersona = record
 
        nombre: string;
 
        salario: real;
 
sal_anual: real;
 
sal_mensual: real;
 
utilidades: real;

vacaciones: real;
 
bono: real;
 
cedula: string;
 
    end;
 
const
 
capacidad = 1000;

cesta = 200;
 
var
 
tra: array[1..capacidad] of tipoPersona;

trabajadorMenor: tipoPersona;
 
    cantidad: integer;
 
    opcion: integer;
 
    i, j: integer;
 
    textoBuscar: string;
 
    encontrado: boolean;
 
bono: real;
 
seBorro:boolean;
 
acumMedia :real;
 
contMedia: integer;
 
 
 
 
 
{Cuerpo del programa principal}
 
begin
 
cantidad := 0;
 
    repeat
 
        WriteLn('***BIENVENIDO A ACME***');
 
        WriteLn;
 
        WriteLn('1- Agregar Trabajador');
 
        WriteLn('2- Todos los trabajadores');
 
        WriteLn('3- Buscar a un trabajador');
 
        WriteLn('4- Reporte 1');
 
        WriteLn('5- Reporte 2');
 
WriteLn('6- Eliminar trabajador');
 
WriteLn('7- Promedio Nomina Mayor');
 
WriteLn('8- Promedio Nomina Menor');
 
WriteLn('9- Promedio General');

writeln('10- Trabajadores de Nomina Menor que ganan mas que algunos de Nomina Mayor');
 
        WriteLn('0- Salir');
 
        Write('Escoja una opcion: ');
 
        ReadLn(opcion);
 
        WriteLn;
 
 
 
        case opcion of
 
1: { Agregar trabajador }
 
if (cantidad < capacidad) then
 
                begin
 
inc(cantidad);
 
                    WriteLn('Introduciendo al trabajador ', cantidad);
 
                    Write('Introduzca Cedula del trabajador: ');
 
                    ReadLn(tra[cantidad].cedula);

Write('Introduzca el nombre del trabajador: ');
 
                    ReadLn(tra[cantidad].nombre);
 
                    Write('Introduzca Salario: ');
 
                    ReadLn(tra[cantidad].salario);
                   
                    with tra[cantidad] do begin
                   
if salario > 1500 then begin

utilidades := salario * 2;{2 meses de utilidades}

vacaciones := salario;{1 mes de bono vacacional}

bono := salario * 0.1;{10% productividad, se paga mensual}

sal_mensual := salario + bono;

sal_anual := sal_mensual * 12 + utilidades + vacaciones;

end

else begin {salario es <= a 1500}

utilidades := salario * 4;{4 meses de utilidades}

vacaciones := salario;{1 mes de bono vacacional}

sal_mensual := salario  + cesta;{cesta ticket mensual}

sal_anual := sal_mensual * 12 + utilidades + vacaciones;

end;
                   
                    end;
 
end;
 
            2: begin {Todos los trabajadores}
 
if cantidad = 0 then
 
WriteLn('No hay datos')
 
else
 
for i := 1 to cantidad do
 
WriteLn(i,' ',tra[i].cedula,' ',tra[i].nombre,' ',tra[i].salario:4:2);
 
WriteLn;
 
end;
 
            3:  {Buscar a un trabajador}
 
                begin
 
Write('Escriba cedula del trabajador ');
 
ReadLn( textoBuscar );
 
encontrado := false;
 
for i := 1 to cantidad do
 
if pos (textoBuscar, tra[i].cedula) > 0 then
 
begin
 
encontrado := true;
 
WriteLn( i,' - Cedula: ', tra[i].cedula,',Nombre: ', tra[i].nombre,', Salario: ', tra[i].salario:4:2);
 
end;
 
if not encontrado then
 
WriteLn('No se ha encontrado.');
 
WriteLn;
 
                end;
 
            4:  {Reporte 1 }
 
for i := 1 to cantidad do
 
                begin
 
if tra[i].salario > 1500 then
 
begin
 
writeln('Nombre del trabajador: ', tra[i].nombre);
 
WriteLn('Salario: ', tra[i].salario:4:2);
 
WriteLn('Bono: ', tra[i].bono:4:2);
 
WriteLn('Total: ', tra[i].sal_mensual:4:2);
 
end;
 
                end;
 
            5: { Reporte 2}
 
for i := 1 to cantidad do
 
                begin
 
if tra[i].salario <= 1500 then
 
begin
 
writeln('Nombre del trabajador: ', tra[i].nombre);
 
WriteLn('Salario: ', tra[i].salario:4:2);
 
WriteLn('Cestaticket: ', cesta);
 
WriteLn('Total: ', tra[i].sal_mensual:4:2);
 
end;
 
                end;
 
            6: {Borra un trabajador}
 
begin
 
write('Nombre a buscar: ');
 
readln(textoBuscar);
 
seBorro := false;
 
for i := 1 to cantidad do begin
 
{ReadLn(tra[cantidad].nombre);}
 
if (textoBuscar = tra[i].nombre) then
 
begin
 
seBorro := true;
dec(cantidad);
 
with tra[i] do begin
 
nombre:='';
 
salario:=0;
 
sal_anual:=0.0;
 
sal_mensual:=0.0;
 
utilidades:=0;
 
vacaciones:=0;
 
bono:=0;
 
end;
 
end;
 
end;
end;
 
            7: {Promedio Nomina Mayor}
 
begin

acumMedia:= 0;

contMedia:= 0;
 
for i := 1 to cantidad do
 
if tra[i].salario > 1500 then
 
begin
 
acumMedia := acumMedia + tra[i].salario;

inc(contMedia);
 
end;

if (contMedia = 0) then

writeln('No hay trabajadores con salario mayor de 1500')

else
 
writeln('Promedio Nomina Mayor es: ', acumMedia/contMedia:4:2);
end;
 
            8: {Promedio Nomina Menor}
 
begin

acumMedia:= 0;

contMedia:= 0;
 
for i := 1 to cantidad do
 
if tra[i].salario <= 1500 then
 
begin
 
acumMedia := acumMedia + tra[i].salario;

inc(contMedia);
 
end;

if (contMedia = 0) then

writeln('No hay trabajadores con salario menor o igual a 1500')

else

writeln('Promedio Nomina Menor es: ', acumMedia/contMedia:4:2);
end;
 
            9: {Promedio general}
 
begin

if (cantidad = 0) then

writeln('No hay trabajadores registrados')

else

begin

acumMedia:= 0;

contMedia:= 0;

for i := 1 to cantidad do

begin

acumMedia := acumMedia + tra[i].salario;

inc(contMedia);

end;

writeln('Promedio general es: ', acumMedia/contMedia:4:2);

end;
end;

10: {Trabajadores Menores que ganan mas que Mayores}

begin

writeln('Trabajadores Menores que ganan mas que Mayores:');

for i:= 1 to cantidad do {Bucle principal busca trabajadores menores}

if tra[i].salario <= 1500 then

begin

trabajadorMenor := tra[i];

for j:= 1 to cantidad do {Bucle anidado busca empleados mayores para comparar salario anual}

if (tra[j].salario > 1500) and (tra[j].sal_anual < trabajadorMenor.sal_anual) then
{trabajador menor gana mas que un trabajador mayor, mostramos sus datos}
begin

writeln();

writeln('Nombre:', trabajadorMenor.nombre);

writeln('Salario Anual:', trabajadorMenor.sal_anual:4:2);

break; {Cerramos bucle anidado, no es necesario seguir buscando para este trabajador Menor}

end;

end;

end;

 
0: { salir}
 
begin
 
WriteLn;
 
WriteLn('Saliendo...');
 
WriteLn;
 
                end;
 
             else
 
                begin
 
WriteLn;
 
WriteLn('Opción incorrecta!');
 
WriteLn;
 
                end;
 
        end;  { Fin de "case" }
 
    until opcion = 0;
 
end.

742
Hola.
Estas lineas que has escrito así:

Código: [Seleccionar]
writeln('tra[i].sum/tra:4:2');
Al ponerlo entre comillas simples, le estas diciendo a Pascal que muestre ese texto tal cual.
Es decir, eso de ahí es un literal, una cadena string, no es ningún tipo de operación aritmética porque está entre las comillas simples.

Supongo que lo pusiste entre esas comillas para evitar otros errores de compilación que tuviste. Y claro, ahora te compila, pero obviamente no va a hacer lo que esperabas.

Por eso además te salen esos warnings de "variables declaradas pero no usadas", porque los nombres de las variables como sum los pones dentro del literal, por lo tanto, en realidad no estás haciendo referencia a esas variables, así que no se están usando.

Otra cosa, para calcular las medias de los cases 7, 8 y 9.... no necesitas distintas variables para acumular, te basta con una.
Lo que si necesitarás, es otra variable para contar cuantos trabajadores has acumulado su media. O sea, un contador integer que se vaya incrementando de 1 en 1 cada vez que acumules un salario.

Por ejemplo, para la nomina menor, los que son menos de 1500.
Recorres trabajadores y preguntas si su salario es menor que 1500.
En caso afirmativo, acumulas su salario, y además, tienes que aumentar el contador en 1

Terminado el bucle, divides lo acumulado por el contador, y así obtendrás la media.

Otra cosa que no me queda clara es que para acumular, a unos les coges el atributo .sal_anual y a otros .sal_anu

Como no tengo el enunciado del ejercicio, no se si es por algún motivo. A mi me parece más lógico coger el salario tal cual..

Otra cosa que habría que cambiar, los bucles para calcular la media no deberían ir desde 1 hasta capacidad
Porque capacidad es una constante de valor 1000. Si usas este valor para el bucle ocurren dos cosas no deseadas:
1- El bucle se va a repetir siempre 1000 veces, aunque tengas solo 100 empleados, o 50,.. ¡¡o solo 1!!
No es demasiado importante realmente, pero son ciclos de computación inútiles, y no es una buena práctica de programación.

2- Esto si es más importante. En el case 8, buscamos salarios menores de 1500.
Como el bucle va desde 1 hasta 1000 (el valor de capacidad), las posiciones del array donde NO HAY trabajadores registrados, es decir, que en teoría están vacías... en realidad sí que hay datos. Hay variables tipoPersona creados automáticamente por el compilador con todos sus atributos con valor 0.
Entonces, esos tipoPersona que en realidad no ha registrado el usuario, el sistema los va a contar como empleados con salario < 1500 y va a provocar un error al calcular la media.
Ya que aunque registres un único trabajador y con sueldo < 1500, el programa va a considerar que en realidad hay 1000 trabajadores que cumplen esa condición . Cuando en realidad 999 trabajadores son "falsos" tipoPersona.

Para evitar estos problemas, los bucles tienen que ir hasta el valor de la variable cantidad, en lugar de capacidad.
Así el bucle solo recorre posiciones donde realmente hay trabajadores registrados.

Mira, he reescrito el código cambiando estas cosas que he dicho.
He cambiado las variables declaradas.
Y he cambiado los cases 7, 8 y 9 para que calcular la media según he explicado.
Y hacemos uso de la variable cantidad, en lugar de capacidad, para recorrer el array.
Además he hecho que cantidad decremente cuando borramos a un trabajador.

Si pruebas este código que pongo abajo, verás que compila y funciona.
Repasa línea a línea, comprueba que entiendes todo y comprueba que cumple con lo que se supone que debe hacer el programa según el enunciado.
No he revisado todo el código a fondo. El resto parece funcionar bien, aunque hay algo que me resulta un poco extraño.
Al añadir un trabajador, en la línea 119 se inicia un bucle que recorre a todos los trabajadores y altera sus atributos según el valor de su salario.
¿Por qué alterar TODOS los trabajadores cada vez que añadimos UN trabajador?

Revisa esa parte, a ver si realmente tiene sentido o no.

Un saludo.


Código: [Seleccionar]
program ACME;
 
type
 
    tipoPersona = record
 
        nombre: string;
 
        salario: real;
 
sal_anu: real;
 
sal_anual: real;
 
sal_men: real;
 
sal_mensual: real;
 
utili, utilidades, vaca, vacaciones: real;
 
bono: real;
 
cedula :integer;
 
    end;
 
const
 
capacidad = 1000;
 
var
 
tra: array[1..capacidad] of tipoPersona;
 
    cantidad: integer;
 
    opcion: integer;
 
    i: integer;
 
    textoBuscar: string;
 
    encontrado: boolean;
 
bono: real;
 
cesta: integer;
 
seBorro:boolean;
 
acumMedia :real;
 
contMedia: integer;
 
 
 
 
 
{Cuerpo del programa principal}
 
begin
 
cantidad := 0;
 
    repeat
 
        WriteLn('***BIENVENIDO A ACME***');
 
        WriteLn;
 
        WriteLn('1- Agregar Trabajador');
 
        WriteLn('2- Todos los trabajadores');
 
        WriteLn('3- Buscar a un trabajador');
 
        WriteLn('4- Reporte 1');
 
        WriteLn('5- Reporte 2');
 
WriteLn('6- Eliminar trabajador');
 
WriteLn('7- Promedio Nomina Mayor');
 
WriteLn('8- Promedio Nomina Menor');
 
WriteLn('9- Promedio General');
 
        WriteLn('0- Salir');
 
        Write('Escoja una opcion: ');
 
        ReadLn(opcion);
 
        WriteLn;
 
 
 
        case opcion of
 
1: { Agregar trabajador }
 
if (cantidad < capacidad) then
 
                begin
 
inc(cantidad);
 
                    WriteLn('Introduciendo al trabajador ', cantidad);
 
                    Write('Introduzca el nombre: ');
 
                    ReadLn(tra[cantidad].nombre);
 
                    Write('Introduzca Salario: ');
 
                    ReadLn(tra[cantidad].salario);
 
for i:=1 to cantidad do
 
begin
 
if tra[i].salario > 1500 then begin
 
with tra[i] do begin
 
bono:=tra[i].salario*0.1;
 
utilidades:=tra[i].salario*2;
 
vacaciones:=tra[i].salario;
 
sal_mensual:=tra[i].salario+tra[i].bono;
 
sal_anual:=tra[i].sal_mensual*12+tra[i].vacaciones+tra[i].utilidades;
 
end;
 
end;
 
if tra[i].salario <= 1500 then
 
begin
 
cesta:=20;
 
with tra[i] do begin
 
vaca:=salario;
 
utili:=salario*4;
 
sal_men:=salario+cesta;
 
sal_anu:=sal_men*12+tra[i].vaca;
 
end;
 
end;
 
end;
 
end;
 
            2: begin {Todos los trabajadores}
 
if cantidad = 0 then
 
WriteLn('No hay datos')
 
else
 
for i := 1 to cantidad do
 
WriteLn(i, ' ', tra[i].nombre, tra[i].salario:4:2);
 
WriteLn;
 
end;
 
            3:  {Buscar a un trabajador}
 
                begin
 
Write('Escriba el nombre del trabajador ');
 
ReadLn( textoBuscar );
 
encontrado := false;
 
for i := 1 to cantidad do
 
if pos (textoBuscar, tra[i].nombre) > 0 then
 
begin
 
encontrado := true;
 
WriteLn( i,' - Nombre: ', tra[i].nombre,', Salario: ', tra[i].salario:4:2);
 
end;
 
if not encontrado then
 
WriteLn('No se ha encontrado.');
 
WriteLn;
 
                end;
 
            4:  {Reporte 1 }
 
for i := 1 to cantidad do
 
                begin
 
if tra[i].salario > 1500 then
 
begin
 
writeln('Nombre del trabajador: ', tra[i].nombre);
 
WriteLn('Salario: ', tra[i].salario:4:2);
 
WriteLn('Bono: ', tra[i].bono:4:2);
 
WriteLn('Total: ', tra[i].sal_mensual:4:2);
 
end;
 
                end;
 
            5: { Reporte 2}
 
for i := 1 to cantidad do
 
                begin
 
if tra[i].salario <= 1500 then
 
begin
 
writeln('Nombre del trabajador: ', tra[i].nombre);
 
WriteLn('Salario: ', tra[i].salario:4:2);
 
WriteLn('Cestaticket: ', cesta);
 
WriteLn('Total: ', tra[i].sal_men:4:2);
 
end;
 
                end;
 
            6: {Borra un trabajador}
 
begin
 
write('Nombre a buscar: ');
 
readln(textoBuscar);
 
seBorro := false;
 
for i := 1 to cantidad do begin
 
{ReadLn(tra[cantidad].nombre);}
 
if (textoBuscar = tra[i].nombre) then
 
begin
 
seBorro := true;
dec(cantidad);
 
with tra[i] do begin
 
nombre:='';
 
salario:=0;
 
sal_anu:=0.0;
 
sal_anual:=0.0;
 
sal_men:=0.0;
 
sal_mensual:=0.0;
 
utili:=0;
 
utilidades:=0;
 
vaca:=0;
 
vacaciones:=0;
 
bono:=0;
 
end;
 
end;
 
end;
end;
 
            7: {Promedio Nomina Mayor}
 
begin

acumMedia:= 0;

contMedia:= 0;
 
for i := 1 to cantidad do
 
if tra[i].salario > 1500 then
 
begin
 
acumMedia := acumMedia + tra[i].salario;

inc(contMedia);
 
end;

if (contMedia = 0) then

writeln('No hay empleados con salario mayor de 1500')

else
 
writeln('Promedio Nomina Mayor es: ', acumMedia/contMedia:4:2);
end;
 
            8: {Promedio Nomina Menor}
 
begin

acumMedia:= 0;

contMedia:= 0;
 
for i := 1 to cantidad do
 
if tra[i].salario <= 1500 then
 
begin
 
acumMedia := acumMedia + tra[i].salario;

inc(contMedia);
 
end;

if (contMedia = 0) then

writeln('No hay empleados con salario menor o igual a 1500')

else

writeln('Promedio Nomina Menor es: ', acumMedia/contMedia:4:2);
end;
 
            9: {Promedio general}
 
begin

if (cantidad = 0) then

writeln('No hay trabajadores registrados')

else

begin

acumMedia:= 0;

contMedia:= 0;

for i := 1 to cantidad do

begin

acumMedia := acumMedia + tra[i].salario;

inc(contMedia);

end;

writeln('Promedio general es: ', acumMedia/contMedia:4:2);

end;
end;
 
           0: { salir}
 
begin
 
WriteLn;
 
WriteLn('Saliendo...');
 
WriteLn;
 
                end;
 
             else
 
                begin
 
WriteLn;
 
WriteLn('Opción incorrecta!');
 
WriteLn;
 
                end;
 
        end;  { Fin de "case" }
 
    until opcion = 0;
 
end.


743
Hola.
Tengo Turbo Pascal olvidadísimo, hace como 20 años que estudié algo y tiempo después me puse con Java y ahí me he quedado.
De hecho, al ver tu código me ha salido una lagrimita nostálgica  :'(

Pero viendo el código y el tipo de error, diría que te falta un end; justo antes de la etiqueta 7 del case

Es decir, el begin del case 6 está abierto pero no cerrado.

El case 8 parece que le ocurre lo mismo, falta el end; para cerrarlo.
También le faltaría un end; para cerrar el bucle.
Y un punto y coma a su última sentencia writeln

Citar
writeln('Promedio Nomina Menor es: ' acum/tra[cantidad].nombre:4:2);


Compruébalo y a ver si hay suerte y no salen más errores de compilación.

745
Aprender a programar desde cero / Re:Por donde comenzar
« en: 29 de Febrero 2020, 23:28 »
Hola Fermín.

El primer consejo para comenzar es armarte de paciencia. No porque este mundillo vaya a ser difícil, de hecho no lo es, pero sí es extenso (casi infinito) y requiere tiempo, constancia y dedicación.
Son muchas materias a dominar y las prisas por alcanzar nuestro objetivo puede desilusionarnos, ya que puede pasar bastante tiempo hasta que comencemos hacer cosas avanzadas. Inevitablemente, hay que empezar por lo básico.

Yo empezaría por HTML, CSS y JavaScript, por ese orden.
No hace falta alcanzar la maestría absoluta en esas materias, basta con iniciarse y dominar lo básico. Eso luego ya te permite saber como investigar por tu cuenta para conseguir otros objetivos más elevados.
De hecho, verás que HTML y CSS es sumamente sencillo y en poco tiempo se pueden dominar.
JavaScript puede exigir algo más de esfuerzo

En la web de esta casa tienes disponibles cursos para iniciarte desde cero:

Después de esto, el camino a seguir puede depender según lo que quieras conseguir.
Posiblemente el siguiente paso sería mirarse el curso de PHP

PHP sería el lenguaje que permite (entre otras muchas cosas) que tu página web recoja y actualice información de una base de datos, cosa que seguramente necesitarías para guardar y mostrar resultados de partidos, puntos en la clasificación, etc...

Pero lo dicho anteriormente, paciencia y a empezar desde el principio.

746
Comunidad / Re:Presentacion
« en: 29 de Febrero 2020, 22:49 »
Bienvenido Daniel.

Siente libre de compartir en el foro dudas, conocimientos, comentarios... estás en tu casa  ;)

Un saludo.

747
Hola.
Este if..else.. es innecesario:
Código: [Seleccionar]
if (!encontrado) {
System.out.print(
"Has acertado " + aciertos + " veces y has fallado " + noAciertos + " veces. Eran solución: ");
for (int i = 0; i < numAleatorios.length; i++) {
System.out.print(numAleatorios[i] + ",");
}
System.out.println();
} else {
System.out.print(
"Has acertado " + aciertos + " veces y has fallado " + noAciertos + " veces. Eran solución: ");
for (int i = 0; i < numAleatorios.length; i++) {
System.out.print(numAleatorios[i] + ",");
}
System.out.println();
}

Si te fijas, tanto si encontrado es  false, como si es true, estás haciendo exactamente lo mismo en ambos casos.
Así que no es necesario consultar el valor de la variable encontrado.
A no ser que específicamente quieras variar el mensaje en pantalla según su valor, pero ahora mismo no varía.

Por lo demás, todo parece correcto.

Un saludo.

748
Me alegra haber colaborado.  :D
Muy interesante lo que has montado.
De programación se algo, pero de electrónica nada de nada.

Un saludo.

749
Que raro, a mi me funciona bien.

Parece como si el programa no tuviera permisos de escritura para crear los archivos .cfg.

¿En que directorio/carpeta estás ejecutando el programa? Yo por ejemplo si lo ejecuto desde el mismo escritorio me funciona bien.

También puedes probar a crear tú manualmente los archivos .cfg. En realidad son simples archivos de texto plano.

El archivo config.cfg es un archivo de 10 lineas.
La primera es el tiempo en milisegundos que deseamos.
Las siguientes 9 líneas, son los textos que queremos ir alternando
Citar
3000
Texto1
Texto2
Texto3
Texto4
Texto5
Texto6
Texto7
Texto8
Texto9

Y el archivo ruta.cfg solo contiene una línea, que es la ruta que apunta al archivo txt que queremos modificar.
Por ejemplo:
Citar
C:\Users\orcok\Documents\aeiou.txt

Prueba a crearlos manualmente y que estén junto al archivo .jar ejecutable

750
Hola.
A ver si sirve lo que he hecho.
En el menú Fichero he añadido otra opción de configuración. Al clickarle se abre un formulario con 9 campos de texto para indicar las lineas que se quieren ir mostrando en el archivo de texto.
Estos campos están limitados a 8 caracteres ya que mencionaste que ese era un límite impuesto.

Además hay un selector de tiempo, en milisegundos, para escoger el lapso de tiempo que ha de transcurrir entre cambios en el fichero.
Si queremos 3 segundos, pues lo establecemos a 3000.
Si preferimos 2 segundos y medio, pues a 2500.
Etc..

Estos valores de configuración se guardan en un archivo llamado config.cfg. Así que el programa ejecutable JAR ha de ir acompañado siempre de los archivos config.cfg y ruta.cfg

Adjunto nuevo zip con el ejecutable y los archivos .java para quien quiera ver el código. Por prisas y falta de tiempo, el código está sin comentar y no todo lo bien estructurado que debiera. Pero bueno, si alguien tiene preguntas solo tiene que hacerlas.


Espero que te sea útil, muy interesante lo que muestras en tu vídeo Youtube. Un saludo.

751
Hola.

Sí se pueden cambiar esos textos.
Si te es posible usar una interfaz de desarrollo (IDE) como Eclipse o NetBeans, bastaría con crear un proyecto con los dos archivos .java que puse en el zip y modificar el archivo Cambiador.java, en la parte donde se declaran las lineas String que va a contener el array:
Son las líneas marcadas en negrita:

Citar
   public Cambiador(File f) {
      fichero = f;
      lineas = new String[]{
         "aeioubcd",
         "11223344",
         "abcdefgh",
         "aabbccdd",
         "eeffgghh",
         "iijjkkll",
         "mmnnoopp",
         "qqrrsstt",
         "eeeerree"

      };
      ejecutar = true;
      linea = 0;
   }

Una vez cambiado esas líneas por las deseadas, pedimos al IDE que genere un nuevo archivo .jar y ya está.

Puesto que parece no tienes experiencia con programación y desarrollo Java, lo que se me ocurre es que puedo añadir yo una nueva funcionalidad al programa que hice donde mediante un formulario puedas introducir tú los 9 textos.
De hecho es lo mejor, ya que si en el futuro quieres que los textos vayan cambiando, no tiene sentido tener que estar recompilando el programa cada vez.

A ver si hoy encuentro tiempo y miro de como hacerlo. Un saludo.

752
Hola. He probado el programa y sí funciona. Sin embargo, he hecho unos ligeros cambios para que sea más legible al ojo humano y ahorrar también unas líneas.

Lo que he cambiado es que, para comparar cadenas String, no es necesario que uses variables a las que les asignas los String y luego comparas. No es necesario, puedes comparar directamente las cadenas String, no hace falta meterlas en variables.

Y para declarar la variable user, donde vas leyendo lo que teclea el usuario, no es necesario comenzar asignándole un valor mediante nextLine() si en ese momento no le estas preguntando nada el usuario. Lo declaras como

 String user;

 y ya está, nada más.

Por lo demás, insisto, el programa parece funcionar bien.

Sí sería bueno plantear las opciones al usuario de otra forma más sencilla para él.

Es decir, para que tu programa funcione, por ejemplo el usuario ha de ser capaz de escribir correctamente opciones como:

"Disco duro sólido"

No puede equivocarse en la D mayúscula, no puede equivocarse en los espacios en blanco y no puede fallar al ponerle tilde a la palabra sólido.

Eso es esperar demasiada eficiencia por parte del usuario je je..., es mejor facilitarle las cosas.

Por ejemplo, puedes pedirle que teclee números en lugar de palabras enteras.

En lugar de esperar que teclee bien estos términos y confiar que tus comparaciones tengan éxito:

Código: [Seleccionar]
System.out.println("indica tipo de disco duro: Disco duro mecánico(0€) o Disco duro sólido/ (300€)");
user= pc.nextLine();
if (user.equals("Disco duro mecánico")){
System.out.println("Ha escogido Disco duro mecánico");
}
if (user.equals("Disco duro sólido")){
System.out.println("Ha escogido Disco duro sólido");
precio+=300;
}

Se lo facilitas pidiendo opciones numeradas:

Código: [Seleccionar]
System.out.println("indica tipo de disco duro: (1)Disco duro mecánico(0€) o (2)Disco duro sólido/ (300€)");
System.out.print("Elija entre valores 1 y 2: ");
user= pc.nextLine();
if (user.equals("1")){
System.out.println("Ha escogido Disco duro mecánico");
}
if (user.equals("2")){
System.out.println("Ha escogido Disco duro sólido");
precio+=300;
}

Así reduces las posibilidades de que el usuario se equivoque. Aún así, no se está contemplando que ocurre si el usuario elige opciones no existentes.

Pero esto ya lo irás aprendiendo más adelante, cuando aprendas a usar bucles y la instrucción switch te serás más fácil pedirle opciones al usuario, comprobar si ha escogido opciones válidas y como reaccionar si no lo ha hecho.

Te dejo, el código tal cuál yo lo tengo tras esos ligeros cambios estéticos que mencioné al principio.

Código: [Seleccionar]
import java.util.Scanner;

public class JavaApplication4 {
public static void main(String[] args) {
Scanner pc= new Scanner(System.in);
String user;
int precio=0;

System.out.println("Indica tipo de ordenador: Sobremesa(500€) o Portatil(600€)");
user= pc.nextLine();

if (user.equals("Sobremesa")) {
System.out.println("Ha escogido ordenador de sobremesa");
precio+=500;
}

if (user.equals("Portatil")){
System.out.println("Ha escogido ordenador portatil");
precio+=600;
}

System.out.println("indica tipo de procesador: i3(0€) / i5(200€) / i7(300€)");
user= pc.nextLine();
if (user.equals("i3")){
System.out.println("Ha escogido procesador i3");
}
if (user.equals("i5")){
System.out.println("Ha escogido procesador i5");
precio+=200;
}
if (user.equals("i7")){
System.out.println("Ha escogido procesador i7");
precio+=300;
}

System.out.println("indica tipo de disco duro: Disco duro mecánico(0€) o Disco duro sólido/ (300€)");
user= pc.nextLine();
if (user.equals("Disco duro mecánico")){
System.out.println("Ha escogido Disco duro mecánico");
}
if (user.equals("Disco duro sólido")){
System.out.println("Ha escogido Disco duro sólido");
precio+=300;
}

System.out.println("indica capacidad del disco duro: 250gb(0€) / 500gb (200€) / 750gb (300€)");
user= pc.nextLine();
if (user.equals("250gb")){
System.out.println("Ha escogido usted disco duro de 250gb");
}
if (user.equals("500gb")){
System.out.println("Ha escogido usted disco duro de 500gb");
precio+=200;
}
if (user.equals("750gb")){
System.out.println("Ha escogido usted disco duro de 750gb");
precio+=300;
}

System.out.println("indica tipo memoria ram 8gb(0€): 16gb(200€)");
user= pc.nextLine();
if (user.equals("8gb")){
System.out.println("Ha escogido 8gb");
}
if (user.equals("16gb")){
System.out.println("Ha escogido 16gb");
precio+=200;
}

System.out.println("El precio final es "+precio+" EUROS");
pc.close();
}
}

Y este resultado me da en pantalla:

Citar
Indica tipo de ordenador: Sobremesa(500€) o Portatil(600€)
Sobremesa
Ha escogido ordenador de sobremesa
indica tipo de procesador: i3(0€) / i5(200€) / i7(300€)
i5
Ha escogido procesador i5
indica tipo de disco duro: Disco duro mecánico(0€) o Disco duro sólido/ (300€)
Disco duro sólido
Ha escogido Disco duro sólido
indica capacidad del disco duro: 250gb(0€) / 500gb (200€) / 750gb (300€)
500gb
Ha escogido usted disco duro de 500gb
indica tipo memoria ram 8gb(0€): 16(200€)
16gb
Ha escogido 16gb
El precio final es 1400 EUROS

753
Hola.
Puedo proponer una solución hecha en Java que es con el lenguaje que me apaño un poco bien. Adjunto código y un archivo .jar ejecutable
Puesto que dices que es para un PC con Windows XP, un SO ya descontinuado y sin soporte por parte de Java, el jar lo he compilado para una versión Java de las antiguas.
No se si te funcionará la verdad, no tengo un Windows XP para testearlo.

El programa que he hecho tiene una interfaz muy sencilla. Cuando se ejecute aparece una pequeña ventanita con dos botones: Iniciar y Terminar
Y también con una barra de menú llamada Fichero.

Esta barra de menú es para escoger/crear el fichero txt que quieres modificar. Al clickarle aparece el típico explorador para escoger el archivo o bien crearlo nuevo.

Al crearlo no es necesario que le pongas el texto "aeioubcd". El programa, al iniciar el proceso, siempre empezará escribiendo esa linea e irá pasando por otras.
A no ser que necesites que aunque no se ejecute el programa, ese archivo siempre tenga esa línea. Entonces convendría modificar el programa si es el caso.

Una vez elegido/creado el archivo txt que se va a alterar, la ruta queda guardad en un archivo .cfg para no tener que volver a seleccionarlo cada vez que inicies el programa.
Pero siempre podrás volver a cambiar la ruta si necesitases mover el archivo txt a otra carpeta.

Seleccionado el archivo, ahora se puede pulsar el botón Iniciar y se comenzará a sobrescribir el archivo cada 3 segundos con las líneas que indicaste.

Con el botón Terminar se finaliza el proceso. Y eso es todo.

Adjunto un zip con el código en dos archivos Java y el JAR ejecutable.


Para quien quiera que le explique un poco lo que hecho, pues he creado dos clases.
Una clase JFrame donde se crea el marco, botones y las acciones de estos.

La otra clase es la que se encarga de modificar el fichero de texto e implementa la interfaz Runnable. Esto es interesante porque así puedo crear un hilo de ejecución separado del programa principal que se dedique a eso, a modificar el archivo.

Tiene un array de String con las líneas que tiene que ir escribiendo. Cada tres segundos modifica el archivo con una nueva línea.
Este proceso hago que se repita con un bucle while cuya condición es un boolean al que mediante el botón Terminar, le doy valor false para poner fin al proceso.

Esta clase es así de sencilla:

Código: [Seleccionar]
public class Cambiador implements Runnable{

private File fichero;
private String[] lineas;
private boolean ejecutar;
private int linea;

public Cambiador(File f) {
fichero = f;
lineas = new String[]{
"aeioubcd",
"11223344",
"abcdefgh",
"aabbccdd",
"eeffgghh",
"iijjkkll",
"mmnnoopp",
"qqrrsstt",
"eeeerree"
};
ejecutar = true;
linea = 0;
}

public void setEjecutar(boolean eleccion) {
ejecutar = eleccion;
}

@Override
public void run() {
try {
while (ejecutar) {
BufferedWriter bw = new BufferedWriter(new FileWriter(fichero, false));
if (linea == lineas.length)
linea = 0;
bw.write(lineas[linea]);
linea++;
bw.close();
Thread.sleep(3000);
}
} catch (IOException e) {
mensaje("Error accediendo al archivo TXT","Cambiador");
} catch (InterruptedException e) {
mensaje("Error de ejecución de hilo","Cambiador");
}

}

private void mensaje(String texto, String titulo) {
JOptionPane.showMessageDialog(null, texto, titulo, JOptionPane.WARNING_MESSAGE);
}

}

La otra clase tiene más código porque modela más cosas, pero en realidad tampoco es compleja.

Código: [Seleccionar]
public class CambiaTXT extends JFrame{

private File ficheroTXT;
private JMenu fichero;
private JButton botonIniciar;
private JButton botonTerminar;
private Cambiador cambiador;

public CambiaTXT() {
//Barra de Menu
JMenuBar barra = new JMenuBar();
fichero = new JMenu("Fichero");
JMenuItem setFichero = new JMenuItem("Ruta de Fichero");
setFichero.addActionListener(new AccionEstablecerRuta());
fichero.add(setFichero);
barra.add(fichero);
setJMenuBar(barra);
//Panel y componentes
ficheroTXT = buscarRutaFichero();
botonIniciar = new JButton("Iniciar");
botonIniciar.addActionListener(new AccionIniciar());
botonTerminar = new JButton("Terminar");
botonTerminar.addActionListener(new AccionTerminar());
botonTerminar.setEnabled(false);
JPanel panel = new JPanel();
panel.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));
panel.setLayout(new FlowLayout(FlowLayout.CENTER, 35, 10));
panel.add(botonIniciar);
panel.add(botonTerminar);
setContentPane(panel);
//Configuracion del marco JFrame
setTitle("Cambiar TXT");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
setVisible(true);
}

private File buscarRutaFichero() {
File ruta = new File("ruta.cfg");
if (!ruta.exists()) {//No hay ruta guardada
mensaje("No hay ninguna ruta guardada para el archivo TXT.\nUtilice el menú Fichero"
+ " para fijar una ruta.","Abrir ruta guardada");
return null;
}
else {
try {
BufferedReader br = new BufferedReader(new FileReader(ruta));
String linea = br.readLine();
br.close();
return new File(linea);
} catch (FileNotFoundException e) {
mensaje("No se encontro fichero:\n" + ruta.getAbsolutePath(),
"Abrir ruta guardada");
return null;
} catch (IOException e) {
mensaje("Error de acceso a fichero:\n" + ruta.getAbsolutePath(),
"Abrir ruta guardada");
return null;
}
}
}

private class AccionEstablecerRuta implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser jfc = new JFileChooser();
int seleccion = jfc.showDialog(null, "Escoger archivo TXT");
if (seleccion == JFileChooser.APPROVE_OPTION) {
//Establecemos ruta del fichero
ficheroTXT = jfc.getSelectedFile();
//Guardamos ruta para próximas sesiones
try {
BufferedWriter bw = new BufferedWriter(new FileWriter("ruta.cfg", false));
bw.write(ficheroTXT.getAbsolutePath());
bw.close();
} catch (IOException e1) {
mensaje("Error de acceso a ruta.cfg","Guardar ruta de fichero TXT");
}
}

}
}

private class AccionIniciar implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if (ficheroTXT == null)
mensaje("No hay ningun archivo txt seleccionado","Iniciar Cambiador");
else {
cambiador = new Cambiador(ficheroTXT);
new Thread(cambiador).start();
botonIniciar.setEnabled(false);
botonTerminar.setEnabled(true);
fichero.setEnabled(false);
}

}
}

private class AccionTerminar implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
cambiador.setEjecutar(false);
botonIniciar.setEnabled(true);
botonTerminar.setEnabled(false);
fichero.setEnabled(true);
}
}


private void mensaje(String texto, String titulo) {
JOptionPane.showMessageDialog(null, texto, titulo, JOptionPane.WARNING_MESSAGE);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new CambiaTXT();
}
});
}

}


Espero que sirva. Un saludo.

754
No tengo ninguna experiencia con este tema, me sobrepasa por completo.

Investiga sobre la Java Communications API, debería permitirte comunicarte con la balanza por puerto serie.

Otra cosa distinta es "entender" lo que la balanza comunica, eso como decía el compañero, quizás sea cosa del fabricante quien explique cómo entenderse con la balanza.

755
Hola.
Comienza por una versión simplificada del ejercicio.
En lugar de un rectángulo, haz un programa que haga una línea.
Es decir, pides al usuario que carácter quiere usar para hacer la línea, y que longitud quiere que tenga.

En pantalla saldría algo así:

Citar
Elije carácter: *
Elije longitud: 10

**********

Empieza por resolver eso y muestra aquí el código. Posiblemente, una vez tengas esto empezarás a vislumbrar a como hacer un rectángulo.

Y si no, nosotros te ayudaremos.

756
Primero, solo puedes tener una etiqueta body.

Segundo, el atributo bgcolor solo se pone una vez en la apertura de la etiqueta.

Tercero, el valor para el atributo, el símbolo de la almohadilla --> # ... SOLO se usa para dar un valor hexadecimal, por ejemplo #ff0000
Si usas los nombre predefinidos: red, blue, green.... se pone el nombre tal cuál, sin almohadilla.

Código: [Seleccionar]
<!DOCTYPE html>
<html>
<head>
<title> Aguante la tuk </title>
</head>
<body bgcolor="red">
  la tuk es buena
</body>
</html>

757
Aprender a programar desde cero / Re:AYUDA CON UN EJERCICIO
« en: 02 de Noviembre 2019, 22:57 »
Así pensando rápido, se me ocurre que puedes crear un array de int con el tamaño n que te diga el usuario.
Ese array, por defecto, está lleno de 0.

Pues le preguntas cuántos 1's quiere el usuario mostrar y a continuación lo que haces es meter en ese array tantos 1's como haya indicado el usuario.

Para que sea más interesante, puedes colocar esos 1 en posiciones al azar dentro del array.
Puedes generar int al azar, ente 0 y n (el tamaño del array)
Con cada int generado, lo usas como puntero de posición para el array y preguntas si en esa posición hay un 0 o un 1.
Si hay un 0, metes un 1 y lo descuentas de la cantidad solicitada por el usuario.
Si no hay un 0, es decir, ya hay un 1 de una inserción anterior, pues no haces nada.

Esto lo haces dentro de un bucle hasta que la cantidad de 1's solicitada por el usuario haya llegado a 0.

Luego muestras en pantalla el contenido del array para mostrar la cadena binaria.

El resultado en pantalla sería algo así:

Citar
Indica longitud de la cadena binaria: 10
Indica cuantos 1's ha de tener la cadena: 6

Cadena generada:
1101110100

Aquí te dejo el código que he escrito yo. Lo ideal es que intentes hacerlo tú y si te atascas nos pidas ayuda para completarlo.

Pero si quieres ver el código hecho por mí, es decisión tuya.

Citar
import java.util.Scanner;

public class CadenaBin {

   public static void main(String[] args) {
      
      Scanner teclado = new Scanner(System.in);
      System.out.print("Indica longitud de la cadena binaria: ");
      int longitud = teclado.nextInt();
      System.out.print("Indica cuantos 1's ha de tener la cadena: ");
      int nUnos = teclado.nextInt();
      
      int[] cadena = new int[longitud];
      //La cadena ahora esta llena de ceros, meteremos 1's al azar
      while (nUnos > 0) {
         int pos = (int)(Math.random() * longitud);
         if (cadena[pos] == 0) {
            //Si hay un 0, podemos meter un 1
            cadena[pos] = 1;
            nUnos--;
         }
      }
      //Ya hemos metidos tantos 1 como pide el usuario, mostramos cadena
      System.out.println("\nCadena generada:");
      for (int valor : cadena)
         System.out.print(valor);
      
      teclado.close();
   }

}

758
Hola, creo que no lo estás enfocando bien.

El enunciado dice que ha de "retornar" la posición de la palabra en la frase.

Yo ahí interpreto dos cosas:
1) En realidad lo que hay que hace es un método/función que retorne un valor int.
2) Ese valor int, no es la posición del carácter de la palabra que buscamos, sino la posición de la palabra.

Supón esta frase:
"Esto es una frase para hacer pruebas"
Y esta palabra:
"para"

Esa palabra ocupa la posición 5 dentro de la frase:
1ª es "Esto"
2ª es "es"
3ª es "una"
4ª es "frase"
5ª es "para"
6ª es "hacer"
7ª es "pruebas"

Así que nuestro método/función ha de recibir la frase y la palabra. Y ha de retornar un int con la posición, en este caso, sería el valor 5.

Repito, eso es lo que yo creo entender.
Así que  tendríamos que escribir un programa que tenga y utilice dicha función.

El quid de la cuestión es como resolverá nuestra función esto que nos piden.
Bien, hay una forma muy sencilla si conocemos bien los métodos de la clase String

Uno de sus muchos métodos, es el método split(), quien permite dividir un String en varios String, según el valor que le pasemos entre paréntesis.
En nuestro caso, si le pasamos un espacio en blanco --> split(" "), lo que hará será separar String que contiene la frase, en varios String conteniendo cada uno una palabra de dicha frase.
Estos String nos los devuelve juntos y ordenados en un array de String.
Así que tan solo tendríamos que recorrer el array, comparar cada String con la palabra que buscamos y si alguno coincide, devolvemos su posición + 1.

Si no encontramos ninguna coincidencia, pues devolvemos el valor 0.

Código: [Seleccionar]
public class BuscaPalabra {

public static void main(String[] args) {

Scanner teclado = new Scanner(System.in);
String insertaPalabra;
String insertaFrase;

System.out.println("Dime una frase");
insertaFrase = teclado.nextLine();

System.out.println("Dime una palabra");
insertaPalabra = teclado.nextLine();

System.out.println("Esa palabra está en la posición: " + posicionPalabra(insertaFrase, insertaPalabra));
teclado.close();
}

public static int posicionPalabra(String frase, String palabra) {

//Con split obtenemos un array con todas las palabras separadas
String[] palabras = frase.split(" ");

//Recorremos array, si alguna palabra coincide, esa será la posicion
for (int i = 0; i < palabras.length; i++) {
if (palabras[i].equals(palabra))
return i+1;
}

//si el bucle no ha hecho un return, es que no ha encontrado la palabra
return 0;
}

}

Esto es resolverlo apoyándonos en un método perteneciente a la API de Java.
Es correcto usarlos, pues para eso están.

Sin embargo, cuando estamos aprendiendo probablemente se espera que resolvemos los ejercicios por nuestros propios medios.

Se puede hacer sin usar split(). Es más complejo y engorroso.
Habría que recorrer la frase carácter a carácter, buscar uno que coincida con el primer carácter de nuestra palabra.
Cada vez que encontremos uno, tendremos que comprobar el resto de caracteres a ver si coinciden.
Si coinciden todos, hemos encontrado la palabra. Si no, pues hay que seguir buscando.
Pero, ¿y como sabemos en que número de palabra nos encontramos?
Podemos hacerlo contando los espacios en blanco que podamos ir encontrando.

Es decir, si durante la búsqueda no hemos encontrado ningún espacio en blanco --> (espaciosContados = 0) podemos suponer que estamos en la primera palabra.
Si espacios Contados = 1, seguramente es que estamos ya en la segunda palabra, etc...

Te dejo el mismo programa, pero esta vez con las dos funciones y mostrando en pantalla el resultado de ambas, a ver si coinciden.

Código: [Seleccionar]
public class BuscaPalabra {

public static void main(String[] args) {

Scanner teclado = new Scanner(System.in);
String insertaPalabra;
String insertaFrase;

System.out.println("Dime una frase");
insertaFrase = teclado.nextLine();

System.out.println("Dime una palabra");
insertaPalabra = teclado.nextLine();

System.out.println("Solucion usando split()");
System.out.println("Esa palabra está en la posición: " + posicionPalabra(insertaFrase, insertaPalabra));
System.out.println("----");
System.out.println("Solucion buscando caracteres mediante bucles");
System.out.println("Esa palabra está en la posición: " + posicionPalabra2(insertaFrase, insertaPalabra));
teclado.close();
}

public static int posicionPalabra(String frase, String palabra) {

//Con split obtenemos un array con todas las palabras separadas
String[] palabras = frase.split(" ");

//Recorremos array, si alguna palabra coincide, esa será la posicion
for (int i = 0; i < palabras.length; i++) {
if (palabras[i].equals(palabra))
return i+1;
}

//si el bucle no ha hecho un return, es que no ha encontrado la palabra
return 0;
}

public static int posicionPalabra2(String frase, String palabra) {
//contando espacios en blanco en la frase, podemos suponer en que palabra nos encontramos
int espaciosContados = 0;

/*
* Recorremos cada caracter.
* Si es un espacio en blanco, lo contamos.
* Si es un caracter que coincide con el primer caracter de
* nuestra palabra, habrá que comprobar el resto de caracteres
* a ver si coinciden todos.
*/
for (int i = 0; i < frase.length(); i++) {
if (frase.charAt(i) == ' ') //Es un espacio en blanco
espaciosContados++;
else {
/*
* No es un espacio en blanco.
* Comprobamos si este caracter coincide con
* el primer caracter de nuestra palabra
*/
if (frase.charAt(i) == palabra.charAt(0)) {
//¡¡Coincide!!. Recorremos el resto de caracteres a ver si tenemos la palabra completa.
boolean coincide = true;
for (int j = 1; j < palabra.length(); j++) {
if (frase.charAt(i+j) != palabra.charAt(j))
coincide = false; //¡Oh! Un caracter no ha coincidido, no es nuestra palabra
}
//Si coincide == true, nuestra búsqueda ha finalizado
if (coincide)
return espaciosContados + 1;
//Si coincide == false, no hacemos nada, dejamos que el bucle siga buscando.
}
}
}

//Bucle no ha hecho return, porque no ha encontrado la palabra
return 0;
}

}

Esto nos da este resultado en pantalla:

Citar
Dime una frase
Esta frase es para hacer pruebas
Dime una palabra
hacer
Solucion usando split()
Esa palabra está en la posición: 5
----
Solucion buscando caracteres mediante bucles
Esa palabra está en la posición: 5


Parece que todo es correcto.
Sin embargo, nuestra segunda función es propensa a errores.
Fíjate lo que ocurre si usamos otra frase distinta:
Citar
Dime una frase
El paraguas se usa para la lluvia
Dime una palabra
para
Solucion usando split()
Esa palabra está en la posición: 5
----
Solucion buscando caracteres mediante bucles
Esa palabra está en la posición: 2

¡¡Oh no!!
La segunda función se equivoca, piensa que la palabra "para" está donde está la palabra "paraguas". Menudo error.

Este error se puede corregir, tan solo hay que pedirle a la función que haga una comprobación extra antes de dar por buena la palabra encontrada.
¿Se te ocurre cuál puede ser?

Intenta entender todo el ejercicio e intenta averiguar como corregir este fallo. Si no lo consigues, ya te lo diré.
Un saludo

759
Hola.

No pienses en el TOTAL del ejercicio. Trocéalo en pequeños objetivos y ves completándolo poco a poco.
Por ejemplo, de momento olvídate del resumen final con los promedios y tal.

Simplemente empieza a escribir el código para crear el array con las cinco causas. Ni siquiera te molestes ahora en pensar en cinco causas distintas, por ahora escribe cualquier cosa: Causa 1, Causa 2, Causa 3....

Luego crea la matriz de 5x10 para almacenas las puntuaciones.

A continuación, crea el código para que muestre en pantalla cada una de las cinco causas y pida una puntuación que se guarde en la matriz.

Necesitarás dos bucles.
Uno ha de ir desde 0 hasta 4 para mostrar las 5 causas y pedir el dato que se guardará en la matriz.

Este bucle estará anidado dentro de otro que irá desde 0 hasta 9, para pedir que se puntúen las 5 causas 10 veces, ya que se supone que en la encuesta han de participar 10 personas.

Estos dos bucles te darán los indices donde guardar las puntuaciones en la matriz:
[0,0] [0,1] [0,2] [0,3] [0,4] [0,5] [0,6] [0,7] [0,8] [0,9]
[1,0] [1,1] [1,2] [1,3] [1,4] [1,5] [1,6] [1,7] [1,8] [1,9]
..etc...


No intentes nada más por ahora. Solo céntrate en conseguir esto, pedir las 50 puntuaciones (5x10) y que se guarden en la matriz.

Empieza el código para intentarlo, y lo consigas o no, publícalo aquí y te ayudaremos a completarlo si no lo has logrado.
Así sabremos cuál es tu nivel y también en que lenguaje estás programando, que no lo has dicho, pero intuyo que es C.

Cuando este primer objetivo este completado, entonces puedes pasar a pensar en hacer el resto del ejercicio.

760
Aprender a programar desde cero / Re:Escalera con matriz/ces
« en: 27 de Septiembre 2019, 23:43 »
Te propongo esta solución.

Hay comentarios explicando.
Para rellenar la matriz uso un while y un for anidado. Es lo más lioso del programa, de hecho, no me ha salido a la primera.
Yo empiezo a rellenar por abajo, desde 1 hasta n. Bueno, en realidad va desde 0 hasta n-1, pero le sumo 1 antes de guardar el valor en la matriz.

Tras rellenar la última columna, n se decrementa y así repetimos el proceso en la penúltima columna, solo que ahora va de 1 hasta n-1.
Luego de 1 hasta n-2....

Así hasta llegar a la primera fila, donde solo guardaremos un 1.

El resto de posiciones se quedan con valor 0. Al imprimir en pantalla la matriz, evitamos imprimir los valores 0, así da efecto de escalera.

Código: [Seleccionar]
public class Escalera {

public static void main(String[] args) {
Scanner teclado = new Scanner(System.in);
//Pedimos cantidad de valores
int n;
System.out.print("¿Cuántos valores?: ");
n = teclado.nextInt();

//Creamos matriz
int[][] escalera = new int[n][n];

/*
* Llenamos matriz. Podemos empezar desde abajo
* con un bucle hasta n.
* Cada iteracion n se reduce hasta llegar a 0
* para así recorrer todas las filas desde n-1 hasta 0.
* Para recorrer las columnas usaremos otro varaible
* de un bucle for, que habrá que aumentar en 1 el valor
* de n en cada iteración para que recorra correctamente
* todas las columnas.
*/

while (n >= 0) {
n--;

for (int j = 0; j < n+1; j++)
escalera[n][j] = j+1;
}

/*
* Mostramos la matriz.
* Evitaremos imprimir los valores 0
* que no han recibido valores.
* Esto dará sensación de escalera.
*/


for (int j = 0; j < escalera.length; j++) {
for (int z = 0; z < escalera[0].length; z++)
if (escalera[j][z] != 0)
System.out.print(escalera[j][z]);

System.out.println();
}

teclado.close();

}

}

En pantalla tenemos este resultado:
Código: [Seleccionar]
¿Cuántos valores?: 5
1
12
123
1234
12345

Páginas: 1 ... 33 34 35 36 37 [38] 39 40 41 42 43 ... 50

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".