miércoles, 10 de agosto de 2022

Introducción a la programación en C (VI)

 


Declaraciones condicionales


If -Else


C proporciona dos palabras clave para verificar la veracidad de una condición o no. Estas palabras son “if (condición)” - “if else”, “si” la condición entre paréntesis generará 1 (es decir, la condición es verdadera) haz algo “sino” haz otra cosa.



int main() {

int x = 4;

int y = 5;

if (x > y) { // si x > y resultará en VERDADERO

// ingresa dentro de los corchetes

printf (“x es mayor que y“);

}

else {// de lo contrario (FALSO) haz lo que viene después de else

printf (“y es mayor que x“);

}

}


Si la condición if se verifica inmediatamente , una vez que se ejecuta la declaración dentro de sus paréntesis , la declaración else nunca se ejecutará .


Una sentencia if-else también puede estar en la forma sin el else. Esto no quiere decir que el código después del if se interpretará como si hubiera un else. El código después de los corchetes del if es parte del código principal y se ejecutará independientemente.



int principal () {

entero x = 4;

int y = 2;

si (x! = y) {

printf (“x no es igual a y”);

}

// terminó de ejecutar la sentencia if el programa

// continuará su ejecución normalmente

// por lo tanto presta atención a lo que escribes a continuación

printf (“x es igual a y“); // ¡¡ ambigüedad !!

}


También hay una forma contraída sin los corchetes que solo proporciona la ejecución de una declaración para el si y en caso de que también exista para el otro.




int main() {

float a;

float b;

float c;

a = 2.5;

b = 2;

c = 3.33;

if(a > b && b < c)

printf (“a es mayor que b y b es menor que c“);

else printf (“a es menor que b y b mayor que c“);

}



if (condición) - else if (condición) es la forma más compleja y le permite anidar múltiples condiciones. Esta forma se utiliza cuando se desea evitar en la medida de lo posible el manejo de datos incorrectos.


int main() {

float retiro, saldo;

saldo = 1000; // Supongamos que hay 1000 euros en la cuenta

printf("ingrese el valor para obtener n");

scanf("%f", &buscar);

if(retiro > saldo) {

printf("¡Error! No puedes retirar más que el saldo");

}

else if (retiro < 0) {

printf("no puede retirar una cantidad negativa n");

}

else if (retiro < saldo) {

printf("usted ha retirado %f euro n", retiro);

saldo = saldo - retiro;

printf("%f euro permanecen en su cuenta", saldo);

}

}






¡Atención! Poner una declaración if antes de otra puede resultar en errores lógicos graves. De hecho, en este ejemplo bastaba con poner el else if (retiro <0) después del else if (retiro <saldo) que mágicamente, una vez introducido un retiro negativo, nuestra cuenta se habría incrementado en esta cantidad.



Emulador Altirra para Atari de 8 bits


Altirra es el mejor emulador de Atari de 8 bits que hemos visto hasta ahora, para jugar juegos de Atari de 8 bits en una PC con Windows y cuya última versión es la 4.01 (2 de febrero de 2022) y que funciona en Windows 11, Windows 10 y anteriores (32/64 bits), emula Atari 400/800/1200XL/600XL/800XL/65XE/130XE/5200, dependiendo del archivo ROM utilizado y admite archivos de casete CAS, archivos de cartucho BIN y CAR, archivos de imagen de disco ATR, DCM, ATX, XFD y PRO, archivos ROM.

Altirra es un emulador muy completo. Requiere alguna configuración, pero se le brindará una excelente experiencia Atari. También tiene una sección de ayuda muy elaborada.

Altirra viene con su propio sistema operativo, Altirra BIOS, que ofrece un nivel razonable de compatibilidad. Sin embargo, no todas las imágenes de disco o cinta se ejecutarán sin problemas con el BIOS de Altirra. Para obtener la máxima compatibilidad, necesita las llamadas ROM del sistema Atari . Estos son archivos con la extensión .rom. Hay varias versiones de estas ROM disponibles, pero usaremos al menos en las pruebas que se realicen en este blog la ATARIXL.ROM, que es la ROM del núcleo Atari XL/XE.

Sitio web del proyecto https://www.virtualdub.org/altirra.html

The First Project



Estamos a finales del siglo XXI. La tierra está sobrepoblada y la naturaleza es destruida. La gente deja la Tierra por "La Bóveda", una vasta red de diversas estaciones espaciales. La Corporación ReWild posee el ADN de la mayoría de los seres vivos de la Tierra. En The First Project interpretamos a Daniel Draupnir, un empleado de ReWild. Nuestra tarea es rastrear el ADN faltante e introducirlo en la enorme base de datos de ADN de ReWild. 

The First Project es un auténtico juego de aventuras de ciencia ficción para Gameboy desarrollado con el motor GB Studio de Chris Maltby. El juego es una adaptación de un libro francés de ciencia ficción de Teddy Toussaint llamado "Le Premier Projet".

The First Project ofrece una historia increíblemente intensa y bien elaborada. Desde el comienzo del juego hasta el final, literalmente puedes sentir el drama al que estás constantemente expuesto. El juego es constantemente emocionante, ofrece lugares aventureros, te enfrenta a criaturas espeluznantes o te pone a prueba con peligros mortales. El juego se puede descargar aquí https://tedtous.itch.io/the-first-project por 5 euros. Los coleccionistas estarán encantados con una versión física disponible para comprar en Phoenixware https://www.phoenixware.co.uk/product/the-first-project/ por £30.

Introducción a la programación en C (VII)

 




 Instrucción de selección - switch


Con el if hemos visto que este tipo de sentencias no son solo condicionales  sino también de selección . El if-else es un método de selección bidireccional, si una condición no se cumple, ejecuta la otra u otras según el nivel de anidamiento.


Ahora introducimos un método más complejo que es creado por la instrucción de selección “switch”, este tipo de instrucción permitirá, una vez que ocurra un evento, poder seleccionar su instrucción relativa para ejecutar. Podemos considerar el switch como una declaración if con muchos ifs dentro solo con un estilo de representación más mínimo.



switch en C

La instrucción switch tiene la siguiente sintaxis:

switch (variable) {

  case <constante1>: <sentencia1>

  case <constante2>: <sentencia2>

  case <constante_x>: <instrucción_x>

  default: <instrucción_predeterminada>

}

Entonces cuando hay un cambio en una variable podemos canalizar un evento asociado a este cambio en uno de los cases que puede manejar el cambio. Si el cambio no está bloqueado en ninguno de los cases, ejecutará la declaración predeterminada.

#include <stdio.h>

int principal () {

  int variable;

  printf ("ingrese 1 para imprimir <¡Hola mundo!> \ n");

  printf ("ingrese 2 para imprimir <¡Mi nombre es Mario!> \ n");

  printf("insertar 3 imprimir en pantalla la suma de dos enteros ingresados ​​por teclado\n");

    

  printf (">>"); // no importa esta línea, simplemente embellece el código

  scanf ("%d", &variable);

    

  switch (variable) {

            

      case 1: // si el número elegido es 1 hacer este case

          printf("Hola Mundo\n");

          break;

            

      case 2:

          printf("Mi nombre es Mario\n");

          break;

            

      case 3: {

          int a;

          int b;

          printf ("ingrese el valor de a: \n");

          scanf ("%d", &a);

          printf ("ingrese el valor de b: \n");

          scanf ("%d", &b);

            

          b = b + a;

            

          printf ("la suma es igual a:%d\n", b);

            

          break;

      }

            

      default:

          printf ("ingresó una opción no válida \ n");

          break;

  }

}

Dado que el código se está empezando a complicar. Tomemos un momento para hacer una pausa y analizar los puntos más destacados.




    • switch (variable)  El switch es como un controlador, realiza un seguimiento de todos los cambios de una variable. Apenas llega la ejecución de nuestro código a la línea switch ve el valor de la variable entre paréntesis y se lo guarda para poder analizarlo en el código

    • case change_variable:  Después de la palabra clave case  , se debe insertar el valor de la variable para la que se desea desencadenar una acción. dos puntos   :  indica el comienzo del código a ejecutar.

Si el código que desea insertar se compone de varias líneas, debe insertar las llaves después de los dos puntos. Dentro de los paréntesis se puede comportar como si estuviera trabajando dentro de un main.

    • break  Esta palabra clave es muy importante e indica el final de su case . Debe insertarse en la última línea del código de un case y cada case debe tener su propio break. Si intenta deshacer una ruptura, encontrará que su programa nunca saldrá del bloque.

    • default:  cualquier valor de variable no capturado por el case se anulará en el case default.



El uso del switch

Uno de los usos clásicos del switch está relacionado con la creación de menús. Cada programa siempre realiza las mismas acciones: retirar o añadir dinero de una cuenta, sumar o restar... Cada programa tiene su propio conjunto de acciones que el usuario repetirá varias veces al día. Para acceder a estas acciones es importante tener un método de acceso rápido, el switch es la instrucción ideal para tal menester.


Ejemplo: Un programa que automatiza la suma, multiplicación y división entre dos números.

#include <stdio.h>

int principal () {

    char select;

    float x;

    float y;

    

    printf ("<<< Calculadora >>> \ n");

    

    printf("insertar numero:");

    scanf ("%f", &x);

    printf("ingrese el segundo numero:");

    scanf ("%f", &y);

    printf("\n");

    printf (">> Menú multipunto \n");

    printf ("a - Suma dos números \n");

    printf ("b - Multiplica dos números \n");

    printf ("c - Divide dos números \n");

    printf ("insertar opción: \n");

    scanf ("%c", &select);

    

    printf("\n");

    

    swich (select) {

            float resultado;

            

        case 'a':

            printf ("suma los dos números \n");

            resultado = x + y;

            printf ("resultado: %f\n", resultado);

            break;

            

        case 'b':

            printf ("Multiplico los dos números \n");

            resultado = x * y;

            printf ("resultado:%f\n", resultado);

            break;

            

        case 'c':

            printf ("divide los dos números \n");

            resultado = x / y;

            printf ("resultado:%f\n", resultado);

            break;

            

        default:

            printf ("ingresó una opción no válida \n");

            break;

    }

}


Determinar si un número es múltiplo de otro número con C



A veces es importante poder determinar si un número es múltiplo de otro número. Para poder determinarlo inmediatamente, C nos proporciona un método bastante inmediato.

Para determinar cuando x es múltiplo de y en “C”, se utiliza el símbolo de % . Si el número es múltiplo, por ejemplo 4% 2, la operación devuelve como resultado 0 de lo contrario 1.

Esto se debe a que realiza la división entre x e y y si la división no da resto (es decir, tiene resto 0) devuelve 0 en caso contrario devuelve 1.



#include <stdio.h>

int principal () {

    intx = 6% 3;

    printf (“%d \n“, x);

}


Con declaraciones condicionales, podemos comparar cualquier número.



#include <stdio.h>

int principal () {

    intx;

    int y;

    

    printf (“insertar x:“);

    scanf (“% d“, & x);

    printf (“insertar y:“);

    escanear (“% d“, & y);

    

    if (x% y == 0) {

        scanf (“% d es un múltiplo de% d \ n“, x, y);

    }

}

Introducción a la programación en C (V)




Los operadores lógicos

La mayoría de las comprobaciones de una variable se realizan por comparación (si x es diferente de y, entonces realice una operación...). La transposición de una comparación a código se realiza mediante el uso de operadores, algunos tomados del léxico matemático, otros creados ad hoc.

Y si se verifica la igualdad, el programa enviará un mensaje numérico que identifica cuándo la operación fue exitosa o no.

El lenguaje C como mensaje de retorno de una operación lógica utiliza 1 para indicar que la operación es exitosa y 0 cuando es falsa. Esto quiere decir que: cuando escribimos 4 > 2 nuestro programa devolverá el entero 1 como si significara: <¡Sí! 4 es mayor que 2> .

Este sistema se aplica a todos los operadores lógicos y el mensaje devuelto por la operación será manejado a través de sentencias condicionales.

A continuación encontrarás todos los diversos operadores indicados por su simbología, encerrados entre paréntesis, utilizados en C.


Igualdad (==)

La igualdad, como ya se mencionó anteriormente, no se resuelve con el símbolo matemático = (les recuerdo que tiene la función de asignar algo a una variable) sino con el doble igual ==.

Imaginemos que tenemos dos variables x = 4 e y = 4. Decir que x es igual a y es equivalente a decir que x == y o viceversa.


Desigualdad (! =)

De manera similar a lo que vimos anteriormente, x = 5 e y = 3, si dos variables tienen valores diferentes escribiremos que x! = Y.


Mayor y menor (> y <) y Mayor igual y Menor que igual (> = y <=)

Al igual que las matemáticas> y <tienen la misma función en la programación.


Y, O y No (&&, || e!)

Comprenderá mejor estos tres símbolos cuando se traten las declaraciones condicionales. La utilidad de los dos primeros símbolos es para agrupar más operadores, es decir:

x = 5, y = 4 y z = 5 si necesitamos comparar las tres variables a la vez según nuestras necesidades podemos usar && o ||.

¿x es simultáneamente igual a y y z? En código esta expresión (independientemente de cómo preguntemos en c) ¿podemos escribirla como x == y && x == z? . Si una de las dos expresiones a la izquierda oa la derecha de && no coincide, la expresión completa será FALSA. De lo contrario, se deben verificar ambas expresiones.

¿Es x igual a y o a z?  Como antes, el mecanismo es el mismo, solo cambia el símbolo.

x == y || x == z. En este caso, la veracidad de una de las dos expresiones es suficiente para completar la expresión completa.


martes, 9 de agosto de 2022

Los Ordenadores Atari XE

 



Aquí está mi primer ordenador, regalo de una tía que lo retiro en su momento y que aún a dia de hoy conservoen perfecto estado y como uno de mis mayores tesoros. Con el di mis primeros pinitos en el mundo de la programación con el lenguaje Atari Basic que venia ya con un interprete flaseado en la memoria del ordenador y que usaba como sistema operativo. Debo mucho de lo que soy hoy en día a esta maquina, ya que me enseño el camino que queria seguir en mi carrera profesional.

1985 vio el lanzamiento de otro hardware que forma parte de la serie de la familia de 8 bits. Atari 65 XE y 130 XE continuaron con el legado de 8 bits después del lanzamiento de Atari 400 y 800. 130XE es un poco más potente que 65XE, con 128 KB de RAM. No solo eso, sino que además de lo mencionado anteriormente estaba destinado a atraer a una audiencia más amplia que sus predecesores.

Debido a que fue cohetano de otros ordenadores de 16 bits tubo una vida comercial muy corta, aun asi, conto con mas de 4 mill de unidades vendidas en todo el mundo. Cifra no tan mala teniendo en cuenta la eopca que era.

Aunque tuviera una vida comercial tan corta, llego a tener algun que otro titulo que tuvo su nivel para la epoca, como Bruce Lee o Montezuma's Revenge.




El Atari 65XE se basa en una CPU 6502 que funciona a 1,8 MHz. La computadora tiene 24kb o ROM con OS y BASIC y 64kb de RAM. Toda la RAM, ROM, gráficos personalizados, periféricos y otros chips estaban ubicados en el mismo espacio de direcciones. Es posible apagar la ROM, por lo que se puede aumentar la RAM disponible para el usuario. El 130XE por su parte, se diferenciaba en tener 128kb de RAM.


Si... Habeis leido bien... ¡KB de Ram!


Los ordenadores de 8 bits de Atari, tienen más chips personalizados que ZX Spectrum . Estos chips personalizados hicieron que esta computadora fuera imposible de clonar usando una lógica TTL simple. Se depuraron algunos chips: el chip FREDDY (MMU) se clonó y actualizó para manejar aún más RAM.

La principal ventaja contra ZX Spectrum es que la computadora tiene GPU (procesador de gráficos) y sprites de hardware. Además, tiene un hardware de audio más avanzado que el original. El audio son 4 sintetizadores de audio independientes. GPU tiene solo 2 comandos, pero crea algunos efectos de video interesantes. Como cambiar la resolución de la pantalla en la misma pantalla y también permite cambiar la paleta de colores en cada línea de exploración. Esto introdujo el modo HAM (mantener y modificar), más expandido en la computadora Amiga.


Caracteristicas técnicas:

NOMBRE65 / 130 XE
FABRICANTEAtari
ORIGENEE.UU
AÑO1985
TECLADOTeclado de 57 teclas + 5 teclas de función
UPCMOS6502C
VELOCIDAD1,79 MHz
CO-PROCESADORGTIA (video), POKEY (Sonido, I/O), ANTIC (Video), FREDDY (memoria)
RAM130-XE: 128 kb
65-XE: 64 kb
ROM24 KB
MODOS DE TEXTOCinco modos de texto, máximo: 40 x 24
MODOS GRÁFICOS11 modos gráficos, máximo: 320 x 192
COLORES16 colores con 15 niveles de intensidad cada uno
SONIDO4 canales, 3,5 octavas
PUERTOS DE E/SSalida de video compuesto, puerto Cardridge, puerto de expansión,
puerto periférico SIO (cinta, disco, impresora, módem), 2 conectores de joystick
FUENTE DE ALIMENTACIÓNFuente de alimentación externa (1A, 5v cc)



Espero que os haya gustado este articulo y sigáis este blog en redes sociales.

Nos trasladamos

Blogger se nos queda pequeño, así que este blog migra a  jujubegames.com