• Domingo 22 de Diciembre de 2024, 13:03

Autor Tema:  duda con Qbasic  (Leído 5503 veces)

josemartinez1

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
duda con Qbasic
« en: Lunes 2 de Marzo de 2009, 21:58 »
0
hola amigos como estan bueno mi duda es si alguien sabe algo de Qbasic
es que tengo que realisar una nomina de pago en Qbasic solo nexesito el codigo estas son las clases que tengo que entregar

calcular un peso a dolar y un dolar a euro

inventario de un producto

nomina de pago y incluir datos de empleado


calcular el primer semestre de un niño en primaria

interes compuesto
 
estos solo para ejecuarlo en Qbasic y entregar el codigo  al profesol si alguien me puede ayudar lo agradeseria :ouch:  :ouch:  :ayuda:  :ayuda:

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: duda con Qbasic
« Respuesta #1 en: Martes 3 de Marzo de 2009, 05:38 »
0
La buena noticia, es que si, yo conozco Qbasic, QBasic es una versión reducida de QuickBasic que se añadió a los sistemas operativos como un programa interno cuando QuickBasic migró hacia VisualBasic y que se mantuvo hasta la llegada 'básicamente' del XP.

La mala noticia es que no se hacen tareas, sólo se ayuda. Expón el código que tienes y te corrijo tus fallos ó te señalo porqué y donde fallan.

El primer ejercicio es básicamente un asunto matemático por tanto sería suficiente con que el programa tuviera una función y 3 líneas para entrar los datos, moneda origen, moneda destino y cantidad.
El 2º problema se supone que toma un archivo del que se conocen las caracteríciticas, lo abre y a medida que va leyendo va totalizando las existencias sobre una matriz o una estructura, cuando alcanza el final del fichero imprime en pantalla el informe.
El 3º problema es similar al 2ª sólo que se supone que se construye una pequeña 'base de datos' de empleados elaborar la nómina por tanto lo que hace es tratar de localizar cada empleado en la base de datos y de acuerdo a sus datos (cargo, antigüedad) y en conjunto con la base de datos del mes trabajado (que recoge día a días las horas trabajadas por cada trabajador) totalizando las horas del mes elabora el informe donde indica cuantas horas tiene cada trabajador y cual su salario. el preciohora se supone relativo al cargo...
El 4º problema es muy similar al tercero, pero los datos y el nombre de estos cambian.
El problema de cálculo de interés es como el 1º algo básicamente matemático, donde creas una función y unas pocas líneas de entrada de datos.

En los problemas 2ª, 3º y 4º  (y más exactamente en el 3º y 4º) debes previamente elaborar un programa para introducir datos en al menos 2 ficheros uno para mantener los datos del empleado/alumno y otro para mantener los datos diarios del mes en curso para el caso del problema de los empleados) y de ¿los exámenes? del sementre para el caso de los niños de primaria. Este programa por tanto tendría 3 menús: acceso a la BD de Usuarios, Acceso a la DB de Seguimiento y salir. Los dos primeros menús tendrán un submenú, que básicamente incluirá consulta de usuario a través de su nombre completo o identificador, altas , bajas y rectificación de datos. Esto es:
   Al acceder al menú se leen los nombres que se tienen en la base de datos (se supone una lista corta, al principio del fichero separados por un carácter conocido) se cargan en matriz, se presentan en menu un número determinado que quepa en la pantalla  '2 botones' arriba y abajo permite rescribir los n siguientes, anteriores, junto a estos hay un id, para evitar teclaer el nombre completo del usuario.
   el íd sería el equivalente a la posición en la matriz.
   Añadir perfil: se introduce un nombre apellidos y demás datos antes de validar se comprueba que el usuario no exista ya sólo entonces se añade. Al añadir dar respuesta de usuario añadido y regresar al menú.
   Localizar perfil: permite escribir un nombre y contrastarlo en la matriz, Existe el usuario solicitado ?, si existe mostrar actualizar lista mostrada de modo queéster usuario aparezca en la ventana, si no existe nostrar 'no localizado'. si existe además se localizan sus datos en fichero y se exponen en modo sólo lectura.
   eliminar perfil: dado el identificador se localizan los datos de ese usuario en el fichero que actúa de 'base de datos', los registros a partir de él se escriben en la posición de '1 perfil menos', el último perfil se borra (para que no haya duplicados)... también debe localizarse sobre el fichero que mantiene el 'diario' y borrarse/sobrescribirse.
   modificar perfil: cuando se pulsa este menú se solicita el identificador del usuario se localiza en la bd y se expone en la pantalla ahora aparece otro menú especifico que permite variar cada campo + 2 menús (menu= botón=opción) que permite ignorar cambios ( regresa al menú principal) y guardar cambios (la estructura temporal cuyo nombre y apellidos se ha modificado sobrescribe a los datos actuales en la bd, Si asdemás se cambió el nombre y/o los apellidos también debe cambiarse este dato en el archivo de 'diario'.

El menú del archivo que mantiene el diaro de trabajo del mes o los resultados de exámenes semenestrales de los alumnos es similar, por conveniencia en la cabecera del archivo pueden consignarse los nombres de cada trabajador y el número de días trabajado, luego lo demás son 'tablas' que consisten en Mes X y días X, los días son tablas que contienen pares de valores: trabajador= nombrecompletotrabajador ;  horas= xHorasEstedia . Las funciones son obvias deberá poderse consultar tanto las horas concretasde un día específico de un trabajador cono totalizar las horas de un trabajador como totalizar las horas trabajadas en el mes, como localizar el día que más horas se trabajó, etc... (esto último y lo anterior no se solicita en el problema, pero lo anterior puede usarse para verificar al final si la elaboración de la nómina tuvo algún posible error).

Bueno, si no tienes nada hecho ya tienes por donde empezar, pero esto lleva tiempo especialmente en estos lenguajes antiguos. Así que dudo que sea un problema planteado para el fin de semana ni nada similar....

Por cierto en QBasic no existen clases, existen estructuras (type) existen subrutinas (Sub, invocadas como goSub rutina) , exisen funciones Function ó 'Declare FN' (invocadas como simepre) y existen módulos (archivos .bas, invocadas como call modulo) pero nada que se pueda denominar clase.
«Ma non troppo»
----> ModoVacaciones = False<----

josemartinez1

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: duda con Qbasic
« Respuesta #2 en: Martes 3 de Marzo de 2009, 09:27 »
0
10 INPUT "Introduce un número ", x
20 r = x MOD 2
30 IF r = 0 THEN
40 PRINT "El numero introducido es par, porque al dividirlo entre 2, nos da de resto 0"
50 ELSE
60 PRINT "El numero introducido es impar, porque al dividirlo entre 2, nos da de resto 1"
70 END IF

mira esto ejecutalo en Qbasic  es una de las clases que eh echo pero como te digo aun me faltan estas

calcular un peso a dolar y un dolar a euro

inventario de un producto

nomina de pago y incluir datos de empleado


calcular el primer semestre de un niño en primaria

interes compuesto

salu2

josemartinez1

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: duda con Qbasic
« Respuesta #3 en: Martes 3 de Marzo de 2009, 09:29 »
0
i43.tinypic.com/ke6mo9.jpg

aki una imagen pega en el navegador y ese es el resultado del codigo que te digo

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: duda con Qbasic
« Respuesta #4 en: Martes 3 de Marzo de 2009, 12:08 »
0
Cita de: "josemartinez1"
mira esto ejecutalo en Qbasic  es una de las clases que eh echo
QBasic no tiene clases.

Cita de: "josemartinez1"
pero como te digo aun me faltan estascalcular un peso a dolar y un dolar a euroinventario de un productonomina de pago y incluir datos de empleadocalcular el primer semestre de un niño en primaria interes compuesto
Muy bien, pero sigues sin haber puesto nada de las explicaciones que te ha dado nebire. Codifica un poco y luego nos expones.

Ánimo, que nadie nace sabiendo.

josemartinez1

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: duda con Qbasic
« Respuesta #5 en: Martes 3 de Marzo de 2009, 22:43 »
0
bueno viste como resorvi ese codigo?
bueno eso mismo tengo que hacer pero que realise todo esto cheka

calcular un peso a dolar y un dolar a euro

 nomina de pago y incluir datos de empleado

 nomina de pago

inventario de un producto

calcular el primer semestre de un niño en primaria

entiendes?

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: duda con Qbasic
« Respuesta #6 en: Miércoles 4 de Marzo de 2009, 01:17 »
0
Claro que entiendo. Pero aquí nadie te lo va a hacer si no empiezas tú un poco. Ese es otro ejercicio, ¿cierto? Pues ya puedes empezar a hacer algo en cada uno para que te echemos una mano.

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: duda con Qbasic
« Respuesta #7 en: Miércoles 4 de Marzo de 2009, 23:37 »
0
Cita de: "josemartinez1"
10 INPUT "Introduce un número ", x
20 r = x MOD 2
30 IF r = 0 THEN
40 PRINT "El numero introducido es par, porque al dividirlo entre 2, nos da de resto 0"
50 ELSE
60 PRINT "El numero introducido es impar, porque al dividirlo entre 2, nos da de resto 1"
70 END IF

mira esto ejecutalo en Qbasic  es una de las clases que eh echo pero como te digo aun me faltan estas

calcular un peso a dolar y un dolar a euro


salu2

Veamos, si preguntas por unos problemas a qué viene ese código..?
Los números de línea no son necesarios, por favor elimínalos. Los números de línea son etiquetas tal como las que uso de modo alfanumérico en el ejemplo que te adjunto, cuando son alfanuméricas deben llevar 2 puntos tras la etiqueta.

Te resuelvo el problema del cambio de moneda, el resto es bastante más trabajoso y además es un problema que te han planteado de modo que tendrás que pensar en ello...
Seguro que conoces el lenguaje ????

El ejemplo incluye 4 opciones para el menú aparte de la opción de salir.
Código: Text
  1.  
  2. DIM cambio AS SINGLE
  3. DIM pesos AS SINGLE
  4. DIM dolares AS SINGLE
  5.  
  6. cambio = 1.33  ' valor inicial para probar....
  7.  
  8.  
  9. Principal: ' bucle principal
  10.    DO
  11.      GOSUB Menu
  12.      INPUT opcion
  13.  
  14.      SELECT CASE opcion
  15.          CASE 1
  16.             GOSUB DolarPeso
  17.          CASE 2
  18.             GOSUB PesoDolar
  19.          CASE 3
  20.             GOSUB EstablecerCambio
  21.          CASE 4
  22.             GOSUB MostrarCambio
  23.          CASE 5
  24.             END
  25.          CASE ELSE
  26.             PRINT "La opci¢n: "; opcion; " no est  contemplada en el men£... pulse un n£mero del 1 al 5."
  27.      END SELECT
  28.      LOCATE 15, 10: INPUT "...pulse una tecla para continuar...", espera 'espera que se pulse una tecla permitiendo mientras ver el resultado
  29.    LOOP WHILE opcion <> 5
  30.  
  31. END
  32.  
  33.  
  34. Menu:  'Men£ principal
  35.   CLS
  36.   LOCATE 2, 10: PRINT "Elija una de las opciones siguientes (1-5):"
  37.  
  38.   LOCATE 4, 15: PRINT "1 - Cambiar de D¢lar a Pesos"
  39.   LOCATE 5, 15: PRINT "2 - Cambiar de Pesos a D¢lar"
  40.   LOCATE 6, 15: PRINT "3 - Establecer un nuevo tipo de cambio."
  41.   LOCATE 7, 15: PRINT "4 - Mostrar el cambio actual."
  42.   LOCATE 9, 15: PRINT "5 - Salir del programa."
  43. RETURN
  44.  
  45. PesoDolar:
  46.    INPUT "Cuantos pesos desea cambiar a d¢lares: ", pesos
  47.    PRINT "El cambio de "; pesos; " pesos a d¢lares es: "; (pesos * (1 / cambio))
  48. RETURN
  49.  
  50. DolarPeso:
  51.    INPUT "Cuantos d¢lares desea cambiar a pesos: ", dolares
  52.    PRINT "el cambio de "; dolares; " d¢lares a pesos es: "; (dolares * cambio)
  53. RETURN
  54.  
  55. EstablecerCambio:
  56. cambiar:
  57.    CLS :
  58.    LOCATE 5, 10: PRINT "El cambio de 1 dolar equivale actualmente a "; cambio; " pesos"
  59.    LOCATE 6, 10: INPUT "Establezca el valor del nuevo cambio: ", nuevocambio
  60.  
  61.    IF nuevocambio < 1 THEN
  62.      DO
  63.         LOCATE 10, 2: INPUT "Est  seguro que 1 d¢lar vale menos que 1 peso (s/n).", resp$
  64.      LOOP WHILE resp$ <> "s" AND resp$ <> "n"
  65.  
  66.      IF resp$ = "n" THEN GOTO cambiar
  67.    END IF
  68.    cambio = nuevocambio
  69. RETURN
  70.  
  71. MostrarCambio:
  72.    CLS
  73.    LOCATE 4, 10
  74.    PRINT "El cambio actual es 1 d¢lar = "; cambio; " pesos."
  75. RETURN
  76.  
  77.  

Si no eres capaz de entender el código (que es bastante simple), dudo que seas capaz de resolver el resto de problemas que son más complejos....
Tampoco entiendo que clase de profesor te enseña este basic arcaico, el saber no ocupa lugar pero puestos a aprender sería más útil algo más actualizado, creo yo....
p.d.: los símbolos raritos que aparecen son tildes que traídos del entorno no traduce correctamente, como están en las cadenas de texto y no en las palabras clave, no importa...
«Ma non troppo»
----> ModoVacaciones = False<----

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: duda con Qbasic
« Respuesta #8 en: Jueves 5 de Marzo de 2009, 10:45 »
0
"Est  seguro que 1 d¢lar vale menos que 1 peso (s/n)."  :D  :lol:

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: duda con Qbasic
« Respuesta #9 en: Viernes 6 de Marzo de 2009, 09:38 »
0
Je,je,je...  :D
... era una excusa para ilustrarle un ejemplo de como controlar condiciones en medio del meollo....

Tú crees que veremos algunas líneas de 'su código' ...?  B)
«Ma non troppo»
----> ModoVacaciones = False<----

adrianes

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: duda con Qbasic
« Respuesta #10 en: Lunes 8 de Junio de 2009, 01:19 »
0
hola nebire mm oie una duda muy grande mira pues  yo tengo principios de programaciion en mi escuela de trabajo final ya me pideron unos programas pero mira dejo unos cuantos programas pero 2 de ellos no les entiendo osea ya ise mi codigo y todo y no me corren te pido ayuda a ti por q mi maestro nunk nos explico como hacer y pues como sabes en mexico uvo un virus de influenza y nos paso a fregar a todos y perdimos mucho tiempo de clase me gusta mucho programar pero tiempo ya no hay por eso recurro a tu ayuda aca te van mis programas y me corriges en caso de star mal
  ahah xD el lenguaje es q basic
1.-que la computadora lea un texto y vaya diciendolo por la bocina del cpu(speaker)(ingeniosa)

10 OPEN "A" , #1, "C:borra.txt"            
20 INPUT "Nombre ", n$
30 INPUT "Edad ", e$
40 WRITE #1, n$, e$                              
 50 CLOSE #1


55 OPEN "I", #1, "C:borra.txt"          
60 FOR n = 1 TO 20
70 IF EOF(1) GOTO 200
80 INPUT #1, a$, b$                                
90 PRINT a$, b$
100 NEXT n
200 CLOSE #1
210 END

ya lee el archivo pero no lo reproduce el sonido y no se como hacerle

2.- hacer control de cobranza  e inventario  ese no le entiendo nada porfavor te pido tu orientacion   yo se q nadie sta para hacer tareas pero solo ocupo una orientadita  de antemanio gracias pero respuesta

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: duda con Qbasic
« Respuesta #11 en: Miércoles 10 de Junio de 2009, 03:07 »
0
Antes de atender a tus preguntas, quería hacerte algunas aclaraciones.

1º QBasic es un QuickBasic venido a menos, es decir es una versión simplificada de la versión Quickbasic 4.5 . QBasic sólo tiene un mérito y es que se entregaba con el S.O. win-98, win-200 win-ME y no recuerdo si venía también con el win-95. Esto se hizo a raíz de que cuando cesó el desarrollo de QuickBasic se inició la versión 1 de Visual Basic (bueno no exactamente, pero los detalles no importan tanto).
Entonces si ni ya el quickbasic precisaba numerar sus instrucciones allá por el año 90 (año arriba, año abajo), significa que tampoco lo necesita QBasic que apareció algunos años después(quizás en el 95, no recuerdo ya la fecha exacta), si has leído los mensajes anteriores. La numeración son etiquetas y si bien las etiquetas son muy útiles las etiquetas basada en número lo son menos, especialmente si se etiqueta cada línea. Supongamos que tienes un código con 1000 líneas vas dejando saltos de 10 en 10 (tal como muestras en el ejemplo), bien supongamos ahora que quieres modificar parte del código sobre la linea 100 el resultado es que se añaden 80 líneas de código, bien pués eso supone que tienes que alterar las etiquetas de líneas de código que simplemente no has tocado.

Más aún si tienes algo como goto 1140 y está líneas ha sido 'absorbida' en el código añadido, entonces deberás etiquetarla a la línea que realmente hace referencia, pero si olvidaste hacerlo en el momento adecuado, puede ocurrir que ahora tengas bastante trabajo para buscar que línea era la que recibía el 'salto', por eso utilizar etiquetas de texto es bastante más útil. decir goto ContarUnidades no requiere tener que cambiar la etiqueta si añades líneas...

Para los que no lo sepan, decirles que en VB 6.0 podemos utilizar igualmente las etiquetas y numerar así cada línea del código... pero espero que a nadie se le ocurra hacerlo a no ser que sea sólo por probar...

2º qué edad tiene tu profesor y vosotros ?. No me imagino que razones lleva a un profesor a enseñar a sus alumnos QBasic, después de todo es un lenguaje de 16 bits, por lo menos Visual Basic 6 es un lenguaje de 32 bits, y es lo menos que se debería enseñar, en fin me gustaría conocer las razones... sabiendo edades quizás pueda hacerme alguna idea...

Bueno, pasando a tus cuestiones...
El altavoz del computador requiere mucho código para producir un código que permite 'hablar texto', de hecho yo lo desestimo. La voz humana es un conglomerado de frecuencias donde se intermezclan el tono, el timbre, el tempo etc...
Puedes intentar algo que permita ser 'reconocido' como voz pero con bastante trabajo. En cualquier caso necesitarás muchos conocimientos sobre el lenguaje, QBasic no tiene todos las intrucciones que tiene QuickBasic, por lo que para empezar creo que algunas instrucciones que luego te expondré posiblemente no las reconozca.

Un modo en que podrías acercarte a ello sería grabar tu voz en el computador, por ejemplo utilizando la grabadora de windows, grabando cada letra y luego analizarla desde un programa de edición y/o retoque de música, viendo el espectro en WAV, puedes ver que frecuencias utiliza cada letra, su tempo, etc... Ahora bien excepto las vocales el único modo de grabar otras letrás será dentro de una palabra y cortarlas juiciosamente. Una alternativa más cómoda pero probablemente menos viable es grabar todas las sílabas que tiene el español y analizando el espectro descomponer y obtener el patrón para cada una de ellas, el probelma es que si bien las letras son un puñado, las sílabas posibles son miles, por lo que el trabajo sería enorme. Tratar de implementar funciones que pronuncien una sola letra cada vez será laborioso (pero posible), sin embargo concatenar los sonidos de una y otra letra después resulta más pobre que si se hiciera sobre sílabas...

QBasic utiliza la instrucción Sound  para producir sonidos por el altavoz, su uso es equivalente a la API BEEP del VB 6.0  es decir
Sound frecuencia, duracion
frecuencia es un valor entre 37 y 32767 . Las frecuencias menores de 37 interaccionan con la electricidad de los mensajes del cerebro y por tanto están prohibidas y en la práctica frecuencias por encima de 12000-15000 son inaudibles para el ser humano (he observado muchas veces que las frecuencias entre 15000 y 20000 producen molestias a los gatos y perros)
La duración hay que interpretarla. la base de tiempo se estableción en 18'2 tics por segundo, por tanto  debes hacer una regla de 3 para que la duración sea la esperada. (el beep de VB usa duración en milisegundos y la frecuencia tiene las mismas consideraciones que aquí)

Sin embargo con sound no vas a hacer mucho, se utilizó masivamente para producir sonidos en los juegos (el resto de programas era prácticamente mudo), hasta que empezaron a aparecer tarjetas de sonido.

Para lograr algo, necesitas utilizar la instrucción Play, ahora mismo no recuerdo si QBasic la incluye. De hecho yo te propondría que si realmente quieres hacer el programa te busques e instales una copia de QuickBasic 4.5 Creo que es abandonware, por lo que por emule seguro que encuentras alguna copia.  

Mañana que encuentre un hueco, preparo un sencillo código que puedas usar como ejemplo y tomarlo como punto de partida si te apetece....
Ahora sólo te ofrezco un código equivalente a lo que tienes pero eliminado idioteces... del mismo.
Código: Visual Basic
  1.  
  2. DIM n AS STRING
  3. DIM e AS INTEGER
  4.                                                                                                                                                  
  5.     OPEN "A", #1, "C:borra.txt"                                                
  6.         INPUT "Nombre del sujeto: ", n                                                          
  7.         INPUT "Edad del sujeto: ", e                                                            
  8.         WRITE #1, n, e                                                              
  9.     CLOSE #1                                                                                                                                                                                              
  10.                                                                              
  11.     OPEN "I", #1, "C:borra.txt"                                                
  12.         CLS ' borra la pantalla                                                      
  13.                                                                              
  14.         DO WHILE NOT EOF(1)                                                          
  15.             INPUT #1, n, e                                                            
  16.             PRINT n, e                                                                                                                                                                                                
  17.         LOOP                                                                                                                                                  
  18.     CLOSE #1                                                                    
  19. END        
  20.  
  21.  
Nota: las cadenas en el fichero se escriben entrecomilladas, si describimos la edad como entero el resultado es muy parecido pero no está entrecomillado. cuando se escribe a fichero usando Write, separa cada campo mediante comas. esto es así incluso en vb 6.0
«Ma non troppo»
----> ModoVacaciones = False<----

adrianes

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: duda con Qbasic
« Respuesta #12 en: Jueves 11 de Junio de 2009, 03:28 »
0
mm si muchas gracias nebire ahora volviendo a esto mi profesor tiene mm como 65 años el nos dijo q para ser buen programador se comienza desde 0 y nos dijo q si aprendiamos a usar q basic  era la base para comenzar a programar en c++
y con respecto alas etiquetas pues no me habia dado cuanta en cuanto a los comandos y las atiquetas el profe me dijo = q olvidara lo de 10 20 30 por q despues en programas mas complejos se podria venir un catastrofe y seria mejor repetir el programa q arreglarlo  en cuanto al sonido el profe no nos quizo decir como nos dijo algo de q usaramos una tabla y usaramos el comando  sound 2000,2  pero aun sigo sin saver q onda y pues me gustaria saber  ya que tengo unos proyectos
que quiero terminar

de ante mano gracias y spero una respuesta..

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: duda con Qbasic
« Respuesta #13 en: Jueves 11 de Junio de 2009, 06:59 »
0
Cita de: "adrianes"
mm si muchas gracias nebire ahora volviendo a esto mi profesor tiene mm como 65 años el nos dijo q para ser buen programador se comienza desde 0 y nos dijo q si aprendiamos a usar q basic  era la base para comenzar a programar en c++
y con respecto alas etiquetas pues no me habia dado cuanta en cuanto a los comandos y las atiquetas el profe me dijo = q olvidara lo de 10 20 30 por q despues en programas mas complejos se podria venir un catastrofe y seria mejor repetir el programa q arreglarlo  en cuanto al sonido el profe no nos quizo decir como nos dijo algo de q usaramos una tabla y usaramos el comando  sound 2000,2  pero aun sigo sin saver q onda y pues me gustaria saber  ya que tengo unos proyectos
que quiero terminar

de ante mano gracias y spero una respuesta..

Aprovechando que he ido al baño y que me he desvelado... te coloco un par de códigos. Ahora bien, después de la explicación que me has dado acerca del profesor, creo que se conformará con algo bastante, bastante, bastante más sencillo especialmente si te especifica que uses el comado sound, cualquier parecido con la realidad requiere mucha imaginación para que sea tomado como voz...

Primero vamos a hacer que suene algo, te explico que significa cada cosa de las que usamos, in situ.
Código: Visual Basic
  1.  
  2. ' para empezar algo sencillo
  3.  
  4. ' definimos una 'cadena' de sonido:
  5. dim p as string
  6.    p = "ACDAEFAEGABCD" ' las notas musicales Do,Re,Mi,Fa... están asociados a las letras que van de la A a la G,
  7.     ' para no tener que calcular escribe en un papel las notas y debajo de cada una la letra equivalente, así traducir es muy fácil... como hago aquí
  8.    ' esto es : DO RE MI FA SOL LA SI
  9.   '                 A  B    C  D   E     F  G
  10.     ''por tanto esta cadena es nuestra partitura: Do Mi Fa Do sol La DO SOL SI DO RE MI FA , que produce un sonido como de 'espera'...
  11.  
  12.    PLAY "O0 L12"   ' SELECCIONAMOS UNA OCTAVA  (Octave 0 cero) Y LA DURACIÓN (Length 12) DE LAS NOTAS
  13.    
  14.    CLS : LOCATE 1, 1: PRINT "Pulsa  s para salir."
  15.    DO
  16.       PLAY "X" + VARPTR$(P)  ' aquí le damos la orden de tocar (eXecute) las notas definidas en la direccion de meoria que le corresponde a la variable p
  17.      PLAY "P4"          ' hacemos una pausa (Pause de 4)
  18.    LOOP   WHILE INKEY$ <> "s"    ' repetimos hasta que se pulse la tecla s (minúscula)
  19.    END   ' finaliza el programa
  20.  
  21.  
Si quitas los comentarios verás que el código es en realidad muy breve
Ahora que ya conoces la ´correspondencia de notas - letras voy a localizar alguna pequeña partitura por google y 'traducirla' al comando play (lo que vamos a buscar es algo así como 'Cancones para faluta' o cadenas específicas como 'Re Mi Sol'

Misión imposible: mi mi sol la mi mi _ re re mi mi sol la  _ mi mi re MI  habrá que jugar con el tempo y pausas para que se parezca lo más posible
m = "CCEFCC BBCCEF CCDC" No suena muy bien porque con faluta tu vas dejando los tiempos y duración de nota precisos, es es lo que falta añadir al comando. Como no soy músico te lo dejo  ligeramente modificado, para que te ilustre en el proceso de como debe hacerse:
M = "L10 O0 CP32 CP32 L12 EFP32 L10 o0 Cp32Cp20 BBCCEFp20 CCDC"
como ves sólo he añadido metacomandos que ya conoces Ln On y Pn
para probarlo copia la cadena dentro del ejemplo anterior y sustituye en ' + Varptr$(p) por  + Varptr$(m)
si previamente has probado con 'm = "CCEFCC BBCCEF CCDC"' verás que ya ha ganado un poco más para que suene como lo reconocemos...

Ahora te pongo un ejemplo para usar de modo asíncrono el play de modo y te comento in situ el código...
Código: Visual Basic
  1.  
  2. ' definimos un evento play, al caso le estamos indicando que cuando queden 3-1 notas en el buffer vaya a la etiqueta indicada
  3. ON PLAY(4) GOSUB SuenaSeleccionA
  4. 'Ahora activamos la caza del evento  (on play... es una declaración de evento)
  5. PLAY ON  ' cuando queramos podemos hacer un play off y un play stop
  6.  
  7. dim Elisa as string
  8. ' nuestra partitura 'Para Elisa', las notas musicales son las letras: EDEDBCA
  9.  Elisa = "o3 L8 E D+ E D+ E o2 B o3 D C L2 o2 A"  ' el + ó si fuera el - indica que esa nota se usa con una octava mayor que la actual pero sin cambiar de octava (sólo para esa nota).
  10.  
  11. PLAY "MB X" + VARPTR$(Elisa$)
  12.  
  13. CLS: LOCATE 1, 5: PRINT "Cuando pulses una tecla paramos.";
  14. DO WHILE INKEY$ = "" : LOOP
  15. END
  16.  
  17. ' rutina que se ejecuta cuando salta el evento. en cualquier momento podemos alterar el valor de Elisa
  18. SuenaSeleccionA:
  19.     PLAY "MB X" + VARPTR$(Elisa)  ' MB es un comando para definir que se ejecute asincronamente, (Music Background)
  20.   ' para ejecutarlo sobre cóodigo se usa MF (Music Foreground) si no se especifica nada se supone MF por defecto.
  21. RETURN
  22.  
  23.  

Detrás de VARPTR$(Elisa) puedes poner más cosas, por ejemplo una pausa de 4 :
PLAY "MB X" + VARPTR$(Elisa)  + "P4"
o mejor aún otra línea de comando,
PLAY "MB X" + VARPTR$(Elisa)  + "P4" + Varptr$(Ponpon)
recuerda que las variables pueden cambiar su valor cuando quieras:
Código: Visual Basic
  1. Elisa1= "lo que sea"
  2. Elisa2="otra cosa"
  3. DO WHILE INKEY$ = ""
  4.      k= (k +1) mod 32767
  5.  
  6.     if k mod 3=0 then
  7.         Elisa=elisa2
  8.     else
  9.        Elisa=elisa1
  10.     end if
  11.  LOOP
  12. END
  13.  

Lo ilustramos haciendo los cambios pertienentes:
Código: Visual Basic
  1.  
  2. ON PLAY(4) GOSUB SuenaSeleccionA
  3. │PLAY ON
  4. DIM Elisa AS STRING
  5. DIM Elisa1 AS STRING
  6. DIM Elisa2 AS STRING
  7. DIM k AS INTEGER
  8.  
  9. │ Elisa1 = "o3 L8 E D+ E D+ E o2 B o3 D C L2 o2 A"
  10. │ Elisa2 = "o2 L7 F E- F E- F o1 C o2 E D L2 o1 B"
  11. │ Elisa = Elisa2
  12. │ PLAY "MB X" + VARPTR$(Elisa)
  13. │ CLS : LOCATE 1, 5: PRINT "Cuando pulses una tecla paramos.";
  14. │  DO WHILE INKEY$ = ""
  15. │      k = (k + 1) MOD 32767
  16. │      ' PLAY OFF
  17. │      IF k MOD 3 = 0 THEN
  18. │          Elisa = Elisa2
  19. │      ELSE
  20. │          Elisa = Elisa1
  21. │      END IF
  22. │      ' PLAY ON
  23. │      ' PLAY "MB X" + VARPTR$(Elisa)
  24. │  LOOP
  25. END
  26. │SuenaSeleccionA:
  27. │    PLAY "MB X" + VARPTR$(Elisa) + "p4"
  28. │RETURN
  29.  
  30.  

Para una descripción completa del comando play consulta la ayuda, en el hipotético caso de que la ayuda que venga con QBasic no lo incluyera o feura ineficaz me lo señalas y te explico cada opción..
Nota: la partitura puede ser en minúsculas mayúsculas indistintamente y puede haber espacios donde quieras, incluídos en medio de cada metacomando por ejemplo: "O4AB-CDDAC" puede ser espaciado así: "O4 A B- C D D A C", ó así: "O4A B- CDDAC" e incluso"O 4..." 4 es una opción de Octava, pero lo lógico es que las separaciones sean porque te ayuden a localizar o entenderlo mejor...

Ahora vamos con sound, como no tiene misterios basta el código (nota que he incluído pausas donde me ha parecido para que diferencies donde acaba un sonido y empieza el de otro bucle:
Código: Visual Basic
  1.  
  2. DIM k AS INTEGER, d AS INTEGER
  3.   CLS : LOCATE 1, 5: PRINT "Cuando pulses la tecla 's' paramos el bucle de 'ambulancia'...";
  4. FOR k = 800 TO 900 STEP ((k MOD 5) + 1)
  5. │    d = k MOD 4
  6. │    SOUND k, d
  7. NEXT
  8.  
  9. DO
  10. │   FOR k = 440 TO 1000 STEP 5
  11. │      SOUND k, k / 1000
  12. │   NEXT
  13. │   FOR k = 1000 TO 440 STEP -5
  14. │     SOUND k, k / 1000
  15. │   NEXT
  16. │   PLAY "p4"
  17. LOOP WHILE INKEY$ <> "s"
  18.    
  19. │   FOR k = 1000 TO 980 STEP -5
  20. │      SOUND k - 40, k / 1000
  21. │      SOUND k, k / 1000
  22. │      SOUND k + 100, k / 1000
  23. │      SOUND k + 20, k / ((k * 2) / 4)
  24. │   NEXT
  25. │   PLAY "p5"
  26.  
  27. │   FOR k = 300 TO 100 STEP -5
  28. │      SOUND k - 40, k / 1000
  29. │      SOUND k, k / 1000
  30. │      SOUND k + 100, k / 1000
  31. │   NEXT
  32. │   PLAY "p8"
  33.  
  34. │   FOR k = 100 TO 37 STEP -5
  35. │      SOUND k, (k * (k / (1 / 100 + 20))) / 100
  36. │   NEXT
  37.  
  38.  
Para lograr con sound algo parecido a voz, tienes que hacer como te indicaba arriba, identificar por lo menos 3 o 4 frecuencias para cada letra, su tempo y tono . Descomponer en un bucle las palabras y hacer llamadas a subrutinas (gosub etiqueta) que tiene las instrucciones sound que puedan asemejarse a sonidos de letras tal como tu puedas apreciar... Para la identificación tendrías que grabar tu voz en WAV (con la misma grabadora de sonidos de windows) y luego con un editor de sonido WAV ver el muestreo de cada letra y sacar conclusiones que puedas traducir a sound, típicamente serán varias frecuencias con una duración muy breve y/o quizás que se repitan en un bucle un determinado nº de veces (por ejemplo para la r)... las rutinas del ejemplo de sound las he seleccionado a propósito para ilustrarte detalles (magnificados en el tiempo) para detalles en principio no posibles con sound pero que puedan asemejar a ecos, reverberación, etc... como hablamos de tiempos muy cortos sería difícil apreciar en los ejemplos, por eso están magnificados en la cantidad de frecuencias y en la duración de las notas.

Ya nos pondrás algún cóodigo de tu progreso.
p.d.: he olvidado quitar las rayitas de los 2 últimos códigos, si coias y pegas el texto deberás eliminarlas manualmente. Si lo transcribes manualmente simplmenete ignora esas rayitas...
«Ma non troppo»
----> ModoVacaciones = False<----