Ejemplos capítulos 8 y 9

Ejemplo 9.1

Volvamos al ejemplo del capítulo 1, aquél que sumaba dos más dos. Ahora podemos comprobar si el ordenador sabe realmente sumar, le pediremos que nos muestre el resultado:

// Este programa suma 2 + 2 y muestra el resultado
// No me atrevo a firmarlo
#include <iostream> 
using namespace std;

int main()
{
   int a;

   a = 2 + 2; 
   cout << "2 + 2 = " << a << endl; 
   return 0; 
}

Espero que tu ordenador fuera capaz de realizar este complicado cálculo, el resultado debe ser:

2 + 2 = 4

Nota: si estás compilando programas para consola en un compilador que trabaje en entorno Windows, probablemente no verás los resultados, esto es porque cuando el programa termina se cierra la ventana de consola automáticamente, como comentamos en el capítulo 7.
Hay varias opciones para evitar este inconveniente. Por ejemplo, ejecutar los programas desde una ventana de consola, o añadir líneas al código que detengan la ejecución del programa, como cin.get() o system("pause").
Otros IDEs, como Code::Blocks, no tienen ese inconveniente.

Ejemplo 9.2

Veamos un ejemplo algo más serio, hagamos un programa que muestre el alfabeto. Para complicarlo un poco más, debe imprimir dos líneas, la primera en mayúsculas y la segunda en minúsculas. Una pista, por si no sabes cómo se codifican los caracteres en el ordenador. A cada carácter le corresponde un número, conocido como código ASCII. Ya hemos hablado del ASCII de 256 y 128 caracteres, pero lo que interesa para este ejercicio es que las letras tienen códigos ASCII correlativos según el orden alfabético. Es decir, si al carácter 'A' le corresponde el código ASCII n, al carácter 'B' le corresponderá el n+1.

// Muestra el alfabeto de mayúsculas y minúsculas 
#include <iostream>
using namespace std;

int main() 
{ 
   char a; // Variable auxiliar para los bucles 

   // El bucle de las mayúsculas lo haremos con un while
   a = 'A'; 
   while(a <= 'Z') cout << a++; 
   cout << endl; // Cambio de línea 

   // El bucle de las minúsculas lo haremos con un for 
   for(a = 'a'; a <= 'z'; a++) cout << a; 
   cout << endl; // Cambio de línea 
   return 0; 
}

Ejecutar este código en codepad.

Tal vez eches de menos algún carácter. Efectivamente la 'ñ' no sigue la norma del orden alfabético en ASCII, esto es porque el ASCII lo inventaron los anglosajones, y no se acordaron del español. De momento nos las apañaremos sin ella.

Ejemplo 9.3

Para este ejemplo queremos que se muestren cuatro líneas, la primera con el alfabeto, pero mostrando alternativamente las letras en mayúscula y minúscula, AbCdE... La segunda igual, pero cambiando mayúsculas por minúsculas, la tercera en grupos de dos, ABcdEFgh... y la cuarta igual pero cambiando mayúsculas por minúsculas.

Para este problema tendremos que echar mano de algunas funciones estándar, concretamente de toupper y tolower, declaradas en ctype.

También puedes consultar el apéndice sobre bibliotecas estándar en el apéndice C.

Piensa un poco sobre el modo de resolver el problema. Ahora te daré la solución.

Por supuesto, para cada problema existen cientos de soluciones posibles, en general, cuanto más complejo sea el problema más soluciones existirán, aunque hay problemas muy complejos que no tienen ninguna solución, en apariencia.

Bien, después de este paréntesis, vayamos con el problema. Almacenaremos el alfabeto en una cadena, no importa si almacenamos mayúsculas o minúsculas. Necesitaremos una cadena de 27 caracteres, 26 letras y el terminador de cadena.

Una vez tengamos la cadena le aplicaremos diferentes procedimientos para obtener las combinaciones del enunciado.

// Muestra el alfabeto de mayúsculas y minúsculas: 
// AbCdEfGhIjKlMnOpQrStUvWxYz 
// aBcDeFgHiJkLmNoPqRsTuVwXyZ
// ABcdEFghIJklMNopQRstUVwxYZ
// abCDefGHijKLmnOPqrSTuvWXyz 

#include <iostream>
#include <cctype> 
using namespace std;

int main() 
{ 
   char alfabeto[27]; // Cadena que contendrá el alfabeto 
   int i; // variable auxiliar para los bucles 
   // Aunque podríamos haber iniciado alfabeto directamente, 
   // lo haremos con un bucle 
   for(i = 0; i < 26; i++) alfabeto[i] = 'a' + i; 
   alfabeto[26] = 0; // No olvidemos poner el fin de cadena 
   // Aplicamos el primer procedimiento si la posición es 
   // par convertimos el carácter a minúscula, si es impar 
   // a mayúscula 
   for(i = 0; alfabeto[i]; i++) 
      if(i % 2) alfabeto[i] = tolower(alfabeto[i]); 
      else alfabeto[i] = toupper(alfabeto[i]); 
   cout << alfabeto << endl; // Mostrar resultado 
  
   // Aplicamos el segundo procedimiento si el carácter era 
   // una mayúscula lo cambiamos a minúscula, y viceversa 
   for(i = 0; alfabeto[i]; i++) 
      if(isupper(alfabeto[i])) 
         alfabeto[i] = tolower(alfabeto[i]); 
      else 
         alfabeto[i] = toupper(alfabeto[i]); 
   cout << alfabeto << endl; // Mostrar resultado 

   // Aplicamos el tercer procedimiento, pondremos los dos 
   // primeros caracteres directamente a mayúsculas, y 
   // recorreremos el resto de la cadena, si el carácter 
   // dos posiciones a la izquierda es mayúscula cambiamos 
   // el carácter actual a minúscula, y viceversa 
   alfabeto[0] = 'A'; 
   alfabeto[1] = 'B'; 
   for(i = 2; alfabeto[i]; i++) 
      if(isupper(alfabeto[i-2])) 
         alfabeto[i] = tolower(alfabeto[i]); 
      else 
         alfabeto[i] = toupper(alfabeto[i]); 
   // Mostrar resultado:
   cout << alfabeto << endl; 

   // El último procedimiento, es tan simple como aplicar 
   // el segundo de nuevo 
   for(i = 0; alfabeto[i]; i++) 
      if(isupper(alfabeto[i])) 
         alfabeto[i] = tolower(alfabeto[i]); 
		
         alfabeto[i] = toupper(alfabeto[i]); 
   // Mostrar resultado:
   cout << alfabeto << endl; 
   
   return 0; 
}

Ejecutar este código en codepad.

Ejemplo 9.4

Bien, ahora veamos un ejemplo tradicional en todos los cursos de C++.

Se trata de leer caracteres desde el teclado y contar cuántos hay de cada tipo. Los tipos que deberemos contar serán: consonantes, vocales, dígitos, signos de puntuación, mayúsculas, minúsculas y espacios. Cada carácter puede pertenecer a uno o varios grupos. Los espacios son utilizados frecuentemente para contar palabras.

De nuevo tendremos que recurrir a funciones de estándar. En concreto la familia de macros is<conjunto>.

Para leer caracteres podemos usar la función getchar, perteneciente a stdio.

// Cuenta letras 
#include <iostream> 
#include <cstdio>
#include <cctype> 
using namespace std;

int main() 
{ 
   int consonantes = 0; 
   int vocales = 0; 
   int digitos = 0; 
   int mayusculas = 0; 
   int minusculas = 0; 
   int espacios = 0; 
   int puntuacion = 0; 
   char c; // caracteres leídos desde el teclado
 
   cout << "Contaremos caracteres hasta que se pulse '&'" 
        << endl; 
   while((c = getchar()) != '&') 
   { 
      if(isdigit(c)) digitos++; 
      else if(isspace(c)) espacios++; 
      else if(ispunct(c)) puntuacion++; 
      else if(isalpha(c)) 
      { 
         if(isupper(c)) mayusculas++; else minusculas++; 
         switch(tolower(c)) { 
            case 'a': 
            case 'e': 
            case 'i': 
            case 'o': 
            case 'u': 
               vocales++; 
               break; 
            default: 
               consonantes++; 
         } 
      } 
   } 
   cout << "Resultados:" << endl; 
   cout << "Dígitos:     " << digitos << endl; 
   cout << "Espacios:    " << espacios << endl; 
   cout << "Puntuación:  " << puntuacion << endl; 
   cout << "Alfabéticos: " << mayusculas+minusculas << endl; 
   cout << "Mayúsculas:  " << mayusculas << endl; 
   cout << "Minúsculas:  " << minusculas << endl; 
   cout << "Vocales:     " << vocales << endl; 
   cout << "Consonantes: " << consonantes << endl; 
   cout << "Total: " << digitos + espacios + vocales + 
      consonantes + puntuacion << endl; 

   return 0; 
}

Comentarios de los usuarios (42)

Alex Calle Millan
2010-04-04 00:32:45

Buenas, he pensado que sabiendo que en la tabla ASCII, entre minúscula y mayúscula hay 32 carácteres, se podría hacer así para el ejemplo 9.3, así que dejo esto por si a alguien le interesa:

#include <iostream>
using namespace std;
// Codigo que genera el alfabeto alternando
// Entre mayusculas y minusculas
int main()
{
    char letra=\'a\';
    bool sumar=false;
    while (letra<=\'z\')
    {
          if (!sumar) { cout<<char(letra-32); sumar=true; }
          else { cout<<letra; sumar=false; }
          letra++;
    }
    cin.get(); 
}
Alex Calle Millan
2010-04-04 00:35:51

En el código de antes dónde hay las declaraciones de la variable letra se me han colado unas barras :S Si no las quitáis el código no funcionara. Saludos.

wilmer
2010-08-02 01:55:40

el curso me parece bien pero ya instale el compilador Dev-c++ y no me muestra nada en pantalla. el sistema operativo es windows coloso y se instalo sin ningun problema, abre bien

escribo y/o copio el codigo de ejemplos tan sencillo como:

#include <iostream>

using namespace std;

#include <iostream>

using namespace std;

int main()

{

int a;

a = 2 + 2;

cout << \"2 + 2 = \" << a << endl;

return 0;

}

incluso agregando system(\"PAUSA\"); Y LA carpeta

<windows.h> que la contiene. es decir:

#include <iostream>

#include <windows.h>

using namespace std;

int main()

{

int a;

a = 2 + 2;

cout << \"2 + 2 = \" << a << endl;

system(\"PAUSA\");

return 0;

}

se muestra esto en pantalla (cmd):

presione una tecla para continuar..._

nunca muestra nada en pantalla.

¿A que se debe esto?

Steven
2010-08-10 10:24:47

Hola Wilmer,

En primer lugar, es posible que descargaste la versión de Dev-C++ que no trae el compilador MinGW, por lo que no puedes compilar. Asegúrate de que tienes el compilador. También crea un proyecto de Dev-C++, por muy simple que sea el código fuente a compilar.

En cuanto a \'system()\', esta función estándar se declara en <cstdlib>, por lo que deberías #incluir este fichero de cabecera y no el de <windows.h>.

Aaron Mc Resh
2010-08-19 07:35:40

Por favor, contestame, el último comentario que hice hace un mes no fue atendido y esta vez necesito ayuda con los ejercicios 9.3 y 9.4. No entiendo bien cómo funcionan las bibliotecas, las funciones toupper y tolower, y por más que copio los programas en C++ no dan el resultado que tú dices... Ni el programa cuenta caracteres, porque no hace nada, sólo copia lo que escribo y no termina nunca, salvo que cierre... Ni el otro tampoco hace lo que dices que hace, te muestra dos filas, una de mayúsculas y otra de minúsculas... por más que ponga Ctrl+C, Ctrl+V y evite posibles errores de copiado... esos programas de ejemplo no andan.

Ayuda, por favor.

b0ch0n
2010-09-08 20:15:11

Holas!

En el ejemplo 9.3 tal vez no se ve bien porque faltó un else:

   // El último procedimiento, es tan simple como aplicar 
   // el segundo de nuevo 
   for(i = 0; alfabeto[i]; i++) 
      if(isupper(alfabeto[i])) 
         alfabeto[i] = tolower(alfabeto[i]); 
      else////////////////////////////éste else faltaba	
         alfabeto[i] = toupper(alfabeto[i]); 
   // Mostrar resultado:
   cout << alfabeto << endl; 

Wilmer: supongo que ya habrás encontrado tu error, que debo suponer que es de sintaxis:

system(\"pause\");//se escribe pause no pausa

Aaron Mc Resh:

Las bibliotecas no son más que archivos con funciones,macros y demás.

Para poder acceder a una función externa debe estár incluida dicha biblioteca:

#include <ctype.h>

Puedes verlo en:

http://c.conclase.net/librerias/?ansilib=ctype#inicio

Las funciones toupper y tolower sirven para cambiar letras a mayúsculas y minúsculas respectivamente.

Saludos

Maddux
2011-01-05 22:32:21

Hola, soy principiante en el uso del C++. Te hago una consulta sobre el ej 9.4: yo escribo el código, compilo satisfactoriamente y luego lo ejecuto. El problema está en que el programa nunca encuentra la marca de fin de archivo (EOF), por lo cual no termina nunca y no muestra los resultados. Sabrías decirme q pasa??

Salvador Pozo
2011-01-10 15:51:36

Para Maddux:

Pues me gustaría saber qué es lo que pasa. Cuando escribí este programa la primera vez, hace años, al pulsar las teclas de Control+Z el programa interpretaba esta secuencia como EOF, y finalizaba el bucle.

Ahora lo he vuelto a compilar y ya no funciona de ese modo, de manera que lo he modificado. Pierde algo de funcionalidad, pero no deja de ser un ejemplo.

Neil Adams
2011-03-05 23:03:41

Hola!

Estoy intentando hacer un programa en el que pongas un texto y cambie las letras por la siguiente en el alfabeto Ej: a->b b->c...

He pensado en este código:

#include <iostream> 
#include <cstdio>
#include <cctype> 
using namespace std;
int main() 
{ 
   system("color 0a");
   char Code[1001];
   int c=0;
   
   while (c <=1001) {
         Code[c]=0;
         c++;
   }
   
   c=0;
   
   cout << "Introduce el codigo a encriptar" << endl << endl; 
   cin >> Code;
   cout << "" << endl;
   
   while (c<1001) {                   
         while (Code[c] != '0') {
               switch(Code[c]) {  
                               case 'z':
                                    Code[c]='a';
                                    c++;
                                    break;
                               default:
                                       Code[c]=Code[c]+1;
                                       c++;
                                       break;
               }
         }
   }
   
           
   cout << "El codigo encriptado es " << Code << endl;
   system("pause>nul");   
   return 0; 
}

Sale el mensaje correcto, pero después salen símbolos extraños. ¿A que es debido? ¿Podríais corregir mis fallos? Uso Dev

Steven
2011-03-06 20:27:38

Hola Neil,

Te comento acerca de tu código fuente:

- No necesitas <cstdio>, porque no usas ninguna función declarada en este fichero de cabecera. Lo que sí necesitas incluir es <cstdlib>, ya que usas 'system()'.

- No usas ninguna función de <cctype>, pero aconsejo incluirla porque creo que sí necesitarás usar alguna función declarada en ello.

- En el primer bucle 'while', usas 'c' para que sirva de índice en un array de 1001 'char'. Sin embargo, la condición que estableces para el bucle significa que 'c' llegará a guardar el valor de 1001. Esto no es correcto y puede crear errores, ya que los índices válidos para un array siempre empiezan por 0 (cero). Por lo tanto, el índice del último elemento es uno menos que la cantidad total de elementos del array. En tu caso, el índice al último elemento es 1000. Esto lo podemos reescribir así:

while( c < 1001 )
{
  Code[c] = 0;
  c++;
}

La verdad es que para este tipo de tareas, aconsejo usar el bucle 'for', ya que reúne todas las expresiones que sirven para gestionar el bucle en su cabecera. Esto es,

for( c=0; c < 1001; c++ )
  Code[c] = 0;

Esto aclara un poco el código y por tanto se hace más legible.

- La verdad es que no necesitas el primer bucle 'while', ya que sirve para asignar valores conocidos inicialmente a todos los elementos del array, 'Code'. En su lugar, puedes usar la inicialización directamente, ya que vas a asignar ceros. Esto es,

char Code[1001] = { 0 };

El primer elemento es asignado cero y los demás, por defecto, serán ceros.

Como se trata de una cadena de caracteres, también podrías optar por usar la cadena nula:

char Code[1001] = "";

- No tiene sentido mostrar una cadena nula; escribes:

cout << "" << endl;

Simplemente escribe:

cout << endl;

- No tiene sentido mantener dos bucles anidados especialmente al involucrar la misma variable 'c'. Según la lógica del algoritmo, lo que quieres hacer es recorrer la cadena y por cada elemento modificar su contenido. Esto implica que necesitas recorrer el array una sola vez y por tanto necesitas un solo bucle para ello. Ahora bien, tienes dos condiciones, pero un bucle.

La solución es usar el operador && AND para "combinar" lógicamente esas dos condiciones en una para un bucle 'for'.

Sin embargo, cometes un error en la segunda condición. Escribes:

Code[c] != '0'

Esto no es una implementación correcta del diseño. Lo que necesitas hacer es comparar con el carácter nulo: '\0' que viene a ser el número 0 (cero).

Al final, el esquema del código será el siguiente:

for( c=0; Code[c] != 0 && c < 1001; c++ )
{
  ...
}

- Usas un 'switch/case' para la discernir los caracteres. Si sabes de antemano que los caracteres siempre representarán letras en minúsculas, entonces bien está.

Aunque te hago algunas sugerencias acerca del código que has escrito aquí:

+ Acostúmbrate a usar el operador de incremento ++

+ Fíjate que en cualquiera de los dos casos del 'switch', incrementas 'c'. Por lo tanto, esta sentencia debería quedar fuera; no forma parte de la lógica del 'switch', sino del bucle 'while'.

Al final, sería,

switch( Code[c] )
{
  case 'z':
    Code[c] = 'a';
    break;

  default:
    Code[c]++;
}
c++;

Por otra parte, como sólo existen dos casos, podrías usar un 'if/else'.

Espero que todo esto te oriente.

Steven

antony
2011-07-15 10:00:31

bueno tegno ke hacer un programa ke cuente la cantidad de caracteres de una frase y a la vez ke salga x la pantalla en orden inverso por eejemplo

los niños corren

tengo ke contar los caracteres incluido los espacios luego mostrar en orden invertido

sol soñin nerroc

alguien puede ayudarme

mustafak
2011-07-18 01:39:30

yo hice esto

pero no se por que aparece la 'a' en la 2 llamada a funcion ordenador

#include<stdio.h>
#include <iostream>

void ordenador(char ma[27],char mi[27],int c);



char mayusculas[27], minusculas[27];        //declaro cadenas

int main() // funcion main
{
    int a,numerador;// variables de bucles
                                             //asignacion de datos a la cadena
    for(a=1,numerador=65, mayusculas[a];a<=26;numerador++,a++  ){
            mayusculas[a]=numerador;}

    for(a=1,numerador=97, minusculas[a];a<=26;numerador++,a++  ){
            minusculas[a]=numerador;}
     
     ordenador(mayusculas,minusculas,a=1)  ; //llamadas al ordenador
     ordenador(minusculas,mayusculas,a=1)  ; 
     ordenador(mayusculas,minusculas,a=2)  ;
     ordenador(minusculas,mayusculas,a=2)  ;       
   
     system("pause");
return 0;
}

void ordenador(char ma[27],char mi[27],int c)
{
   
int b,a=1;              
           while(a<=26)
                 {
                
                 b=c;
                 
                 while(b<=2)
                 {
                 putchar(ma[a]);
                 a++; b++;
                 }
                 
                 b=c;
                 
                 while(b<=2)
                 {
                 putchar(mi[a]);
                 a++; b++;
                 }
                 }
               printf("\n");  

     return  ;              
}

[\code]

mustafak
2011-07-18 01:41:09

ejercicio 9.3 se me olvido

javicule
2011-08-04 10:10:58

en el ejemplo 9.4, xq no me sirve 'cin.get();' para q al final me deje ver lo q se ha escrito en la ventana de comandos? Sin embargo, e utilizao 'system ("pause > nul")' y sí q funciona

Yeiner Fernández
2011-10-18 03:18:19

Hola, viendo el ejemplo 9.4, no me queda clara la parte en que se obtiene la cadena ingresada por teclado.

Veo la línea:

while((c = getchar()) != '&')

Pero yo esperaba ver algo como "cin << c" o similar.

Me podrían por favor explicar un poco el asunto?

Les agradezco mucho.

Saludos!

Salvador Pozo
2011-10-18 10:50:28

> while((c = getchar()) != '&')

Es sencillo, este bucle lo que hace es leer y procesar los caracteres introducidos por el teclado uno a uno, hasta que se introduzca un carácter '&'.

Lo que probablemente complica la comprensión de cómo funciona es que el sistema operativo interviene en el proceso.

Nuestro programa no recibe los caracteres a medida que tecleamos. En su lugar es el sistema operativo el que los recibe y los almacena en un buffer (almacén) interno. Cuando el usuario pulsa el retorno de línea, el sistema operativo envía el contenido del buffer al programa, y sólo entonces empieza a procesarse nuestro bucle.

Esto permite hacer correcciones, borrar caracteres, moverse a través de la cadena en pantalla, etc.

En sistemas operativos más primitivos no existe ese buffer, y los caracteres son recibidos directamente, y de uno en uno, por el programa. Esto incluye los caracteres no imprimibles, como el de borrar, y los desplazamientos a izquierda y derecha.

> Pero yo esperaba ver algo como "cin << c" o similar.

Si usamos cin para leer caracteres surge un problema, y es que no podemos usar una única expresión para verificar si el carácter leído es '&' y leer al tiempo. Pero por supuesto, sería igualmente válido.

Yeiner Fernández
2011-10-20 05:05:08

Gracias Salvador, es Ud muy amable en compartir sus conocimientos con quienes empezamos en éste mundillo de la programación con C++.

Un Saludo.

fco_gar_alb
2011-11-08 19:43:01

Quisiera aportar mi version al ejemplo 9.3.

// Muestra el alfabeto de mayúsculas y minúsculas: 
// AbCdEfGhIjKlMnOpQrStUvWxYz 
// aBcDeFgHiJkLmNoPqRsTuVwXyZ
// ABcdEFghIJklMNopQRstUVwxYZ
// abCDefGHijKLmnOPqrSTuvWXyz 

#include <iostream>
#include <cctype> 
using namespace std;

int main() 
{
    char alfabeto[27];
    int aux, i;
    
    // Cargamos alfabeto
    for( aux = 'a', i = 0; aux <= 'z'; aux++, i++ )
         alfabeto[i] = aux;
    // Ponemos fin de cadena
    alfabeto[i] = '\0';
         
    // Visualizamos primera linea
    for( i = 0; alfabeto[i] != '\0'; i++)
           (!(i%2))? cout << (char)toupper(alfabeto[i]): cout << alfabeto[i];

    cout << endl;
    
    // Visualizamos segunda linea
    for( i = 0; alfabeto[i] != '\0'; i++)
           (i%2)? cout << (char)toupper(alfabeto[i]): cout << alfabeto[i];

    cout << endl;
    
    // Visualizamos tercera línea
    for( i = 0; alfabeto[i] != '\0'; i++ )   
           (!(int(i/2)%2))? cout << (char)toupper(alfabeto[i]): cout << alfabeto[i];
    
    cout << endl;       
    
    // Visualizamos cuarta línea
    for( i = 0; alfabeto[i] != '\0'; i++ )   
           (int(i/2)%2)? cout << (char)toupper(alfabeto[i]): cout << alfabeto[i];
    
    cin.get(); 
    
    return 0;
}
Calculin
2012-04-11 01:45:50

Estimados:

Les propongo una solucion sin usar las funciones de conversion y aprovechando el orden que tienen los caracteres en la tabla ASCII. Saludos.

#include <iostream>
using namespace std;

int main(){
  //char i, para que alterne primero de a una y luego de a dos:
  for (char i = 2; i <= 4; i+=2){
       //char j, para que una vez sea la mayuscula y luego la minuscula:
        for (char j = 0; j <= 1; j++){
            //char a, para contener el alfabeto.
            for(char a = 0; a < 26; a++){
                if (0 == j){
                    if (a%i < i/2 ) cout << char(a + 'A');//muestra mayuscula.
                    else cout << char(a + 'A' + 32);//muestra minuscula.
                }
                else{
                    if (a%i < i/2 ) cout << char(a + 'A' + 32);//muestra minuscula.
                    else cout << char(a + 'A');//muestra mayuscula.
                }
            }
            cout << endl;
        }
    }
    cout << endl;
}
Calculin
2012-04-11 01:48:09

La propuesta anterior aplica al ejercicio 9.3

Juan Jesus
2012-05-22 10:45:08

Hola a todos soy un novato autodidacta que estoy aprendiendo la programacion me resulta muy interesante yo tengo mi version del ejercicio 9.3 es similar a la propueta de Calculin este es mi codigo un saludo

/* Muestra el alfabeto de mayúsculas y minúsculas:
 AbCdEfGhIjKlMnOpQrStUvWxYz
 aBcDeFgHiJkLmNoPqRsTuVwXyZ
 ABcdEFghIJklMNopQRstUVwxYZ
 abCDefGHijKLmnOPqrSTuvWXyz
 AUTOR: JUAN CHAVEZ
 FECHA: 22 MAYO 2012
*/

#include <iostream>
using namespace std;

int main ()
{
    unsigned char x=0,d=0;

/*utilizo este bucle para intercambiar las mayusculas
con las minusculas un cambio por ciclo del for*/
    for(char j='A'; j<='Z'; j++)
    {
        if(j%2)
        cout <<j;
        else cout <<(d=j+32);
    }
    cout <<endl;//salto de linea
/*utilizo este bucle como el anterior pero al inversa ahora la
minusculas primero cambio por ciclo del for*/
    for(char k='a'; k<='z'; k++)
    {
        if(k%2)
        cout <<k;
        else cout <<(d=k-32);
    }
    cout <<endl;//salto de linea
/*En este caso utilizo una variable x para realizar el
cambio de mayusculas a minusculas cada dos ciclos de for*/
    for(char a='a'; a<='z'; a++)
    {
        x++;
        if(x<=2)
            cout <<a;
        else
            cout <<(d=a-32);
        if(x==4)
            x=0;
    }
    cout <<endl;//salto de linea
/*En este caso utilizo una variable x para realizar el
cambio de mayusculas a minusculas cada dos ciclos de for pero invierto
el inicio del for por las letras mayusculas*/
     for(char b='A'; b<='Z'; b++)
    {
        x++;
        if(x<=2)
            cout <<(d=b+32);
        else
            cout <<b;
        if(x==4)
            x=0;
    }
    return 0;
}
Gustavo Vasquez
2012-08-01 07:03:01

Saludos...

Primero felicidades! estoy siguiendo el curso capitulo a capitulo y la verdad esta muy bueno.

Sin embargo algo me ha llamado la atención. Hasta el capitulo 8 hacían un descripción de cada elemento que usaban. sea este el preprocesador, la instrucción main(); declaraciones de variables, etc. Pero de pronto pasaron a estos ejemplos donde hay cosas que ni habian explicado antes. como: using namespace std; cin, cout y cosas por estilo...

Quizas me salte algun capitulo?

Steven R. Davidson
2012-08-01 07:09:41

Hola Gustavo,

Gracias por tu comentario. En cuanto a 'cout' y 'cin', hablamos de ellos al final del capítulo 6, con ejemplos completos. Puedes dirigirte a: http://c.conclase.net/curso/index.php?cap=006p#resueltos1_6

Espero que esto te oriente,

Steven

Gustavo Vasquez
2012-08-02 08:04:59

Listo.

ya entiendo! Me había saltado esa parte...

ahora si entiendo lo de "using namespace std;" esa linea sobre todo no la entendía.

Gracias por responder!

AndrésC
2012-08-28 21:38:44

Hola... llevo dos semanas siguiendo el curso paso a paso y hasta acá ya aprendí cosas que no he visto en un año de Universidad. Gracias por compartir este conocimiento con todo el mundo... en este sitio el que se lo propone de verdad que aprende mucho :)

Aitor
2012-10-03 03:16:03

Hola,

Una pequeña pregunta. ¿Por qué es necesario incluir la clase cstdio en el ejemplo 4? He intentado leer el carácter como while((cin>>c) != '&') y ya he visto que no se puede, pero no entiendo por qué.

Muchas gracias!

Steven R. Davidson
2012-10-03 03:40:56

Hola Aitor,

En primer lugar, "cstdio" no es una clase sino un fichero estándar de cabecera, que incluye principalmente varias funciones (estándares) para manejar la entrada y salida de datos. Estas funciones provienen de C, y como C++ es compatible con C, también son estándares en C++.

En segundo lugar, necesitamos incluir este fichero de cabecera porque usamos la función 'getchar()'.

En cuanto a lo que has escrito:

while((cin>>c) != '&')

El problema está en que la evaluación de la expresión:

cin >> c

resulta en el mismo objeto, 'cin', que es de la clase 'istream'. Esto implica que estarías intentando hacer esto:

while( cin != '&' )

El operador != no está definido para tratar operandos de tipo 'istream' junto con 'char'. Por lo tanto, hay un error semántico, por lo que el compilador se detendrá.

Para hacer lo que pretendes, usando 'cin', te interesa usar la función miembro, 'get()'. Esto es,

while( (c = cin.get()) != '&' )

Espero haber aclarado la duda.

Steven

Julian
2013-04-23 00:05:48

Con este codigo se soluciona el problema de la ñ del ejemplo 9.2:

#include <iostream>
using namespace std;

int main()
{
   char a;

   a = 'A';
   while(a <= 'Z'){
      if(a == 'N') cout << a++ << "Ñ";
      else cout << a++;
   }
   cout << endl;

   a = 'a';
   while(a <= 'z'){
      if(a == 'n') cout << a++ << "ñ";
      else cout << a++;
   }
   cout << endl;
   return 0;
}
GUSTAVO SANCHEZ
2013-07-11 19:29:36

#include <stdio.h>

main()

{

float a,b,med;

printf("introduzca el primer numero\n");

scanf("%f",&a);

printf("introduzca el segundo numero\n");

scanf("%f",&b);

med=(a+b)/2;

printf("\n\nLa media de %f y %f es %f\n",a,b,med);

system ("PAUSE");

}

NO LOGRO ECHAR A ANDAR ESTE PROGRAMA ME MARCA EL ERROR EN SYSTEM ("PAUSE"); ME PODRIAN AYUDAR ?

Steven R. Davidson
2013-07-11 20:43:15

Hola Gustavo,

El error tiene que ver con el hecho de que no incluiste el fichero de cabecera <stdlib.h>.

También deberías hacer que 'main()' retorne 0 (cero), para indicar que el programa terminó sin problemas.

Hasta pronto,

Steven

Manuel
2013-07-29 21:41:20

Tengo este problema : Realice un programa que acepte dos números, intercambie los valores de sus variables y luego muestre dichas variables con sus nuevos valores.

katty
2013-08-03 21:12:49

hola me parece interesante pero quisiera que me ayuden con el siguiente programa: INGRESAR VARIAS LINEAS DE CARACTERES Y CONVERTIRLAS DE MINÚSCULA A MAYÚSCULA USANDO WHILE

JAAD
2013-08-30 11:42:08

Alex Calle Millan

2010-04-04 00:32:45

Le he hecho una pequeña mejora a tu programa; espero que no te importe.

Saludos.

//----------------------------------------------------------

#include <iostream>

using namespace std;

// Codigo que genera el alfabeto alternando

// Entre mayusculas y minusculas

int main()

{

char letra='a';

bool sumar=false;

//ORIGINAL

while (letra<='z')

{

if (!sumar) { cout<<char(letra-32); sumar=true;}

else { cout<<letra; sumar=false;}

letra++;

}

//-------------------------------------------------------

//"MEJORA"

cout << endl;

cout << endl;

letra='a'; sumar=false; int contador = 0, contador1 = 0;

cout << "Que intervalo quieres que haya" << endl;

cin >> contador1;

while (letra<='z')

{

if (!sumar) {cout<<char(letra-32); contador++;}

if (sumar) {cout<<letra; contador--;}

letra++;

if (contador == contador1) sumar = true;

if (contador == 0) sumar = false;

}

cout << endl;

cout << endl;

system("pause"); return 0;

}

Fer
2013-09-24 09:46:49

Hola Caradas... SALUDOS

ALGUNO DE USTEDES ME PRODRIA HECHAR LA MANO PARA CORRER ESTE CODIGO BAJO UN COMPILADOR BORDLAND C++ 5.5 O BAJO GNU GCC COMPILER...

SE LOS AGRADECERIA PUES EN CODE BLOCKS TENGO PROBLEMAS CON EL COMPILADOR... SALUDOS Y SI PUDIERAN CONTESTARA A NI CORREO.. PORFAVOR

#include "stdio.h"

#include "dos.h"

#define SI 1

#define NO 0

// TIPOS

typedef struct {

char tablero[9];

int f;

} TipoTablero;

//VARIABLES

struct

{

TipoTablero Tm;

int g;

int UTc;

TipoTablero Tc[7];

} arbol[8];

int UTiradaMaq;

TipoTablero juego;

char Linea[100];

// PROTOTIPOS

void desplegaTablero (void);

int esValida (int tirada);

void generaTiradasMaq (void);

void generaTiradasContrario (int iTiradaMaq);

void creaTiradaMaq (int i);

void creaTc (int iTiradaMaq, int i);

void CalculaF (TipoTablero * t);

int revisaFin (int max);

void

main (void)

{

int fin, valida, tiradaContrario, i;

int iTiradaMaq, iTiradaContrario;

int min, max, cualTm, vacias;

// INICIALIZA EL TABLERO DE JUEGO

for (i = 0; i < 9; i++)

juego.tablero[i] = ' ';

// MIENTRAS NO SEA FIN JUEGA

fin = NO;

while (fin == NO)

{

desplegaTablero ();

// TOMA LA TIRADA DEL CONTRARIO HASTA QUE SEA VALIDA

valida = NO;

while (valida == NO)

{

printf ("¿Donde tiras? [1..9] 0 = salir?\n");

gets (Linea);

tiradaContrario = atoi (Linea) - 1;

valida = esValida (tiradaContrario);

switch (valida)

{

case 0:

fin = SI;

valida = SI;

break;

case 1:

valida = SI;

break;

case 2:

printf ("Posición Ocupada, indica otra\n");

valida = NO;

break;

case 3:

printf ("Posición Erronea, indica otra [1..9]\n");

valida = NO;

break;

}

} // SI DECIDIO TERMINAR, SALIRSE

if (fin == SI)

continue; // COLOCA LA TIRADA DEL CONTRARIO

juego.tablero[tiradaContrario] = ' ';

desplegaTablero ();

CalculaF (&juego);

if (juego.f < -9000)

{

printf ("Ganaste\n");

fin = SI;

continue;

} // GENERA POSIBLES TIRADAS DE LA MAQUINA

UTiradaMaq = 0;

generaTiradasMaq ();

// PARA CADA TIRADA DE LA MAQUINA

for (iTiradaMaq = 0; iTiradaMaq < UTiradaMaq; iTiradaMaq++)

{

// GENERA POSIBLES TIRADAS DEL CONTRARIO

arbol[iTiradaMaq].UTc = 0;

generaTiradasContrario (iTiradaMaq);

min = 15000;

// PARA CADA TIRADA DEL CONTRARIO

for (iTiradaContrario = 0;

iTiradaContrario < arbol[iTiradaMaq].UTc; iTiradaContrario++)

{

// CALCULA F

CalculaF (&arbol[iTiradaMaq].Tc[iTiradaContrario]);

// ENCUENTRA LA F MINIMA

if (min > arbol[iTiradaMaq].Tc[iTiradaContrario].f)

min = arbol[iTiradaMaq].Tc[iTiradaContrario].f;

}

// CALCULA F'

CalculaF (&arbol[iTiradaMaq].Tm);

// CALCULA G

arbol[iTiradaMaq].g = arbol[iTiradaMaq].Tm.f + min;

}

max = -15000;

// ELIGE TM MEDIANTE EL CRITERIO G MAXIMA

cualTm = -1;

for (iTiradaMaq = 0; iTiradaMaq < UTiradaMaq; iTiradaMaq++)

{

if (arbol[iTiradaMaq].g > max)

{

cualTm = iTiradaMaq;

max = arbol[iTiradaMaq].g;

}

}

// SI LA MAQUINA TIRO

if (cualTm > -1)

{

printf ("voy a tirar...\n");

delay (1000);

// COPIA EL TABLERO CON LA JUGADA DESEADA

for (i = 0; i < 9; i++)

juego.tablero[i] = arbol[cualTm].Tm.tablero[i];

}

// DETERMINA LA SITUACION ACTUAL DEL JUEGO

CalculaF (&juego);

switch (revisaFin (juego.f))

{

case 0:

break; // CONTINUA

case 1:

desplegaTablero ();

printf ("LO SIENTO, Gane!!!!\n");

fin = SI;

break;

case 2:

desplegaTablero ();

printf ("Ganaste\n");

fin = SI;

break;

case 3:

printf ("Quedamos G a t o, hagamos otro intento\n");

fin = SI;

break;

}

}

}

void

desplegaTablero (void)

{

int r, c;

for (r = 0; r < 3; r++)

{

for (c = 0; c < 3; c++)

if (juego.tablero[3 * r + c] == 32)

printf ("%d ", 3 * r + c + 1);

else

printf ("%c ", juego.tablero[3 * r + c]);

printf ("\n\n");

}<div style="display: none"><a href='http://buycheapviagraoonline.com/' title='buy cheap generic viagra'>buy cheap generic viagra</a></div>

}

int

esValida (int tirada)

{

if (tirada == -1)

return 0; // NO CONTINUAR

if ((tirada > -1) && (tirada < 9))

if (juego.tablero[tirada] == ' ')

return 1;

else

return 2;

// POSICION OCUPADA

else

return 3; // POSICION INVALIDA

}

void

generaTiradasMaq (void)

{

int i;

for (i = 0; i < 9; i++)

if (juego.tablero[i] == ' ')

creaTiradaMaq (i);

}

void

generaTiradasContrario (int iTiradaMaq)

{

int i;

for (i = 0; i < 9; i++)

if (arbol[iTiradaMaq].Tm.tablero[i] == ' ')

creaTc (iTiradaMaq, i);

}

void

creaTiradaMaq (int i)

{

int k;

for (k = 0; k < 9; k++)

arbol[UTiradaMaq].Tm.tablero[k] = juego.tablero[k];

arbol[UTiradaMaq].Tm.tablero[i] = 'o';

UTiradaMaq++;

}

void

creaTc (int iTiradaMaq, int i)

{

int k;

for (k = 0; k < 9; k++)

arbol[iTiradaMaq].Tc[arbol[iTiradaMaq].UTc].tablero[k] =

arbol[iTiradaMaq].Tm.tablero[k];

arbol[iTiradaMaq].Tc[arbol[iTiradaMaq].UTc].tablero[i] = 'x';

arbol[iTiradaMaq].UTc++;

}

void

CalculaF (TipoTablero * t)

{

int v, h, d;

int r, c, ctaO, ctaE, ctaX;

// SUMA LAS VERTICALES MAQUINA

v = 0;

for (c = 0; c < 3; c++)

{

ctaO = 0;

ctaE = 0;

for (r = 0; r < 3; r++)

{

if (t->tablero[3 * r + c] == 'o')

ctaO++;

if (t->tablero[3 * r + c] == ' ')

ctaE++;

}

if (ctaO == 3)

{

t->f = 9999;

return;

}

if ((ctaO + ctaE) == 3)

v++;

}

h = 0;

for (r = 0; r < 3; r++)

{

ctaO = 0;

ctaE = 0;

for (c = 0; c < 3; c++)

{

if (t->tablero[3 * r + c] == 'o')

ctaO++;

if (t->tablero[3 * r + c] == ' ')

ctaE++;

}

if (ctaO == 3)

{

t->f = 9999;

return;

}

if ((ctaO + ctaE) == 3)

h++;

} // SUMA LAS DIAGONALES MAQUINA

d = 0;

ctaO = 0;

ctaE = 0;

for (c = 0; c < 9; c += 4)

{

if (t->tablero[c] == 'o')

ctaO++;

if (t->tablero[c] == ' ')

ctaE++;

}

if (ctaO == 3)

{

t->f = 9999;

return;

}

if ((ctaO + ctaE) == 3)

d++;

ctaO = 0;

ctaE = 0;

for (c = 2; c < 7; c += 2)

{

if (t->tablero[c] == 'o')

ctaO++;

if (t->tablero[c] == ' ')

ctaE++;

}

if (ctaO == 3)

{

t->f = 9999;

return;

}

if ((ctaO + ctaE) == 3)

d++;

// SUMA LAS VERTICALES CONTRARIO

for (c = 0; c < 3; c++)

{

ctaX = 0;

ctaE = 0;

for (r = 0; r < 3; r++)

{

if (t->tablero[3 * r + c] == 'x')

ctaX++;

if (t->tablero[3 * r + c] == ' ')

ctaE++;

}

if (ctaX == 3)

{

t->f = -9999;

return;

}

if ((ctaX + ctaE) == 3)

v--;

}

// SUMA LAS HORIZONTALES CONTRARIO

for (r = 0; r < 3; r++)

{

ctaX = 0;

ctaE = 0;

for (c = 0; c < 3; c++)

{

if (t->tablero[3 * r + c] == 'x')

ctaX++;

if (t->tablero[3 * r + c] == ' ')

ctaE++;

}

if (ctaX == 3)

{

t->f = -9999;

return;

}

if ((ctaX + ctaE) == 3)

h--;

}

// SUMA LAS DIAGXNALES CONTRARIO

ctaX = 0;

ctaE = 0;

for (c = 0; c < 9; c += 4)

{

if (t->tablero[c] == 'x')

ctaX++;

if (t->tablero[c] == ' ')

ctaE++;

}

if (ctaX == 3)

{

t->f = -9999;

return;

}

if ((ctaX + ctaE) == 3)

d--;

ctaX = 0;

ctaE = 0;

for (c = 2; c < 7; c += 2)

{

if (t->tablero[c] == 'x')

ctaX++;

if (t->tablero[c] == ' ')

ctaE++;

}

if (ctaX == 3)

{

t->f = -9999;

return;

}

if ((ctaX + ctaE) == 3)

d--;

// ASIGNA F

t->f = v + h + d;

}

int

revisaFin (int max)

{

int i, vacias;

if (max > 9000)

return 1;

// GANO LA MAQUINA

if (max < -9000)

return 2;

// GANO EL CONTRARIO

vacias = 0;

for (i = 0; i < 9; i++)

if (juego.tablero[i] == ' ')

vacias++;

if (vacias > 0)

return 0;

// PUEDEN CONTINUAR

return 3;

// SE ACABO EL JUEGO FUE GATO

}

// fin del archivo

Katherine Morales
2014-03-25 00:27:14

NECESITO UN PROGRAMA DE EL CODIGO CESAR

POR FAVOR

manuel
2014-11-13 09:50:04

tengo una duda como poner en c++ un código que cuando yo ejecute imprima presionar una tecla y al presionar la tecla elprograma te diga si es un numero o una letra ayuda x favor

yasaira
2015-09-20 18:17:27

Hola muy buenos dias apenas estoy viendo este programa y quiero hacer un comentario en "c"ya que me encantaria que lo dijeras de pasos a pasos para poderlo entender muy bien gracias

alejandro moreno
2016-11-13 18:28:06

me gustaria saber como hacer un programa para el abecedario que la A o a, sea 1, B o b, sea 2 y asi sucesivamente, gracias!

The_RiPPeR
2017-02-24 21:39:33

no se sien que no lo vi pero te falto precisar que para los caracteres de ASCI se utiliza la comillas simple, de ser yo quien me equivoque dime en que sección esta para leerlo.

P.D: men pon el código de seguridad más legible que paso un trabajo de 69 (de puta madre).

Salvador Pozo
2017-02-26 00:11:41

Hola The_RiPPeR:

El tema de las comillas se explica en el capítulo 7:

http://c.conclase.net/curso/index.php?cap=007b#Not_char

Veré qué puedo hacer en el futuro con el código de seguridad, es posible que me haya pasado con la ofuscación. Siento las molestias. :)

RODRIGO
2017-03-25 16:43:03

NO PUEDO RESOLVER ESTE PROBLEMA ME PUEDEN AYUDAR

Realizar un programa que determine si el caracter asociado a un código introducido es numérico, literal, de puntuación, especial o no imprimible.

Karina
2017-06-29 18:34:08

Esta es mi version de uno de los ejemplos de las 4 cadenas, espero y les sirva n.n

#include <iostream>
#include <string>
#include <locale>
using namespace std;

//Se utilizan 4 ciclos para cada una de las cadenas a imprimir
int main(){
std::locale loc;
char a;
a='A';

       for(a='a';a<='z';a++){
                    if(a%2)
                        cout<<toupper(a,loc)<<" ";
                    else
                        cout<<a<<" ";
        }
            cout<<endl;
        for(a='a';a<='z';a++){
                    if(a%2)
                        cout<<a<<" ";
                    else
                        cout<<toupper(a,loc)<<" ";
        }
            cout<<endl;
                    for(a='a';a<='z';a++){
                    if(a%3)
                        cout<<a<<" ";
                    else
                        cout<<toupper(a,loc)<<" ";
        }
                    cout<<endl;
                    for(a='a';a<='z';a++){
                    if(a%3)
                        cout<<toupper(a,loc)<<" ";
                    else
                        cout<<a<<" ";
        }
    return 0;
}