Vous êtes sur la page 1sur 30

MP 11 Fundamentos Programacin

UF 02 Diseo Modular
MP 11 UF 02 Mdulo 4 Fundamentos Programacin. Pgina 1
MDULO 6 FUNDAMENTOS PROGRAMACIN EN C, C++.

OBJETIVOS.
Seguiremos en este mdulo con los punteros y vectores, concretamente veremos un caso
particular de vectores, los vectores de caracteres o cadenas de caracteres.
Concretamente, los aspectos que tratar este mdulo son:
Qu son las cadenas de caracteres? Cmo se almacena en la memoria?
Valor inicial de una cadena de caracteres.
Funciones de cadena. Entrada y Salida:
scanf(), gets() y fgets();
printf(), puts() y fputs().
Otras funciones de tratamiento de caracteres:
strlen(), strcpy(), strncpy(), strcat(), strncat(), strcmp(), strncmp(),stricmp(),
_strnicmp(), strchr(), strrchr(), strstr(), strpbrk(), isalpha(), isupper(), islower(),
isdigit(), isalnum(), e isspace().

MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 2
1. RESUMEN TERICO.
1.1. CADENAS DE CARACTERES.
Una cadena de caracteres es un vector de datos del tipo char que acaba en un carcter
NULL ('\0'). Por esta razn se deben declarar vectores de caracteres con un carcter ms que la
cadena ms larga que queramos almacenar.
Por ejemplo, si queremos un vector que almacene el mensaje Esto es una cadena,
deberemos declarar un vector de la siguiente forma: char str[19].
1.1.1. VALOR INICIAL DE UNA CADENA DE CARACTERES.
Podemos poner valores iniciales en una cadena de caracteres de dos formas
diferentes:
a) De la forma estndar de los vectores, tal y como se ha visto en el mdulo anterior.
Cada carcter va cerrando entre comillas sencillas y los caracteres separados por
comillas: char str[5] = {'h','o','l','a','\0'};
b) De la forma abreviada: char str[5] = "hola";
De esta forma, todos los caracteres se escriben juntos, cerrados por dobles
comillas y sin poner el carcter '\0' de fin de cadena que se pone automticamente.
En cualquiera de las dos formas se puede omitir la dimensin; es decir, es vlido
tanto: char str[] = {'h','o','l','a','\0'};' como: char str[] = "hola";
En los dos casos, el compilador de C crear automticamente un vector de cinco
elementos de caracteres.
1.1.2. FUNCIONES DE CADENAS. ENTRADA Y SALIDA.
La introduccin de una cadena en un programa tiene dos fases:
1) La primera prepara el espacio de memoria suficiente para su almacenamiento, esto
se consigue con su declaracin.
2) La segunda fase consiste en usar una funcin para capturar la cadena. Para capturar
cadenas directamente del teclado se pueden utilizar tres funciones, la declaracin de
las cuales estn en el archivo estndar stdio.h. Una de estas funciones ya se ha
visto con anterioridad, se trata de la funcin scanf(). Las otras funciones son gets() y
fgets().
La funcin gets() tiene el siguiente prototipo: char *gets(char *var);. Esta
funcin recibe caracteres de entrada estndar (el teclado) y asigna los caracteres al vector
de caracteres var[]. Cuando se presiona la tecla INTRO al finalizar la cadena, se enva un
carcter de nueva lnea que es traducido por esta funcin por un carcter nulo de fin de
cadena. Es importante remarcar que esta funcin no realiza la comprobacin que la cadena
leda tenga un tamao igual o inferior al tamao reservado para almacenar la variable.
Si se utiliza esta funcin, el compilador nos dar un error leve: Warning: the
'gets' function is dangerous and should not be used. La biblioteca GNU la incluye
por un tema de compatibilidad, pero es mejor utilizar otras funciones ya que como se ha
comentado antes no contiene ninguna precaucin para no desbordar la longitud de la
cadena.

MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 3
Otra funcin parecida que permite esta comprobacin es la funcin fgets(). Tiene el
siguiente prototipo: char *fgets(char *var, int n, FILE *flux);.
Cuando se utiliza esta funcin para leer cadenas del teclado, el tercer argumento ser
stdin, que corresponde a la entrada estndar. En el ltimo mdulo se tratar con ms
detalle las entradas y salidas.
Esta ltima funcin tiene la ventaja que se puede garantizar un nmero mximo de
caracteres. La lectura se realiza hasta que se encuentra un carcter de nueva lnea (con
INTRO) o bien hasta que se lean n-1 caracteres (incluyendo el carcter de nueva lnea).
La funcin gets() reemplaza el carcter de nueva lnea ledo por teclado por el
carcter NULL ('\0'), en cambio la funcin fgets() aade al carcter de nueva lnea el carcter
NULL ('\0'). Ambas funciones retornan un puntero a la cadena leda o escrita, o bien el
puntero NULL si ha habido un error.
Para que se muestre el contenido de una cadena por el teclado se utilizan las tres
funciones asociadas respectivamente a scanf(), gets() y fgets(), se trata de printf(), puts() y
fputs(). La primera de ellas ya la hemos visto y tratado con anterioridad.
La funcin puts() escribe el contenido de su argumento por pantalla reemplazando el
carcter NULL por el carcter de nueva lnea; en cambio, la funcin fputs() no realiza ningn
reemplazo.
Los prototipos de las dos funciones son: int puts (const char *cadena);
int fputs (const char *cadena, FILE *flux);
En el caso de la funcin fputs(), si la salida es la salida estndar, se reemplaza el
tercer argumento por stdout.
1.1.3. OTRAS FUNCIONES DE TRATAMIENTO DE CADENAS.
Las funciones estndar ms importantes que permiten trabajar con cadenas de
caracteres y que estn definidas en el archivo string.h son las siguientes:
int strlen(const char *cadena) Retorna el nmero de caracteres de la
cadena, sin contar el carcter '\0'.
char *strcpy( char *cadestino, const char *cadfuente); Copia el
contenido de la cadena cadfuente en la cadena cadestino. Se debe tener en cuenta
que esta funcin es diferente a la asignacin: *cadestino=*cadfuente.
Esta ltima sentencia slo pondra el primer carcter de cadfuente a cadestino,
adems, no pone ningn carcter de fin de cadena.
En esta funcin se debe tener en cuenta que la cadena cadfuente no sea mayor
que la cadena cadestino.
Esta funcin elimina el contenido previo de la cadena cadestino.
char *strncpy( char *cadestino, const char *cadfuente, int n);
Copia el contenido de los n primeros caracteres de cadfuente en cadestino.
Si n es ms pequeo o igual que la longitud de la cadena cadfuente no se aade
ningn carcter NULL de final de cadena.
Si n es ms grande que la longitud de la cadena cadfuente, la cadena cadestino se
llena de caracteres NULL hasta la longitud n.
Esta funcin, como la anterior, no realiza comprobacin de longitud y, por tanto,
el comportamiento puede ser desastroso si la longitud de la cadena cadfuente y n
son ms grandes que la longitud de la cadena cadestino.

MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 4
char *strcat(char *cadestino, const char *cadfuente); Aade la
cadena cadfuente al final de la cadena cadestino. La cadena cadfuente no cambia su
contenido.
char *strncat(char *cadestino, const char *cadfuente, int n);
Aade n caracteres de la cadena cadfuente al final de la cadena cadestino.
En esta funcin y en la anterior el primer carcter aadido sustituye al carcter fin
de cadena anterior. Este carcter se aade al final.
int strcmp(char *cad1, const char *cad2); Esta funcin compara las
cadenas cad1 y cad2. Retorna un '0' si coinciden y un nmero diferente de '0' si no
coinciden. La comparacin se realiza carcter a carcter hasta encontrar un carcter
que no coincide o con el carcter fin de cadena.
int strncmp(char *cad1, const char *cad2, int n); Compara los n
primeros caracteres de las cadenas cad1 y cad2. La comparacin se realiza carcter a
carcter hasta encontrar un carcter que no coincide o con el carcter fin de cadena.
int _stricmp(char *cad1, const char *cad2);
int _strincmp(char *cad1, const char *cad2, int n);
Estas dos funciones son similares a las dos anteriores, pero con la diferencia que
en la comparacin no distinguen entre maysculas y minsculas.
El smbolo '_' indica que estas funciones no corresponden al estndar ANSI, no
obstante, tambin se pueden utilizar en Visual C++ sin este carcter.
char *strchr(const char *cad, int c); Esta funcin retorna un puntero
a la primera ocurrencia del carcter c en la cadena cad. Si este carcter no est se
retorna un NULL.
char *strrchr(const char *cad, int c); Esta funcin retorna un
puntero a la ltima ocurrencia del carcter c en la cadena cad. Si este carcter no
est se retorna un NULL.
char *strstr(const char *cad, const char *subcad); Esta funcin
retorna un puntero a la primera ocurrencia de la subcadena subcad en la cadena cad
o bien un puntero a NULL si no se encuentra.
char *strpbrk(const char *cad, const char *subcad); Esta funcin
retorna un puntero a la primera ocurrencia de cualquiera de los caracteres de subcad
en la cadena cad o bien un puntero a NULL.
Adems de estas funciones, hay otras que pueden ser tiles para el tratamiento de
cadenas. Las declaraciones de estas funciones estn en el fichero cabecera ctype.h:
int isalpha(int c); Esta funcin retorna un valor diferente de '0' si c es una
letra y '0' si no lo es.
int isupper(int c); Esta funcin retorna un valor diferente de '0' si c es una
letra mayscula y '0' si no lo es.
int islower(int c); Esta funcin retorna un valor diferente de '0' si c es una
letra minscula y '0' si no lo es.
int isdigit(int c); Esta funcin retorna un valor diferente de '0' si c es un
dgito y '0' si no lo es.
int isalnum(int c); Esta funcin retorna un valor diferente de '0' si c es una
letra o un dgito y '0' si no lo es.
int isspace(int c); Esta funcin retorna un valor diferente de '0' si c es un
espacio, un tabulador o el carcter de nueva lnea y '0' si no es nada de esto.

MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 5
2. PRCTICA 1: INVERSIN DE UNA PALABRA.
Como primera prctica de cadenas de caracteres, comenzaremos a manipular una cadena
carcter a carcter para poder invertirla.
2.1. DESARROLLO DE LA PRCTICA.
Crearemos un nuevo archivo C denominado m6p01.c y se escribir el siguiente cdigo:
//m6p01.cc - INVERTIR LA POSICIN DE LAS LETRAS DE UNA PALABRA -

#include <stdio.h>
#include <stdlib.h>

int main(){

char palabra[21];
int i;
system("clear");
printf("Teclee una palabra:\n");
scanf("%s", palabra);

i = 0;

while(palabra[i++] != '\0');

i--;
printf("%s tiene %d letras.\n", palabra, i);
printf("%s escrita al revs: ", palabra);
while (i >= 0) printf("%c", palabra[i--]);
printf("\n");
return 0;

}
2.2. CAPTURA DE LA EJECUCIN DEL PROGRAMA.


MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 6
2.3. EXPLICACIN DEL PROGRAMA.
En primer lugar, se declara una variable char y una variable de cadena palabra[21]. Esta
variable es un vector de caracteres. Se reserva espacio para 21 caracteres (21 octetos).
La lectura de la palabra se realiza con la funcin scanf(). La forma de obtener el nmero de
caracteres es una alternativa curiosa a la funcin strlen(), es la lnea:
while(palabra[i++] != '\0');
Este bucle vaco se ejecuta hasta que se encuentre el carcter '\0'. Aunque el cuerpo del
bucle est vaco, cada vez que se comprueba la condicin, se incrementa el valor de la variable i
en una unidad, por tanto, cuando se sale del bucle porque se ha encontrado el carcter de fin de
cadena ('\0'), el valor de la variable i es igual a la longitud de la cadena ms una unidad (ms una
unidad ya que cuando se encuentra con el carcter fin de cadena todava incrementa en 1 el valor
de i).
Es evidente que esta lnea se podra sustituir por: i=strlen(palabra); (para esta
primera lnea sera necesario el archivo cabecera string.h).
La lnea que imprime en pantalla la palabra al revs es:
while (i >= 0) printf("%c", palabra[i--]);
Es un bucle formado por una nica sentencia, pero, cada vez que se escribe uno de los
caracteres de la palabra (comenzando por el ltimo) se decrementa el valor de la variable en 1.
Si en lugar de leer una palabra slo, se puede leer una frase, se debe modificar el programa
anterior ya que la funcin scanf() solo lee la primera palabra de la frase, la lectura se detiene
cuando se llega al primer carcter blanco.

MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 7
3. PRCTICA 2: VECTORES PUNTEROS A CADENAS DE CARACTERES.
En esta prctica veremos que se puede definir u vector de cadenas de caracteres; es decir,
un vector de punteros de caracteres.
3.1. DESARROLLO DE LA PRCTICA.
Crearemos un nuevo archivo C++ denominado m6p02.cc con el siguiente cdigo:
//m6p02.cc - VECTORES A CADENAS DE CARACTERES -

#include <iostream>
#include <stdlib.h>

using namespace std;

char *nombre_mes(int n);

int main(){
int mes;

system("clear");

cout<<"Escribe el nombre del mes ";
cin>>mes;
cout << "El mes es .. "<<nombre_mes(mes)<<endl;
return 0;
}

char *nombre_mes(int n){
char *nombre[]={"Mes no valido","Enero","Febrero","Marzo","Abril",
"Mayo","Junio","Julio","Agosto","Septiembre",
"Octubre","Noviembre","Diciembre"
}

return ( n < 1 || n > 12 ) ? nombre[0]:nombre[n] ;

}
3.2. CAPTURA DE LA EJECUCIN DEL PROGRAMA.



MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 8
3.3. EXPLICACIN DEL PROGRAMA.
Los vectores tambin pueden contener punteros. En este caso cada posicin de este vector
es un puntero a la primera posicin de la cadena de caracteres. El vector *nombre es un vector de
punteros a cadenas:
char *nombre_mes(int n){
char *nombre[]={"Mes no valido","Enero","Febrero","Marzo","Abril",
"Mayo","Junio","Julio","Agosto","Septiembre",
"Octubre","Noviembre","Diciembre"
}
Este vector puede representarse como:

La funcin nombre_mes() retorna una cadena (un puntero a un vector de caracteres). La
cadena retornada se calcula en la siguiente lnea:
return ( n < 1 || n > 12 ) ? nombre[0]:nombre[n] ;
Si el argumento no es un nmero comprendido entre 1 y 12 el resultado es nombre[0]; es
decir, la cadena "Mes no vlido", en caso contrario retorna la cadena nombre[n].


MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 9
4. PRCTICA 3: INTRODUCCIN A LA CRIPTOLOGA.
EL MTODO DE SUSTITUCIN DE JULIO CSAR.
En esta prctica aprenderemos una aplicacin clsica y sencilla de la manipulacin de
cadenas de caracteres.
4.1. DESARROLLO DE LA PRCTICA.
Posiblemente, el primer sistema de encriptacin de mensajes tuvo su origen en tiempos de
Julio Csar, cuando la escritura en latn comenz a ser popular. Este sistema, realizado de forma
sencilla, consista en sustituir una letra por la situada tres posiciones a la derecha, suponiendo el
alfabeto ordenado en su orden natural.
Por ejemplo, la letra A se transforma en D y la B en E. En este mtodo podemos imaginar
que tras la letra Z se encuentra la A, por tanto, la X se transforma en A, la Y en B y la Z en C.
Generalizando, se denomina mtodo de Julio Csar al mtodo de encriptacin que consiste
en sustituir una letra por la situada n lugares a la derecha, suponiendo el alfabeto ordenado en su
orden natural.
Podemos, para simplificar, pensar en el alfabeto ingls de 26 caracteres, y slo las letras
minsculas. Los cdigos ASCII de estos 26 smbolos son los que van del 97 al 122.
El algoritmo para sustituir una letra por otra es: c (c-97+n)%26+97, donde c es el cdigo
ASCII del carcter a sustituir.
En esta prctica haremos un programa que permita encriptar y desencriptar mensajes, de
hecho, si un mensaje se ha encriptado usando el cdigo n, el cdigo 26-n permitir desencriptarlo
con el mismo algoritmo.
Crearemos un nuevo archivo del tipo C++ denominado m6p03.cc con el siguiente cdigo:
//m5p03.cc - MTODO JULIO CSAR -

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

char *Cesar(char *mensaje, int n);

int main(){
char mensaje[100];
int codigo;

system("clear");

printf("Introduce el mensaje...\n");
fgets(mensaje,80,stdin);

printf("\n\n Introduce el codigo (0-25)...\n");
scanf("%d", &codigo);

printf("\nEl mensaje modificado es:\n%s\n\n", Cesar(mensaje, codigo));
return 0;
}


MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 10
char *Cesar(char*mensaje, int n){
int i=0;
while(mensaje[i]){
if (mensaje[i]!=' ')
mensaje[i]=(tolower(mensaje[i])-97+n)%26+97;
i++;
}
return mensaje;
}
4.2. CAPTURA DE LA EJECUCIN DEL PROGRAMA.

4.3. EXPLICACIN DEL PROGRAMA.
En esta prctica, la introduccin de la cadena por teclado se realiza con la funcin fgets().
La funcin Cesar() recibe como argumento un puntero a la cadena Mensaje y un entero que
corresponde al cdigo utilizado para la encriptacin (o desencriptacin) del mensaje. Esta funcin
se basa en el siguiente bucle:
while(mensaje[i]){
if (mensaje[i]!=' ')
mensaje[i]=(tolower(mensaje[i])-97+n)%26+97;
i++;
}
La condicin de la sentencia while es una condicin tpica de C (es decir, que no parece una
condicin), la cual es una carcter de la cadena, ser verdadera hasta que se encuentre el carcter
fin de cadena ('\0), momento en el cual saldr del bucle.
Para cada carcter de la cadena se comprueba si es el espacio en blanco. Este carcter se
modifica, los otros s. La funcin tolower() hace que todos los caracteres de la cadena se
conviertan en letras minsculas.
El cuerpo del bucle es la transformacin antes mencionada. Debemos recordar que el
operador % es el resto de la divisin entera, por tanto, la expresin: (mensaje[i])-97+n)%26+97;
dar un entero entre 97 y 97+25.

MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 11
5. PRCTICA 4: CLCULO DEL NMERO DE LNEAS, PALABRAS Y
CARACTERES.
En esta prctica aprenderemos ms sobre la manipulacin de cadenas de caracteres.
Veremos tambin como introducir una cadena de ms de una lnea.
5.1. DESARROLLO DE LA PRCTICA.
El programa calcular el nmero de lneas, palabras y caracteres que se introduzcan por el
teclado e imprimir los resultados para la salida estndar (pantalla). Para detectar lneas debe
buscar el carcter fin de lnea '\n'. Para detectar palabras se define una variable Estado que
recuerda si estaba leyendo una palabra cuando encuentra un espacio en blanco, un fin de lnea o
un tabulador ('\t').
Crearemos un nuevo archivo C denominado m6p04.c con el siguiente cdigo:
//m6p04.c - CUENTA LNEAS, PALABRAS Y CARACTERES. -

#include <stdio.h>
#include <ctype.h>

#define DENTRO 1 // Dentro de una palabra.
#define FUERA 0 // Fuera de una palabra.

int main(){
int c, nl, np, nc, Estado;

Estado = FUERA;
np = nc = 0;
nl = 1;

printf("Introduzca un texto, si quiere, de ms de una lnea\n");
printf("Presionar CTRL+D para finalizar\n\n");

while ((c = getchar()) != EOF)
{
++nc;
if (c == '\n') ++nl;
if (isspace(c)) Estado = FUERA;
else
if (Estado == FUERA)
{
Estado = DENTRO;
++np;
}
}
printf("\n\n lneas:%d\n palabras:%d\n caracteres:%d\n",--nl,np,nc);
return 0;

}

MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 12
5.2. CAPTURA DE LA EJECUCIN DEL PROGRAMA.

5.3. EXPLICACIN DEL PROGRAMA.
Las variables nl, np y nc se encargarn respectivamente de almacenar el nmero de lneas,
de palabras y de caracteres. La primera de las variables es inicializada a 1 y el resto a 0.
La lectura del texto se realiza con la sentencia: while ((c = getchar()) != EOF){
que lee caracteres hasta encontrar un carcter EOF (End Of Line), que se crea con las teclas
CTRL+D.
El cuerpo de la sentencia while se puede dividir en tres partes. Cada una de estas partes se
encargarn de contar los caracteres, las lneas y las palabras:
++nc;
if (c == '\n') ++nl;
if (isspace(c)) Estado = FUERA;
else
if (Estado == FUERA)
{
Estado = DENTRO;
++np;
}
Cada vez que se lee un carcter se incrementa la variable nc en 1. Si el carcter es el
carcter de nueva lnea: ('\n'), se incrementa la variable nl en 1.
La parte que cuenta palabras es algo ms sofisticada. Inicialmente, la variable Estado est
inicializada en FUERA (macro definida al inicio). Si el carcter ledo es un carcter de separacin de
palabras (espacio en blanco, tabulador o retorno de lnea) se asigna el valor FUERA a la variable
Estado, en caso contrario, se asigna el valor DENTRO. Esta comprobacin se realiza con la funcin
isspace(). La variable np se incrementa cuando la variable Estado pasa de FUERA a DENTRO.


MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 13
6. PRCTICA 5: INSERTAR UN TEXTO.
En esta prctica implementaremos la funcin de insertar una cadena en otra.
6.1. DESARROLLO DE LA PRCTICA.
Crearemos un nuevo archivo del tipo C denominado m6p05.c con el siguiente cdigo:
// m6p05.c - INSERTAR UNA CADENA EN OTRA -

#include <stdio.h>
#include <string.h>

char *insertar (char*, int ,char*);
int main(){
char cad1[200];
char cad2[20];
int n;

printf("\n Introducir la primera cadena =...");
fgets(cad1,200,stdin);

printf("\n Introducir la segunda cadena =...");
scanf("%[^\n]",cad2);

printf("\n Posicion =..."); scanf("%d",&n);
printf("\n Primera cadena = %s\n",insertar(cad1,n,cad2));
return 0;
}

char *insetar (char *cad1, int n, char *cad2){
int i,pos;
i=n;
pos=strlen(cad2);

for (i=strlen(cad1);i>=n;i--) cad1[i+pos]=cad1[i];
for (i=0;i<pos;i++) cad1[n+i]=cad2[i];
return cad1;
}
6.2. CAPTURA DE LA EJECUCIN DEL PROGRAMA.


MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 14
6.3. EXPLICACIN DEL PROGRAMA.
En este programa se implementa la funcin insertar que tiene el protocolo:
char *insetar (char *cad1, int n, char *cad2)
Esta funcin inserta una cadena en una posicin determinada de otra cadena. Por ejemplo,
si la cadena cad1 contiene: "Aix s una prova" y la cadena cad2 contiene: "no ", la funcin
insetar(cad2, 5, cad1) har que cad1 sea: "Aix no s una prova":

La insercin se realiza en dos fases: la primera fase desplaza los caracteres de cad1 que hay
despus de la posicin n un nmero de posiciones igual al tamao de la cadena cad2 (pos)
for (i=strlen(cad1);i>=n;i--) cad1[i+pos]=cad1[i];
La segunda fase reemplaza los caracteres de las posiciones n y siguientes de la cadena cad1
por la cadena cad2 for (i=0;i<pos;i++) cad1[n+i]=cad2[i];.
En la siguiente figura se muestra las dos fases de esta insercin:

Esta funcin no comprueba los lmites. En el caso que la suma de los tamaos de cad1 y
cad2 fuese superior al tamao mximo de cad1 se producira un error en tiempos de ejecucin.

MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 15
7. PRCTICA 6: CONTAR EL NMERO DE VECES QUE UNA CADENA
EST CONTENIDA EN OTRA.
En esta prctica utilizaremos la funcin strstr() de la librera estndar para contar el nmero
de veces que una cadena aparece en otra cadena.
7.1. DESARROLLO DE LA PRCTICA.
Crearemos un nuevo archivo en C denominado m6p06.c con el siguiente cdigo:
// m6p06.c - CONTAR SUBCADENAS -
// Este programa cuenta el nmero de veces que una cadena est contenida
en otra.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int Conteo(char*, char*);

int main (void){
char Texto[200];
char Subcadena[10];

system("clear");

printf("Introduzca el texto:\n");
fgets(Texto,200,stdin);

printf("Introduzca la Subcadena:\n");
scanf("%[^\n]",Subcadena);

printf("%d veces\n", Conteo(Texto, Subcadena));
return 0;
}

int Conteo(char *Texto, char *Subcadena
{
char *p;
int Ct=0;
P=Texto;

while(P){ //Mientras haya texto, realizar la operacin siguiente.
P=strstr(P, Subcadena);

if(P)
{
P=P+strlen(Subcadena);
Ct++;
}
}
return Ct;
}


MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 16
7.2. CAPTURA DE LA EJECUCIN DEL PROGRAMA.

7.3. EXPLICACIN DEL PROGRAMA.
En este programa dispondremos de dos cadenas entradas por teclado con la funcin gets();
es decir, cadenas sin caracteres de retorno de lnea. Las cadenas son: Texto[] de un mximo de
199 caracteres, y Subcadena[] de un mximo de 9 caracteres (hay que recordar que se reserva
uno para el carcter fin de cadena '\0'.
La funcin Conteo() retornar un entero que ser el nmero de veces que la cadena
Subcadena se encuentra en la cadena Texto.
La funcin Conteo() declara un puntero P, al cual se le asigna la funcin strstr(). Esta
funcin retorna un puntero a la primera aparicin de la Subcadena en el texto. Si la Subcadena no
aparece en el texto, la funcin strstr() retorna un puntero NULL, cosa que hace que se salga del
bucle.
Si la funcin strstr() no retorna un puntero NULL quiere decir que ha encontrado una
aparicin de la Subcadena. En este momento se hace: P=P+strlen(Subcadena);
Ct=++;
De esta forma, el puntero P apuntar al texto justo a continuacin de la Subcadena, para
poder aplicar de nuevo la funcin strstr() al resto de la cadena. Tambin se debe incrementar en 1
el contador. Cuando sale del bucle, esta variable Ct contendr el nmero de veces que la
Subcadena aparece en el texto.


MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 17
8. PRCTICA 7: REEMPLAZAR PARTE DE UNA CADENA POR OTRA.
En esta prctica implementaremos una til funcin de reemplazo de una parte de una
cadena por otra.
8.1. DESARROLLO DE LA PRCTICA.
Crearemos un nuevo archivo del tipo C++ denominado m6p07.cc con el siguiente cdigo:
//m6p07.cc - REEMPLAZAR SUBCADENA -

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *Reemplazar(char*, char*, int N);

int main (){
char Texto[200];
char Subcadena[10];
int N;

system("clear");

printf("Introduzca el texto:\n");
fgets(Texto,200,stdin);

printf("Introduzca la subcadena:\n");
scanf("%[^\n]",Subcadena);

printf("Posicion ...\n");
scanf("%d",&N);

Reemplazar(Texto, Subcadena, N);
printf("texto=%s\n\n",Texto);

return 0;
}

char *Reemplazar(char *Texto, char *Subcadena, int N)
{
char *P;
unsigned int Ct;
P = Texto + N;

for(Ct=0;Ct<strlen(Subcadena);Ct++) *(P+Ct)=Subcadena[Ct];

return Texto;
}



MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 18
8.2. CAPTURA DE LA EJECUCIN DEL PROGRAMA.

8.3. EXPLICACIN DEL PROGRAMA.
En este programa se implementa la funcin Reemplazar que tiene el protocolo:
char *Reemplazar(char *Texto, char *Subcadena, int N)
Es por tanto, una funcin que retorna una cadena (la misma cadena Texto) y reemplaza
caracteres de la cadena Texto por la cadena Subcadena a partir de la posicin N. Por ejemplo: si
Texto contiene la cadena "Aix s una prova" y Subcadena contiene "dos", la funcin
Reemplazar(Texto, Subcadena, 8) cambiar el contenido de texto por: "Aix s dos prova":

En la lnea de cdigo que realiza este reemplazo, P es un puntero que apunta a la primera
posicin del texto que debe reemplazarse:
for(Ct=0;Ct<strlen(Subcadena);Ct++) *(P+Ct)=Subcadena[Ct];
Debe observarse que esta funcin no realiza comprobacin de lmites. Si la Subcadena o el
valor de N son demasiado grandes puede sobrescribirse parte de la memoria no reservada para la
cadena Texto.


MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 19
9. PRCTICA 8: ELIMINAR PRIMERA APARICIN DE UNA SUBCADENA
En esta prctica implementaremos una funcin ligeramente ms complicada que la funcin
de la prctica anterior, ya que se deben mover los caracteres de su lugar.
9.1. DESARROLLO DE LA PRCTICA.
Crearemos un nuevo archivo de tipo C denominado m6p08.c con el siguiente cdigo:
//m6p08.c - ELIMINACIN DE LA PRIMERA APARICIN DE UNA SUBCADENA -

#include <stdio.h>
#include <stdlib.h>
#include <stirng.h>

char *Eliminar(char*, char*);

int main (){
char Texto[200];
char Subcadena[10];

system("clear");

printf("Introduzca el texto:\n");
fgets(text,200,stdin);

printf("Introduzca la subcadena:\n");
scanf("%[^\n]",Subcadena);

printf("Texto resultante .. %s\n", Eliminar(Texto, Subcadena));
return 0;
}

char *Eliminar(char *Texto, char *Subcadena){
char *P;
int Ct=0;

P=Texto;

P=strstr(P,Subcadena);

if(P)
{
do
{
*P=*(P+strlen(Subcadena));
Ct++;
}
while (*(P+strlen(Subcadena)-1));
}
return Texto;
}

MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 20
9.2. CAPTURA DE LA EJECUCIN DEL PROGRAMA.

9.3. EXPLICACIN DEL PROGRAMA.
En este programa se implementa la funcin Eliminar que tiene el protocolo:
char *Eliminar(char *Texto, char *Subcadena)
Esta funcin busca en la cadena Texto, la cadena Subcadena. Esta bsqueda se hace con la
funcin de la librera estndar strstr(), la cual retorna un puntero a la posicin donde aparece por
primera vez la subcadena Subcadena en la cadena Texto. Si la subcadena no se encuentra en
Texto; la funcin strstr() retorna un puntero NULL y se salta el bucle y acaba la funcin Eliminar().
Si la cadena se encuentra, el puntero P apuntar a otra posicin donde comienza esta subcadena.
Entonces entrar en la siguiente parte del cdigo:
do
{
*P=*(P+strlen(Subcadena));
Ct++;
}
while (*(P+strlen(Subcadena)-1));
Lo que hace esta parte del cdigo es desplazar todos los caracteres que hay despus de la
subcadena en Texto (incluyendo el carcter fin de cadena de Texto) a la izquierda un nmero de
posiciones igual a la longitud de la subcadena:

Este bucle se realiza hasta que *(P+strlen(Subcadena)-1)sea el carcter '\0'. El hecho
de restar -1 es debido a que la comparacin se hace despus de incrementar el puntero P.


MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 21
10. PRCTICA 9: FRECUENCIA DE LAS LETRAS.
En esta prctica veremos un til programa que permite contar el nmero de veces que
aparece cada carcter en un texto. Tambin veremos el uso de las funciones tolower() e isalpha().
10.1. DESARROLLO DE LA PRCTICA.
Crearemos un nuevo archivo de tipo C++ denominado m6p09.c con el siguiente cdigo:
//m6p09.cc - FRECUENCIA DE LAS LETRAS -

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main()
{
int C, Frecuencia[26]={0};

system("clear");

printf("Introduzca un texto: \n");
printf("Presionar CTRL+D para finalizar.\n\n");

while ((C = (getchar())) != EOF)
{
if(isalpha(C)) Frecuencia[tolower(C)-97]++;
}
printf("\n\n");

for(C=0;C<26;C++)
{
printf("%c=%d\t",C+97,Frecuencia[C]);
}
printf("\n");

return 0;
}
10.2. CAPTURA DE LA EJECUCIN DEL PROGRAMA.


MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 22
10.3. EXPLICACIN DEL PROGRAMA.
En este programa no almacenaremos el texto por teclado en la memoria del ordenador,
sino que la contabilidad de las frecuencias se har a medida que el texto se va introduciendo.
La lnea de cdigo que hace este recuento es:
if(isalpha(C)) Frecuencia[tolower(C)-97]++;
La funcin isalpha() comprueba si el carcter introducido es una letra, si no es as, se ignora
el carcter y no lo contabiliza. En caso positivo, se incrementa en 1 el contador de la letra
correspondiente.
La funcin tolower() nos ahorra tener que distinguir entre maysculas y minsculas ya que
convierte todas las letras en minsculas. Las letras minsculas tienen el cdigo ASCII comprendido
entre 97 y 123, por tanto, cada aparicin de la letra a hace que se incremente Frecuencia[0], cada
aparicin de la letra b hace que se incremente Frecuencia[1] y as sucesivamente.
Por ltimo, una vez se ha salido del bucle de lectura (con Ctrl-Z), se imprime por pantalla la
frecuencia de todas las letras.
Es importante resear que este programa no funciona con caracteres especiales y acentos.

MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 23
11. PRCTICA AMPLIACIN 1: SOPA DE LETRAS.
En esta prctica veremos un ejemplo de punteros en funciones.
11.1. DESARROLLO DE LA PRCTICA.
Imaginemos que tenemos una matriz bidimensional
cuadrada de caracteres de n filas y n columnas, y queremos
encontrar en esta segunda matriz una palabra escondida que
se puede leer en una de las cuatro direcciones siguientes:
Horizontal de izquierda a derecha.
Horizontal de derecha a izquierda.
Vertical de arriba abajo.
Vertical de abajo a arriba.
Por ejemplo, en la siguiente matriz de '7 x 7' podemos encontrar las palabras sopa y lletres.
La primera palabra se encuentra en la ltima columna vertical leyendo de abajo a arriba y la
segunda palabra se encuentra en la ltima fila horizontal leyendo de izquierda a derecha.
Para simplificar no consideraremos las direcciones de las diagonales, aunque esta
consideracin podra formar parte de uno de los proyectos del curso.
La bsqueda de una palabra concreta se debe efectuar en 4n cadenas diferentes (si se
consideran las direcciones de las diagonales, hay 8n-4 cadenas ms). Estas cadenas son:
- n lneas horizontales de izquierda a derecha;
- n lneas horizontales de derecha a izquierda;
- n lneas verticales de arriba abajo;
- n lneas verticales de abajo a arriba.
El programa que se presenta a continuacin permite entrar toda la tabla de caracteres y
despus una palabra. El programa buscar la palabra entrada en las cuatro direcciones, en caso
que se encuentre indicar en cul de las direcciones se encuentra, adems de indicar el nmero
de fila o columna donde se encuentre.
Tambin imprimir toda la tabla, destacando en mayscula los caracteres de la palabra
encontrada.
Crearemos un nuevo archivo del tipo C++ denominado m5pa01.cc con el siguiente cdigo:
I //m6pa1.c - SOPA DE LETRAS -

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

void introduccion_datos(void);
void hor_derecha(char *);
void hor_izquierda(char *);
void ver_abajo(char palabra[]);
void ver_arriba(char palabra[]);
void mostrar_tablero();
void inicializar_tablero();

char tablero[11][11];
unsigned dimension;

MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 24
II int main ()
{
char palabra[11];

introduccion_datos();
do{
printf("Introduzca la palabra a buscar\n");
printf("(Presionar 0+INTRO para acabar)...");
scanf(" %s",palabra);
printf("\n\n");
system("clear");

hor_derecha(palabra);
hor_izquierda(palabra);
ver_abajo(palabra);
ver_arriba(palabra);

mostrar_tablero();
inicializar_tablero();
}
while(*palabra!='0');
return 0;
}

III void hor_derecha(char palabra[])
{
unsigned i,j;
char texto[10];
char *puntero;

for(i=0;i<dimension;i++)
{
for(j=0;j<dimension;j++) texto[j]=tablero[i][j];

if(!(puntero=strstr(texto, palabra))) continue;

for (j=0;j<strlen(palabra);j++) puntero[j]=toupper(puntero[j]);

for(j=0;j<dimension;j++) tablero[i][j]=texto[j];

printf("\n Esta en la fila horizontal derecha %d\n",i);
return;
}
}
IV void hor_izquierda(char palabra[])
{
unsigned i,j;
char texto[10];
char *puntero;

for(i=0;i<dimension;i++)
{
for(j=0;j<dimension;j++) text[dimension-j-1]=tablero[i][j];

if(!(puntero=strstr(text, palabra))) continue;

for (j=0;j<strlen(palabra);j++) puntero[j]=toupper(puntero[j]);

for(j=0;j<dimension;j++) tablero[i][j]=text[dimension-j-1];

printf("\n Esta en la fila horizontal izquierda %d\n",i);
return;
}
}


MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 25
V void ver_abajo(char palabra[])
{
unsigned i,j;
char texto[10];
char *puntero;

for(i=0;i<dimension;i++)
{
for(j=0;j<dimension;j++) texto[j]=tablero[j][i];

if(!(puntero=strstr(texto, palabra))) continue;

for (j=0;j<strlen(palabra);j++) puntero[j]=toupper(puntero[j]);

for(j=0;j<dimension;j++) tablero[j][i]=texto[j];

printf("\n Esta en la fila vertical hacia abajo %d\n",i);
return;
}
}

VI void ver_arriba(char palabra[])
{
unsigned i,j;
char texto[10];
char *puntero;

for(i=0;i<dimension;i++)
{
for(j=0;j<dimension;j++) texto[j]=tablero[dimension-j-1][i];

if(!(puntero=strstr(texto, palabra))) continue;

for (j=0;j<strlen(palabra);j++) puntero[j]=toupper(puntero[j]);

for(j=0;j<dimension;j++) tablero[dimension-j-1][i]=text[j];

printf("\n Esta en la fila vertical hacia arriba %d\n",i);
return;
}
}


VII void introduccion_datos(void)
{
unsigned i;

printf("Introduzca la dimensin de la sopa de letras\n");
scanf(" %d",&dimension);

printf("Introduzca el tablero por filas\n");
for (i=0;i<dimension;i++) scanf(" %s",tablero[i]);
}

VIII void inicializar_tablero()
{
unsigned i,j;

for(i=0;i<dimension;i++)
{
for(j=0;j<dimension;j++)
{
tablero[i][j]=tolower(tablero[i][j]);
}
}
}

MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 26
IX void mostrar_tablero()
{
unsigned i,j;

for(i=0;i<dimension;i++)
{
for(j=0;j<dimension;j++)
{
printf("%c",tablero[i][j]);
}
printf("\n");
}
}
11.2. EXPLICACIN DEL PROGRAMA.
Para facilitar la explicacin del cdigo, se ha separado en 9 partes, la primera consiste en las
declaraciones globales y archivos incluidos, la segunda es la funcin principal y las 7 restantes las
diferentes funciones utilizadas.
La matriz de caracteres que formar la sopa de letras se declara como una matriz global
para poder modificarla desde todas las funciones. Tambin se declara como global la variable
dimensin, que almacena el nmero de filas o columnas de esta matriz.
Las siete funciones de este programa son:
Introduccin_datos(). Esta funcin permite obtener del teclado la dimensin y los
caracteres de la sopa de letras.
hor_derecha(), hor_izquierda(), ver_abajo(), ver_arriba(). Estas cuatro funciones
comprueban si la palabra buscada se encuentra en cada una de las n filas o columnas
correspondientes, en caso afirmativo indica donde la ha encontrado. Tambin cambia
los caracteres encontrados de la palabra a maysculas con la funcin toupper(). De esta
forma, cuando se muestre el tablero por pantalla, se ver destacada la palabra buscada.
mostrar_tablero. Muestra por pantalla el tablero. En el caso que se haya encotrado la
palabra buscada, los caracteres de esta, dentro del tablero, se vern en maysculas.
Inicializar_tablero. Para no tener que buscar otra palabra en la misma sopa de letras,
esta funcin nicamente cambia a minsculas todas las letras. Esto se hace con la
funcin tolower() que es la inversa de toupper().


MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 27
12. EJERCICIOS.
1) Anagramas.
Se dice que una palabra es anagrama de otra si contienen las mismas letras y el mismo
nmero de veces cada una, aunque estn en orden diferente. Ejemplo de palabras que lo son:

En Internet hay buscadores y/o generadores de anagramas.
Escribiremos un programa C/C++ que contenga una funcin denominada int anagramas
(char, char), que recoger dos palabras, de 20 caracteres como mximo y retorne 1 si son
anagramas y 0 en caso contrario.
Denominaremos al programa m6e1.c dentro de la carpeta Mdulo_6.
2) Insertar cadena de caracteres.
Escribiremos una funcin denominada void InsertarCad (char *cadena1, char *cadena2,
int pos) que permita insertar una cadena (cadena2) dentro de otra cadena (cadena1) a partir de
una posicin determinada.
Consideraciones:
Si pos es ms grande que la longitud de cadena1, entonces cadena2 se aadir al final
de cadena1.
Si en cadena1 no hay ningn resultado final, cadena1 se truncar.
Ejemplos para char cadena1[50] y char cadena2[50]:
Si cadena1 vale "Crdito Fundamentos Programacin": InsertarCad(cadena1, "c4 ", 9);
da como resultado "Crdito c4 Fundamentos Programacin".
Si cadena1 vale "Crdito C4": InsertarCad(cadena1, "Fundamentos Programacin", 9); da
como resultado "Crdito C4 Fundamentos Programacin".
Denominaremos al programa m6e2.c dentro de la carpeta Mdulo_6.
3) Los Palndromos.
Escribiremos un programa para reconocer palndromos. Un palndromo es una frase que se
lee igual de derecha a izquierda que de izquierda a derecha. No se tienen en cuenta los espacios.
Ejemplos de palndromos: - Se van sus naves.; - Dbale arroz a la zorra el abad.
El programa debe contener una funcin con el protocolo: int palindromo (char *text);.
Si el texto es un palndromo, la funcin retornar el valor 1, en caso contrario retornar el
valor 0.
En Internet hay buscadores y/o generadores de palndromos.
Denominaremos al programa m6e3.c dentro de la carpeta Mdulo_6.



MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 28
4) Sustitucin.
Escribiremos un programa que implemente la funcin Sustituir, el protocolo del cual ser:
char *Sustituir (char *Texto, char *Viejo, char *Nuevo).
Esta funcin debe buscar en Texto todas las apariciones de la cadena Viejo y las ha de
sustituir por la cadena Nuevo. Debemos tener en cuenta que ambas sern cadenas que no
necesariamente tendrn el mismo tamao. No hace falta comprobacin de lmites. Se supone que
la cadena Texto podr almacenar el resultado final.
Por ejemplo:
Texto="Todos los libros del escritorio son libros mios"
Viejo="libros"
Nuevo="lapices"
Sustituir(Texto, Viejo, Nuevo)="Todos los lapices del escritorio son lapices mios"
Denominaremos al programa m6e4.c dentro de la carpeta Mdulo_6.
12.1. PROBLEMAS COMPLEMENTARIOS.
5) Frecuencia de nmeros.
En la prctica 9, se ha hecho un recuento de letras de un texto introducido por teclado. Si
se ha probado el programa, nos habremos dado cuenta que los caracteres especiales: . , , ,
no los cuenta. La funcin isalpha() no considera a estos caracteres como letras.
Reemplazaremos esta funcin por otra que retorne un 1 en el caso que el argumento sea
un carcter a-z, A-Z, , , , , , , , , , , , , , , , , , , , , , . Tambin haremos que el
programa contabilice los caracteres {a, , , A, , } juntos, etc.
Denominaremos al programa m6e5.c dentro de la carpeta Mdulo_6.
6) Velocidad de escritura.
Haremos u programa que calcule el nmero de pulsaciones por minuto que se estn
escribiendo por teclado.
En el programa debe solicitar la introduccin de un texto. El programa detectar la primera
pulsacin y comenzar a contar el tiempo desde entonces. Para acabar el texto, el usuario deber
teclear CTRL-z. Entonces, el programa deber indicarnos:
1. El nmero total de pulsaciones;
2. El tiempo en segundos empleado;
3. La velocidad expresada en pulsaciones por minuto.
Para poder contar el tiempo tenemos la funcin time() la declaracin de la cual se
encuentra en el archivo de cabecera time.h. Esta funcin retorna el tiempo en segundos.
Si la primera vez que se presiona una tecla se asigna a una variable entera, por ejemplo
Tiempo, el valor de time(NULL): Tiempo=time(NULL);
Cuando se abae de introducir el texto, el tiempo empleado es igual a : time(NUL)-Tiempo
Denominaremos al programa m6e6.c dentro de la carpeta Mdulo_6.


MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 29
7) Palabra ms utilizada.
Escribiremos un programa que dado un texto introducido por teclado, nos diga cul es la
palabra ms utilizada y el nmero de veces que se repite. Se considerar que:
1. Haya al menos una palabra;
2. El espacio en blanco es el carcter separador de palabras;
3. Puede haber ms de un espacio en blanco entre palabras;
4. Los caracteres "//" indicarn el final del texto.
Denominaremos al programa m6e7.c dentro de la carpeta Mdulo_6.
8) Cdigo Morse.
El cdigo Morse fue desarrollado por Samuel Morse en 1832 para el sistema telegrfico.
Este cdigo asigna a cada letra del abecedario y a los dgitos (del 0 al 9) una serie de puntos y
rallas. En los sistemas audibles, el punto representa un sonido corto y la ralla un sonido largo. El
espacio se indica mediante un periodo corto en el que no se transmite ningn sonido.
Consideraciones a tener en cuenta en nuestro programa:
1. Un espacio en blanco separar caracteres;
2. Tres espacios en blanco consecutivos separarn palabras;
3. El carcter "/" indicar el final del texto.
Escribiremos un programa que contenga una funcin para codificar en Morse un texto ledo
por teclado y otro para pasar de Morse a los correspondientes caracteres alfabticos.
Estas son las letras del abecedario y su correspondiente cdigo Morse:

Denominaremos al programa m6e8.c dentro de la carpeta Mdulo_6.

MP 11 UF 01 Mdulo 6 Fundamentos Programacin. Pgina 30
9) Palabra ms utilizada.
En la prctica 1 se ha implementado una funcin que permite invertir una palabra. El hecho
de utilizar la funcin scanf() nos impide utilizarla para invertir frases enteras (cadenas con
espacios). Realizaremos las modificaciones necesarias para permitir esta eventualidad.
Denominaremos al programa m6e9.c dentro de la carpeta Mdulo_6.
10) Coste de un telegrama.
El coste de un telegrama es una cantidad fija multiplicada por el nmero de palabras que
contiene, teniendo en consideracin lo siguiente:
1. Si la palabra contiene ms de 10 letras y menos de 20 cuenta como dos palabras;
2. Si la palabra tiene 20 letras o ms, y menos de 30 la contaremos como 3 palabras;
3. Si la palabra tiene 30 letras o ms, la contaremos como 4 palabras;
4. Puede haber ms de un espacio en blanco entre ellas;
5. El telegrama acaba con el carcter punto ".".
Escribiremos un programa que solicite un telegrama (entrada de texto) y calcule su coste a
razn de 0,10 por palabra.
Denominaremos al programa m6e10.c dentro de la carpeta Mdulo_6.

Vous aimerez peut-être aussi