Pr´
actica 0
Conceptos b´
asicos
Esta pr´actica consiste en la realizaci´on de una serie de ejercicios con el objetivo de repasar conceptos b´asicos de programaci´on.
1.
Normas generales
1.1.
Entrega
1. El ´ultimo d´ıa para entregar esta pr´actica es el mi´ercoles 23 de mayo, hasta las 23:59. No se admitir´an entregas fuera de plazo. Se puede entregar la pr´actica a lo largo de todo el cuatrimestre, aunque es recomendable acabarla lo antes posible.
2. La pr´actica debe tener s´olo un fichero llamado “repaso.cc”.
1.2.
Detecci´
on de plagios/copias
En el Grado en Ingenier´ıa Inform´atica, la Programaci´on es una materia fundamental, que se aprende programando y haciendo las pr´acticas de las diferentes asignaturas (y otros programas, por supuesto). Si alguien pretende aprobar las asignaturas de programaci´on sin programar (copiando), obviamente tendr´a serios problemas para aprobar y para seguir otras asignaturas, y cuando intente trabajar. Concretamente, en Programaci´on 2 es muy dif´ıcil que alguien que no ha hecho las pr´acticas supere el examen de teor´ıa, por lo que copiar una pr´actica es una de las peores decisiones que se puede tomar.
La pr´actica debe ser un trabajo original de la persona que la entrega; en caso de detectarse indicios de copia de una o m´as pr´acticas se tomar´an las medidas disciplinarias correspondientes, informando a la direcci´on de la EPS por si hubiera lugar a otras medidas disciplinarias adicionales.
1.3.
Otras normas
1. La pr´actica se debe entregar exclusivamente a trav´es del servidor de pr´acticas del departamento de Lenguajes y Sistemas Inform´aticos, al que se puede acceder desde la p´agina principal del departamento (www.dlsi.ua.es, “Entrega de pr´acticas”) o directamente en la url https://pracdlsi.dlsi.ua.es.
No se admitir´an entregas por otros medios (correo electr´onico, UACloud, etc.).
El usuario y contrase˜na para entregar pr´acticas es el mismo que se utiliza en el UACloud.
La pr´actica se puede entregar varias veces, pero s´olo se corregir´a la ´ultima entrega (las anteriores entregas no se borran).
2. El programa debe poder ser compilado sin errores con el compilador de C++ existente en la distribuci´on de Linux de los laboratorios de pr´acticas; si la pr´actica no se puede compilar su calificaci´on ser´a 0.
3. La correcci´on de la pr´actica se har´a de forma autom´atica, por lo que es imprescindible respetar estrictamente los textos y los formatos de salida que se indican en este enunciado.
4. Al principio de todos los ficheros fuente entregados se debe incluir un comentario con el nombre y el NIF (o equivalente) de la persona que entrega la pr´actica, como en el siguiente ejemplo:
// NIF 12345678X GARCIA GARCIA, JUAN MANUEL
5. El c´alculo de la nota de la pr´actica y su influencia en la nota final de la asignatura se detallan en las transpa-rencias de la presentaci´on de la asignatura.
2.
Descripci´
on de la pr´
actica
Esta pr´actica consiste en una colecci´on de ejercicios que se describen a continuaci´on; deben aparecer todos en el mismo fichero fuente,repaso.cc, y en dicho fichero no debe haber una funci´onmain en el momento de la entrega. En la web de la asignatura se publicar´a un fichero fuente, mainRepaso.cc,1 con los ejemplos que aparecen en el enunciado, que se puede ampliar con pruebas adicionales, y en el que se pueden comentar los ejercicios que todav´ıa no se haya implementado. Para compilar estemain con el fuenterepaso.ccse debe utilizar esta orden:
g++ -Wall mainRepaso.cc repaso.cc -o main
Para corregir la pr´actica se corregir´a cada ejercicio por separado, a˜nadiendo una funci´on main (en otro fichero fuente, parecido almainRepaso.cc) dise˜nada por los profesores de la asignatura.
2.1.
Ejercicios
1. Sentencia condicional: dise˜na una funci´on que reciba un n´umero entero positivon y devuelvatrue sines m´ultiplo de 2 o de 5, pero no es m´ultiplo de 30; si nno es positivo debe devolver false. El prototipo de la funci´on debe ser el siguiente:
bool multiple2or5not30(int n); Ejemplos:
Llamada Valor devuelto
multiple2or5not30(0) false multiple2or5not30(60) false multiple2or5not30(-20) false multiple2or5not30(230) true
2. Sentencia repetitiva: dise˜na una funci´on que imprima los n´umeros pares de un vector hasta que encuentre en el vector el n´umero51; debe devolver el n´umero de pares que ha impreso por pantalla. El prototipo de la funci´on debe ser el siguiente:
int printPairs(int v[],int maxV);
El par´ametrovtiene el vector de n´umeros, ymaxVindica el n´umero de elementos que hay en el vector.
Nota: debes usar una ´unica sentencia repetitiva (un bucle for o while, no un do-while), y una variable booleana para que termine el bucle.
Ejemplos:
v maxV Salida valor devuelto
(1,−4,−7,2,275,5) 6 -4 2 2
(2,4,−8,0,24,8) 6 2 4 -8 0 24 8 6
(9,7,8,51,3,2) 6 8 1
3. N´umeros impares: dise˜na una funci´on que obtenga los n´umeros impares que contiene un vector, y los almacene en otro vector. El prototipo de la funci´on debe ser el siguiente:
int odds(int v[],int n,int iv[]);
La funci´on debe recorrer el vector v, que tendr´a n n´umeros enteros, y debe almacenar en el vector iv los n´umeros impares (en el mismo orden en que aparecen en v); adem´as, debe devolver la cantidad de n´umeros impares encontrados.2 Ejemplos: v n iv valor devuelto (1,−4,−7,2,275,5) 6 (1,−7,275,5) 4 (2,4,−8,0,24,8) 6 () 0 (9,7,5,3,1) 5 (9,7,5,3,1) 5 1Este fichero no se debe entregar, solamente el fuenterepaso.cc.
4. Tri´angulo: Dise˜na una funci´on que reciba como par´ametro un n´umero entero positivo3e imprima un tri´angulo como los de los ejemplos. El prototipo de la funci´on debe ser el siguiente:
void triangle(int n); Ejemplos: n Salida 1 * 4 * ** * * **** 6 * ** * * * * * * ******
5. N´umeros primos: Dise˜na una funci´on que, dado un n´umero entero n(que ser´a siempre mayor que 0, no es necesario comprobarlo), devuelva el n-simo n´umero primo. Por ejemplo, si n es 1 debe devolver 2(que es el primer n´umero primo), sin es 2 debe devolver 3 (el segundo n´umero primo), sin es 7 debe devolver 17. El prototipo de la funci´on debe ser:
int nPrime(int n);
Debes utilizar una funci´on auxiliar que indique si un n´umero es primo o no,4con el siguiente prototipo: bool isPrime(int n);
6. Descomposici´on de un n´umero en factores: dise˜na una funci´on que reciba como par´ametro un n´umero entero, que debe ser positivo (en caso contrario debe imprimir el mensaje “Error” y nada m´as), y que imprima por pantalla (en una sola l´ınea) la descomposici´on del n´umero en factores primos.5 El prototipo de la funci´on debe ser el siguiente:
void deco(int n); Ejemplos: Llamada Salida deco(264) 2 2 2 3 11 deco(221) 13 17 deco(4123) 7 19 31 deco(-3) Error
Para implementar esta funci´on necesitar´as utilizar la funci´on isPrime del ejercicio anterior, y posiblemente tambi´en la funci´onnPrime.
7. B´usqueda de una subcadena: dadas dos cadenasayb, dise˜na una funci´on que encuentre la primera aparici´on de bdentro de a, y devuelva su posici´on (o -1 si no est´a). Ambas cadenas ser´an vectores de caracteres, con el car´acter especial “\0” que indica el final de la cadena (recuerda que la funci´onstrlendevuelve la longitud de una cadena terminada en “\0”). Por ejemplo, sia es"hola caracola"yb es"la", la funci´on debe devolver 2. El prototipo de la funci´on es:
int search(const char a[],const char b[]); 3Si no es positivo no debe imprimir nada.
4Un n´umero es primo si es mayor que 1 y solamente es divisible por s´ı mismo y por 1. Por tanto, el 1 no es primo (ni el 0, por supuesto).
Debes implementar esta funci´on sin utilizar funciones est´andar de las librer´ıas del compilador (exceptostrlen), el objetivo es que practiques el manejo de cadenas.
8. Sustituci´on: dise˜na una funci´on que, dada una cadena, sustituya un car´acter por una cadena, y devuelva el n´umero de sustituciones realizadas. Puedes asumir que el vector que almacena la cadena original tiene espacio suficiente para almacenar la cadena resultante de la sustituci´on, y no puedes utilizar vectores auxiliares ni string, debes realizar las sustituciones sobre la propia cadena. El prototipo de la funci´on debe ser:
int subs(char cad[],char c,char sus[]);
Ejemplos:
Llamada cad valor devuelto
subs("hola",’o’,"abuE") "habuEla" 1 subs("como comes",’o’,"OO") "cOOmOO cOOmes" 3 subs("coomo comes",’o’,"oo") "coooomoo coomes" 4
Nota: en este caso concreto, es recomendable utilizar bucleswhileen lugar de buclesforcuando el recorrido de la cadena podr´ıa no ser lineal, es decir, si es necesario hacersaltos en el recorrido.
9. Extracci´on de datos: Dado el siguiente registro con datos de cazas espaciales const int MAXMODEL=20;
struct Fighter { char model[MAXMODEL]; int speed; int attack; int shield; };
dise˜na una funci´on que extraiga los datos de un caza espacial a partir de una cadena como la del siguiente ejemplo:
X-Wing : 120 (75,80)
donde “X-Wing” es el modelo, “120” es la velocidad, “75” la capacidad de ataque (attack) y “80” la fuerza de los escudos (shield). El n´umero de espacios en blanco puede variar, pero el formato ser´a siempre correcto (no es necesario comprobarlo).6
El prototipo de la funci´on debe ser el siguiente: void extractData(char cad[],Fighter &fighter);
Notas:
La cadena con los datos terminar´a en “\0”.
Los n´umeros no tendr´an signo, no es necesario tenerlo en cuenta.
El modelo no contendr´a espacios en blanco ni “:”, pero s´ı cualquier otro car´acter. Tampoco habr´a espacios en blanco antes del modelo.
El nombre del modelo debe almacenarse como una cadena, es decir, terminado en “\0”. Si el nombre completo (a˜nadiendo el “\0”) no cabe en el campomodel, se deberecortar para que quepa (incluyendo el “\0”).
Para convertir una cadena en un n´umero entero se puede usar la funci´onatoi(aunque tambi´en se puede hacer con un bucle).
6Para hacer bien esa comprobaci´on se necesitan unos conocimientos que se imparten en la asignaturaProcesamiento de Lenguajesde cuarto curso.
10. Matriz de binarios: dada una cadena de caracteres (acabada en “\0”) con varios n´umeros en binario separados por “\n”, dise˜na una funci´on que convierta a decimal e imprima los n´umeros binarios, comprobando a la vez que todos tienen el mismo n´umero de bits (debe ser el n´umero de bits que tenga el primer n´umero).
Por ejemplo, si la cadena es "010\n110\n001\n101", debe imprimir:
2 6 1 5
El ´ultimo n´umero puede o no llevar “\n” al final, y si se detecta un error se debe imprimir el mensaje “Error” y terminar de procesar la cadena; por ejemplo, si la cadena fuera "0010\n1001\n000101\n0101\n", se debe imprimir:
2 9 Error
El prototipo de la funci´on debe ser el siguiente: void convertBinary(char cad[]);
Puedes asumir que en la cadena solo habr´a “0”, “1” y “\n”, y que el primer n´umero tendr´a al menos un bit (es decir, el primer car´acter no va a ser “\n”). No es imprescindible hacer una funci´on auxiliar para convertir una cadena de binario a decimal, aunque est´a permitido.