DEPARTAMENTO DE CIENCIAS DE LA TIERRA Y CONSTRUCCIÓN Ingeniería Civil
FUNDAMENTOS DE PROGRAMACION Deber Nº 2 “Capitulo 3 y 4” INTEGRANTES: Rebeca Cayo Paola Guevara María Fernanda Padilla
NRC: 3106
FECHA: 2017/Jun/25 Sangolquí-Ecuador
1
CAPITULO III - “Operadores y Expresiones” CUESTIONES DE REPASO 3.1 ¿Qué es una expresión? ¿Cuáles son sus componentes? Expresión Es una expresión que representa a una unidad de datos simples, (número o carácter). Representan las condiciones lógicas (ciertas o falsas). En C, las condiciones cierto y falso son representadas por los valores enteros 0 y 1, respectivamente. Por tanto, representan cantidades numéricas. Componentes Expresión – Entidad Simple: Manifestado como: constante, variable, elemento de un array o una referencia a una función. Expresión – Combinación: Usando expresiones de identidades interconectadas por uno o más operadores. 3.2 ¿Qué es un operador? Describir ciertos tipos de operadores de C. Operador Un operador es un símbolo (+, -, *, /, etc.) que tiene una función predefinida (suma, resta, multiplicación, etc.). Operadores en C Operadores Aritméticos Son los operadores básicos, (adición, sustracción, multiplicación, división, resto de división entera). Operadores Monarios Clase de operadores que actúan un solo operando para producir un nuevo valor. Operadores Relacionales y Pertenecen al mismo grupo de precedencia lógicos (menor a los de operadores aritméticos y monarios). Entre ellos constan (<,>,<=,>=,==, !=) Operadores de Asignación Permite formar expresiones de asignación, asignando el valor de una expresión a un identificador. Operador Condicional Permite la operación de expresiones condicionales 3.3 ¿Qué es un operando? ¿Cuál es la relación entre operadores y operandos? Un operando son los datos sobre los que actúan los operadores. 2
Relación Los operadores (generalmente aritméticos) son los que actúan sobre los operandos. 3.4 Describir los cinco operadores aritméticos de C. Mencionar las reglas asociadas a su utilización. Operador Descripción + Adición Sustracción * Multiplicación / División % Resto de división entera Reglas Los operandos sobre los que actúan los operadores aritméticos, deben representar valores numéricos Los operandos deben ser cantidades enteras, de coma flotante o caracteres El operador módulo (%) requiere que los dos operandos sean enteros y el segundo operador no nulo. El operador de división (/) requiere que el segundo operando sea no nulo, aunque los operandos no necesitan ser enteros. La división entera siempre tiene como resultado el cociente entero truncado (desprecia la parte decimal del cociente). Si una operación de división se lleva se da con dos números de coma flotante, o con un número de coma flotante y un entero, el resultado será un cociente en coma flotante. 3.5 Mencionar las reglas que se aplican a expresiones con operandos de tipos distintos. Si los dos operandos son de tipo de coma flotante con precisión distinta (un float y un double), el operando de menor precisión se transformará a la precisión del otro operando y el resultado se expresará con esta precisión (la más alta de las dos). Por tanto, una operación entre un float y un double dará como resultado un double; un float y un long doublé dará lugar a un long doublé y un double y un long double producirán un long double. Si un operando es de tipo de coma flotante (por ejemplo float, double o long double) y el otro es un char o un int (incluyendo short int long y long int), el char/int se convertirá al tipo de coma flotante del otro operando, y el resultado se expresara de igual forma. Por tanto, una operación entre int y un double tendrá como resultado un double. Si ninguno de los operandos es del tipo de coma flotante pero uno es un long int, el otro se transformara en long int y el resultado será long int. Por 3
consiguiente una operación entre un long int y un int tendrá como resultado un long int. Si ningún operando es del tipo de coma flotante ni long int, ambos operandos se convierten en int (si es necesario) y el resultado será int. Así una operación entre un short int y un int tendrán como resultado un int.
3.6 ¿Cómo se puede cambiar el valor de una expresión a un tipo de datos diferente? ¿Cómo se llama a esto? Se puede convertir el valor resultante de una expresión a un tipo de datos diferente. Se debe hacer lo siguiente: La expresión debe ir precedida por el nombre de del tipo de datos deseado, encerrado con paréntesis, esto es: (tipo datos) expresion Se denomina a esta construcción, Construcción de Tipos o Cast. 3.7 ¿Qué se entiende por precedencia de operadores? ¿Cuáles son las precedencias relativas de los operadores aritméticos? Las precedencias de operadores es el orden de evaluación (es como un orden jerárquico, para la ejecución de los operandos) Primer se ejecutan las operaciones de multiplicación, división y resto, antes de las de adición y sustracción. 3.8 ¿Qué se entiende por asociatividad? ¿Cuál es la asociatividad? ¿Cuál es la asociatividad de los operadores aritméticos? La asociatividad es cuando se considera el orden en que se realizarán operaciones consecutivas del mismo grupo de precedencia. La asociatividad es de izquierda a derecha. Asociatividad en operadores aritméticos. Las operaciones consecutivas de adición y sustracción sr realizan de izquierda a derecha, así como las operaciones consecutivas de multiplicación, división y resto. 3.9 ¿Cuándo se deben incluir paréntesis en una expresión? ¿Cuándo se debe evitar el uso de paréntesis? Incluir paréntesis Cuando se quiere modificar la precedencia natural de las operaciones, o para hacer más clara una expresión, aunque no sean necesarios. Evitar paréntesis Para evitar expresiones sobrecargadas (paréntesis anidados). 3.10 ¿En qué orden se llevan a cabo las operaciones en una expresión que contiene paréntesis anidados?
4
Cuando existen paréntesis anidados se empieza resolviendo desde los paréntesis más internos hasta los paréntesis más externos. 3.11 ¿Qué es un operador monario? ¿Cuantos operandos van asociados a un operador monario? Un operador Monario es una clase de operadores que actúan un solo operando para producir un nuevo valor. Van asociados dos operandos. 3.12 Describir los seis operadores monarios tratados en este capítulo. ¿Cuál es el propósito de cada uno de ellos? Operador ++ --
Propósito Menos Unario: Es el signo que va delante de una variable o constante o expresión Operador Incremento: Hace que la variable, constante o expresión aumente en uno. Operador Decremento: Hace que la variable, constante o expresión disminuya en uno.
3.13 Describir dos formas distintas de utilizar los operadores de incremento y decremento ¿Cuál es la diferencia entre ellas? Se pueden escribir de dos formas distintas, dependiendo de donde se escriba el operador, antes o después del operando. Diferencia Si el operador precede al operando (++i), el valor del operando se modificará antes de que se utilice con otro propósito. Si el operador sigue al operando (i++), el valor del operando se modificará después de ser utilizado. 3.14 ¿Cómo es la precedencia de los operadores monarios en relación con la de los operadores aritméticos? ¿Cuál es su asociatividad? Precedencia de operadores monarios, en relación de operadores aritméticos. Los operadores monarios tienen mayor precedencia que los operadores aritméticos. Por tanto, si un operador monario menos actúa sobre una expresion aritmética que contiene uno o más operadores aritméticos, la operación monaria menos será la primera llevada a cabo (a menos por su puesto, que la expresion aritmética este cerrada entre paréntesis). Asociatividad La asociatividad de los operadores monarios es también de izquierda a derecha, aunque es raro que aparezcan en programas sencillos, operadores monarios consecutivamente. 5
3.15 ¿Cómo se pueden determinar el número de bytes que ocupan cada tipo de datos en un determinado compilador de C? Se reserva 2 bytes para cada cantidad entera, 4 bytes para cada cantidad de coma flotante, 8 bytes para cantidad de doble precisión y 1 byte para cada carácter. Estos valores varían de una versión de C a otra. 3.16 Describir los cuatro operadores de relación o relacionales de C ¿Con que tipo de operandos se pueden utilizar? ¿Qué tipo de expresión se obtiene? Operador Significado < Menor que <= Menor o igual que > Mayor que >= Mayor o igual que Se ocupan con los operandos de números enteros o de coma flotante. Se obtiene una expresion en forma de comparación entre dos operandos. 3.17 Describir los dos operandos de igualdad de C. ¿En qué se diferencian de los operadores de relación? OPERANDOS DE IGUALDAD Operador Significado == Igual que != NO Igual que Se diferencian en que estos operadores se encuentran en otro grupo de precedencia, por debajo de los operadores relacionales. 3.18 Describir los dos operandos lógicos de C. ¿Cuál es el propósito de cada uno de ellos? ¿Con que tipo de operandos se pueden utilizar? ¿Qué tipo de expresión se obtiene? Denominados también Conectivas Lógicas. Operador Significado && Y || O Los operadores lógicos actúan sobre operandos que son a su vez expresiones lógicas Operandos con los que se puede utilizar Combinar expresiones lógicas individuales, formando otras condiciones lógicas más complicadas que pueden ser ciertas o falsas. Expresión que se obtiene Se obtienen resultados ciertos si los operandos son ciertos, el resultado será dalso si los operandos son falsos. Independientemente que sean operadores y lógica u o lógica. 6
3.19 ¿Cuáles son las precedencias relativas de los operadores de relación de igualdad y lógicos entre sí? ¿Y respecto a los operadores aritméticos y los monarios? ¿Cuáles son sus asociatividades? Precedencia La y lógica tiene mayor precedencia que la o lógica. Los dos grupos de precedencia se encuentran por debajo del grupo que contiene los operadores de igualdad. Con respecto a los operadores aritméticos y los monario también se encuentra bajo ellos. El monario !, en esta ocasión toma el nombre de operador no lógica. Asociatividad La asociatividad es de izquierda a derecha. 3.20 Describir el operador no lógica (negación lógica) ¿Cuál es su propósito? ¿En qué grupo de pertenencia está incluido? ¿Cuántos operandos requiere? ¿Cuál es su asociatividad? Un operador no lógico es un monario !; el que niega el valor de una expresión lógica, es decir, hace que una expresión que era originalmente cierta se haga falsa y viceversa. Grupo de pertenencia Esta dentro del grupo de operadores lógicos, puesto que es una negación de la lógica. Numero de operandos que requiere Requiere mínimo de 2, para poderlos comparar entre sí. Asociatividad La asociatividad es de izquierda a derecha; al igual que el de los operadores lógicos. 3.21 Describir los seis operadores de asignación tratados en este capítulo ¿Cuál es el propósito de cada uno de ellos? OPERADORES DE ASIGNACIÓN Operador Propósito = Igualar a las dos expresiones. Igualar a las expresiones pero a la primera expresión sumarle a la += otra. expresion1+=expresion2 → expresion1=expresion1+expresion2 Igualar a las expresiones pero a la primera expresión restarle a la -= otra. expresion1-=expresion2 → expresion1=expresion1-expresion2 Igualar a las expresiones pero a la primera expresión multiplicarle *= a la otra. expresion1*=expresion2 → expresion1=expresion1*expresion2 Igualar a las expresiones pero a la primera expresión dividirle a la /= otra expresion1/=expresion2 7
%=
→ expresion1=expresion1/expresion2 Igualar a las expresiones pero a la primera expresión le operaciono el resto con la otra expresion. expresion1%=expresion2 → expresion1=expresion1%expresion2
3.22 ¿Cómo se determina el tipo de una expresión de asignación cuando los dos operandos son de tipos diferentes? ¿En qué sentido puede ser esto a veces una fuente de errores de programación? Es un identificador o un array Error Al sentido de confundirse y mandarle al igual primero, si se plantea así la ejecución, no se da. 3.23 ¿Cómo se pueden describir múltiples asignaciones en C? ¿En qué orden se realizarán las asignaciones? Descripción Identificador1=identificador2=……………=expresion Identificador1=identificador2=expresion Es equivalente a: Identificador1=(identificador2=expresion) Orden de las asignaciones múltiples. La asiganción multiple se efectúa de derecha a izquierda. 3.24 ¿Cuál es la precedencia de los operadores de asignación en relación con otros operadores? ¿Cuál es su asociatividad? Precedencia de operadores de asignación Los operadores asignación tienen menor precedencia que el resto de los operadores. Por tanto, las operaciones monarias, aritmética, de relación, de igualdad, y lógicas se realizan antes que las operaciones de asignación. Asociatividad Las operaciones de asignación tiene asociatividad de derecha a izquierda; la jerarquía de operadores atendiendo a su precedencia se pueden modificar para incluir los operadores de asignación 3.25 Describir el uso del operador condicional para formar expresiones condicionales ¿Cómo se evalúa una expresión condicional? Uso del Operador Condicional Se usa para la formación de expresiones relacionadas a una expresion condicional. Evaluación de una expresion condicional Para la evaluación, la expresión es evaluada primero, si expresion 1 es cierta (si valor es no nulo), entonces expresion2 es evaluada y este es el valor de la expresion 8
condicional. Sin embargo, si expresion1 es falsa (si su valor es 0), entonces es evaluada ecpresion3, y este es el valor de la expresion condicional. Nota: Solo se evalúa una delas expresiones (expresion 2 o expresion3), cuando se determina el valor de una expresion condicional. 3.26 ¿Cómo se determina el tipo de una expresión condicional cuando sus operandos son de tipos diferentes? Si los operadores (expresion2 expresion3) son de tipo diferente, el tipo de datos de la expresión condicional, se determinara de acuerdo con las siguientes reglas Categoría de Operador Operador Asociatividad -++--!sizeof(tipo) Operadores Monarios D→I +/% Multiplicación, División y Resto I→D Aritméticos +Suma y Sustracción aritméticas I→D <<=>>= Operadores Relacionales I→D ==!= Operadores de Igualdad I→D && Y lógica I→D || O lógica I→D ?: Operador Condicional D→I =+=-=*=/=%= Operadores de Asignación D→I 3.27 ¿Cómo se puede combinar el operador condicional con el operador de asignación para formar una sentencia del tipo “if-else”? Se le combinan con los dos puntos, porque al fin y al cabo los dos son condicionales. 3.28 ¿Cuál es la precedencia del operador condicional en relación con los otros operadores descritos en este capítulo? ¿Cuál es su asociatividad? Precedencia El operador condicional, tiene su propia precedencia, justamente superior a los operadores de asignación. Asociatividad La asociatividad es de derecha a izquierda. 3.29 Describir, en términos generales, las clases de operaciones y cálculos realizados por las funciones de biblioteca de C Hay funciones de biblioteca para realizar las operaciones estándar de entra/salida (leer y escribir caracteres, leer y escribir números ,abrir y cerrar archivos, determinar la condición del fin de archivo, etc.), funciones que realizan operaciones sobre caracteres, funciones que realizan operaciones en cadena de caracteres, y funciones que realizan varios cálculos matemáticos(evaluación de funciones 9
trigonométricas, logarítmicas). También existen funciones de biblioteca de otros tipos, archivados en las librerías que me generan otro tipo de funciones. 3.30 ¿Son realmente parte del lenguaje C las funciones de biblioteca? Explicarlo. No, no son parte, son parte de la matemática pero que nos permite desarrollar las funciones en lenguaje C. 3.31 ¿Cómo se suelen encontrar agrupadas generalmente las funciones de biblioteca en un compilador de C? Las funciones de biblioteca de propósitos relacionados se suelen encontrar agrupadas en programas objeto en archivo de biblioteca separado. Estos archivos de biblioteca se proporcionan como parte de cada compilador de C. Todos los compiladores de C contienen los mismos grupos de funciones de biblioteca, aunque no exista una normalización precisa, por tanto existe una diferencia en las funciones de biblioteca dadas por las diferentes versiones de lenguaje. 3.32 ¿Cómo se accede a las funciones de biblioteca? ¿Cómo se pasa información a una función de biblioteca desde el punto de acceso? Se accede a una función de biblioteca simplemente escribiendo el nombre de la función seguido de una lista de argumentos (deben estar encerrados entre paréntesis y separados por coma) que representan información que se le pasa a la función. Los paréntesis deben estar presentes aunque no haya argumentos. 3.33 ¿Qué es un argumento? ¿Cómo se escribe los argumentos? ¿Cómo se escribe una llamada a una función de biblioteca sino hay argumentos? Argumento Representan la información que se le pasa a la función. Escritura de los argumentos Deben estar encerrados entre paréntesis y separados por coma. Los paréntesis deben estar presentes aunque no haya argumentos. 3.34 ¿Cómo se almacena la información que pueden requerir las funciones de biblioteca? ¿Cómo se introduce esta información en un programa en C? Se almacena la información en ciertos archivos que se proporcionan con el compilador. Por lo que la información requerida se úede obtener simplemente accediendo a estos archivos, esto se ejecuta declarado #include Introducción en un programa en C. #include 3.35 ¿Dentro de que categoría general se encuentran las sentencias #include y #define? 10
Se encuentran dentro de la sentencia del preprocesador.
11
PROBLEMAS 3.36. Supongamos que a, b y c son variables enteras que tiene asignados los valores a=8, b=3, y c=-5. Determinar el valor de cada una de las expresiones aritméticas. a) a+b+c
b)
2*b+3*(a-c)
c)
a/b 12
d)
a%b
e)
a/c
13
f)
a%c
g)
a*b/c
14
h)
a*(b/c)
i)
(a*c)%b
15
j)
a*(c%b)
3.37. Supongamos X, Y, y Z variables de coma flotante que tienen asignados los valores x=88, y=3.5 Y z=-5.2. Determinar el valor de cada una de las siguientes expresiones aritméticas.
16
a) x+y+z
b) 2*y+3*(x-z)
c)
x/y
17
d)
x%y
No se ejecuta porque incumple la regla del operador de modulo o resto (deben ser los dos operandos números enteros) e) x/(y+z)
18
f)
(x/y)+z
g)
2*x/3*y
19
h)
2*x/(3*y)
3.38. Supongamos c1, c2 y c3 variables de tipo de carácter que tienen asignados los caracteres E, 5 e ?, respectivamente. Determinar el valor numérico de las siguientes expresiones, basándose en el conjunto de caracteres ASCII (ver tabla 2.1) a) c1
20
b) c1-c2+c3
c) c2-2
21
d) c2-‘2’
e) 3+’#’
22
f) c1%c3
g) ‘2’+’2’
23
h) (c1/c2)*c3
i)
3*c2
24
j)
‘3’*c2
3.39. Un programa en C con tiene las siguientes declaraciones: int i,j; long ix; short s; float x; double dx; char c; Determinar el tipo de datos de cada una de las siguientes expresiones: 25
a) i+c int b) x+c float c) dx+x float d) ((int)dx)+ix long double e) i+x float f) s+j int g) ix+j int h) s+c int i) ix+c float 3.40. Un programa en C contiene las siguientes declaraciones y asignaciones iniciales: int i=8,j=5; float x=0.005,y=-0.01; char c=’c’, d=’d’; Determinar el valor de cada una de las siguientes expresiones. Utilizar los valores asignados inicialmente a las variables para cada expresión. a) (3*i-2*j)%(2*d-c)
b) 2*((i/5)+(4*(j-3))%(i+j-2))
26
c) (i-3*j)%(c+2*d)/(x-y)
d) -(i+j)
27
e) ++i
f) i++
28
g) –j
h) ++x
29
i) y--
j) i<=j
30
k) c>d
l) x>=0
31
m) x
n)
j!=6
32
o) c==99
p) 5*(i+j)>’c’
33
q) (2*x+y)==0
r) 2*x+(y==0)
34
s) 2*x+y==0
t) !(i<=j)
35
u) !(c==99)
v) !(x>0)
36
w) (i>0)&&(j<5)
x) (i>0)||(j<5)
37
y) (x>y)&&(i>0)||(j<5)
z) (x>y)&& (i>0)&&(j<5)
38
3.41. Un programa en C contiene las siguientes declaraciones y asignaciones iniciales: int i=8, j=5, k; float x=0.005, y=-0.01,z; char a,b,c=’c’,d=’d’; Determinar el valor de cada una de las siguientes expresiones. Utilizar para cada expresión el valor inicial asignado a las variables. a) k=(i+j)
39
b) z=(x+y)
c) i=j
d) k=(x+y)
40
No se ejecuta la suma puesto que k está declarada como entero y sus operandos son decimales. e) k=c
f) z=i/j
41
g) a=b=d
h) i=j=1.1
42
i) z=k=x
j) k=z=x
43
k) i+=2
l) y-=x
44
m) x*=2
n) i/=j
45
o) i%=j
p) i+=(j-2)
46
q) k=(j==5)?i:j
r) k=(j>5)?i:j
47
s) z=(y>=0)?x:0
t) z=(y>=0)?y:0
48
u) a=(c
v) i-=(j>0)?j:0
49
3.42. Cada una de las siguientes expresiones utiliza una función de biblioteca. Identificar el propósito de cada expresión (Ver en el Apéndice H una lista de funciones de biblioteca) a) abs(1-2*j) Devolver el valor absoluto de j. b) fabs(x+y) Devolver el valor absoluto de x+y c) isprint(c) Toma un solo argumento en forma de un entero y devuelve un valor de tipo entero. d) isdigit (c) Comprueba si el carácter pasado es un carácter de dígito decimal. e) toupper(d) Convertir una letra a mayúscula la letra d f) ceil(x) Redondear por exceso al entero más próximo (el entero más pequeño que sea mayor o igual a x) g) floor(x+y) Redondear por defecto al entero más próximo (el entero más grande que no sea mayor que x+y) h) islower (c) Comprueba sin un carácter es de tipo minúscula. i) isupper(j) Comprueba si el parámetro c es una letra alfabética en mayúsculas. j) exp(x) Elevar e a la potencia x k) log(x) Devolver el logaritmo natural de x 50
l) sqrt(x*x+y*y) Devolver la raíz cuadrada de (x*x+y*y) m) isalnum(10*j) Comprueba si j es un dígito decimal o una letra mayúscula o minúscula.
n) isalpha(10*j) Comprueba si c es una letra alfabética o) isascii(10*j) Comprueba sin un carácter pertenece al ASCII de 7 bits. p) toascii(10*j) Convertir el valor del argumento a ASCII q) fmod(x,y) Devolver el resto de x/y, con el mismo signo de x. r) tolower(65) Convertir una letra a minúscula. s) pow(x-y, 3.0) Devuelve x-y elevado a la potencia de 3 t) sin(x-y) Devolver el seno de x-y u) strlen(“hola\0”) Obtiene la longitud de un string v) strpos(“hola\0”,’e’) Encuentra la posición de la primera aparición de una cadena dentro de otra cadena 3.43. Un programa en C contiene las siguientes declaraciones y asignaciones iniciales: int i=8, j=5; double x=0.005, y=-0.01; float x=0.005, y=-0.01,z; char c=’c’,d=’d’; Determinar el valor de cada una de las siguientes expresiones, que hacen uso de funciones de biblioteca (Ver en el Apéndice H una lista de funciones de biblioteca) a) abs(1-2*j)
51
b) fabs(x+y)
c) isprint(c)
52
d) isdigit (c)
e) toupper(d)
53
f) ceil(x)
g) ceil(x+y)
54
h) floor(x)
i) floor(x+y)
55
j) islower (c)
k) isupper(j)
56
l) exp(x)
m) log(x)
57
n) log(exp(x))
o) sqrt(x*x+y*y)
58
p) isalnum(10*j)
q) isalpha(10*j)
59
r) isascii(10*j)
s) toascii(10*j)
60
t) fmod(x,y)
u) tolower(65)
61
v) pow(x-y, 3.0)
w) sin(x-y)
62
x) strlen(“hola\0”)
y) strpos(“hola\0”,’e’)
63
z) sqrt(sin(x)+cos(y))
3.44. Determinar de cuales de las funciones de biblioteca mostradas en el apéndice H dispone la versión de C. ¿Se dispone de algunas de las funciones con un nombre distinto? ¿Qué archivos cabecera se requieren? De todas las mostradas anteriormente. Si porque varía según cada procesador. Nombrar correctamente las librerías. Dispone de las funciones de la librería #include 64
CAPITULO IV CUESTIONES DE REPASO 4.1
¿Cuáles son las funciones de entrada/salida más comúnmente usadas en C? ¿Cómo se accede a ellas?
Las funciones más usadas en C son: getchar, putchar, scanf, printf, gets y puts. Se puede acceder a una de estas funciones de entrada/salida desde cualquier sitio de un programa con escribir el nombre de la función, seguido de una lista de argumentos entre paréntesis. 4.2
¿Cómo se llama el archivo de cabecera de entrada/salida estándar en la mayoría de las versiones de C? ¿Cómo se puede incluir el archivo en un programa?
El archivo de cabecera estándar en C se llama stdio.h y se incluye mediante la instrucción #include al comienzo del programa. 4.3
¿Cuál es el propósito de la función getchar? ¿Cómo se utiliza dentro de un programa en C?
Mediante la función getchar se puede conseguir entrada de caracteres uno a uno, devuelve un carácter leído del dispositivo de entrada estándar, la función se utiliza sin un argumento, solo es necesario un par de paréntesis vacíos que sigan a la palabra getchar. 4.4
¿Qué ocurre cuando se da la condición de fin de archivo al leer caracteres con la función getchar? ¿Cómo se reconoce la condición de fin de archivo?
si se encuentra una condición de fin de archivo cuando se lee un carácter con la función getchar, esta devolverá un valor de la constante simbólica EOF, que es normalmente de -1 definido dentro del archivo stdio.h. La detección de la condición EOF se puede efectuar utilizando la instrucción if-else. 4.5
¿Cómo se puede utilizar la función getchar para leer cadenas de caracteres?
Se la puede utilizar leyendo, en un bucle, la cadena carácter a carácter. 4.6
¿Cuál es el propósito de la función putchar? ¿Cómo se utiliza dentro de un programa en C? compararla con la función getchar?
Es la función complementaria de la función getchar. Transmite un carácter al dispositivo de salida estándar. Esta función se utiliza con una variable de carácter que hace referencia a una variable previamente declarada, la cual se la expresa entre paréntesis luego de la palabra putchar. 4.7
¿Cómo se puede utilizar la función putchar para escribir cadenas de caracteres?
Se puede escribir cadenas de caracteres mediante un bucle utilizando una instrucción for. 4.8
¿Qué es un array de tipo carácter? ¿Qué representa cada elemento de un array de tipo carácter? ¿cómo se utilizan los arrays de tipo carácter para representar cadenas de caracteres?
El array de tipo carácter es una variable que contiene elementos que define el programador, cada elemento representa los caracteres de una línea de texto, los array de tipo carácter se utilizan escribiendo la variable, corchetes con el tamaño de los elementos de la cadena de carácter más 1 por el carácter nulo, n igual y el texto. 65
4.9
¿Cuál es el propósito de la función scanf? ¿Cómo se utiliza dentro de un programa en C? Compararla con la función getchar.
Introduce datos en una computadora, puede introducir cualquier combinación de valores numéricos, caracteres individuales y cadenas de caracteres, la función devuelve el numero de datos que se han conseguido introducir correctamente. Se utiliza escribiendo scanf y entre paréntesis la definición de dato, seguido de coma y el nombre de la variable. 4.10 ¿Cuál es el propósito de una cadena de control en la función de scanf? ¿Qué tipo de información aporta? ¿De qué está compuesta la cadena de control? La cadena de control hace referencia a una cadena de caracteres que contiene cierta información sobre el formato de los datos. La cadena de control está compuesta por grupos individuales de caracteres, con un grupo de caracteres por cada dato de entrada. 4.11 ¿Cómo se identifica cada grupo de caracteres dentro de la cadena de control? ¿Cuáles son los caracteres constituyentes de un grupo de caracteres? Se identifica cada grupo de caracteres con el signo % seguido de un carácter de conversión que indica el tipo de dato correspondiente, estos mismos se definen como los caracteres constituyentes de un grupo de caracteres. 4.12 Si una cadena de control dentro de una función scanf contiene varios grupos de caracteres, ¿Cómo se separan los grupos de caracteres? ¿Se requieren caracteres de espaciado? Los diferentes grupos de caracteres, dentro de una función de control, pueden estar seguidos o separados por caracteres de espaciado: espacios en blanco, tabuladores o caracteres de nueva línea. 4.13 Si existen caracteres de espaciado dentro de una cadena de control, ¿Cómo se interpretan? Los caracteres de espaciado se interpretan, dentro de una cadena de control, como separaciones de grupos de caracteres. 4.14 Comentar el significado de los caracteres de conversión utilizados más frecuentemente en la cadena de control de la función scanf.
Caracteres de conversión
Significado
66
4.15 ¿Qué símbolos especiales se deben incluir con los argumentos, además de la cadena de control, en la función scanf? ¿En qué se diferencia el tratamiento de los arrays de los restantes argumentos? Cada nombre de variable debe ser precedido por un ampersand (&) que indican donde se sitúan los datos en la memoria del computador, esto a excepción de los arrays, los cuales no van precedidos del ampersand. 4.16 Cuando se introducen los datos mediante la función scanf, ¿Qué relaciones debe haber entre los datos y los argumentos correspondientes? ¿Cómo se separan varios datos entre sí? El dato y el argumento correspondiente se relacionan en que el dato indica lo que el argumento significa, sea un entero, carácter, cadena de caracteres, etc. Varios datos se separan entre sí por un carácter de espacio, aunque existe una excepción en las conversiones de tipo c. 4.17 Cuando se introducen datos mediante la función scanf, ¿deben ir precedidos los datos octales de 0? ¿deben ir precedidos de 0x (o 0X) los datos hexadecimales? ¿cómo se deben escribir los datos en coma flotante? Los datos octales no necesitan ir precedidos de un 0, y los valores hexadecimales tampoco necesitan ir precedidos por 0x o 0X. Los valores en coma flotante deben incluir o un punto decimal o un exponente (o ambos). 4.18 Cuando se introduce una cadena de caracteres mediante la función scanf utilizando conversión tipo s, ¿Cómo finaliza la cadena? La cadena finaliza en un caracter de espaciado. 4.19 Cuando se introduce una cadena de caracteres mediante la función scanf, ¿Cómo se puede introducir una cadena de caracteres que contenga caracteres de espaciado? Para introducir una cadena de caracteres mediante la función scanf, la conversión de caracteres tipo s dentro de la cadena de control es reemplazada por una secuencia de caracteres encerrados entre corchetes, designada como […]. Los caracteres de espaciado se pueden incluir dentro de los corchetes, pudiéndose por tanto acomodar a cadenas que contengan dichos caracteres. 4.20 Idear un método para la introducción de cadenas de caracteres de longitud indeterminada que contenga caracteres de espaciado y todos los caracteres imprimibles, y que termine al pulsar el retorno de carro. Responder a la cuestión de 67
forma relativa al tipo de conversión requerido en la cadena de control de una función scanf. #include void main() { char línea [80] ........ Scanf(“ %[^\n]”, linea); ........ } 4.21 ¿Qué se entiende por campo? Es el conjunto de los caracteres consecutivo que no son de espaciado y que componen un dato. 4.22 ¿Cómo se puede especificar la longitud de campo máxima para un dato dentro de la función scanf? Para especificar la longitud de campo máxima, se introduce en la cadena de control un entero sin signo que indica la longitud de campo, entre el signo de % y el carácter de conversión. 4.23 ¿Qué ocurre si un dato de entrada contiene más caracteres que la longitud de campo máxima fijada? ¿y si el dato contiene menos caracteres? Si el dato contiene más caracteres de la longitud de campo máxima, no se leerán los caracteres que se encuentren más allá de la longitud especificada; si el dato contiene menos caracteres no sucederá nada. 4.24 ¿Cómo se pueden indicar los argumentos enteros cortos, enteros largos y de doble precisión en la cadena de control de la función scanf? Una L minúscula l se utiliza para indicar un argumento entero largo o uno de doble precisión y se utiliza una h para indicar un entero corto tanto con signo como sin signo. 4.25 ¿Cómo se pueden indicar los argumentos long double dentro de la cadena de control de la función scanf? ¿se dispone de esta posibilidad en la mayoría de las versiones de C? Para indicar los argumentos de long double se utiliza una L mayúscula, esto esta disponibles solamente en algunas versiones de C. 4.26 ¿Cómo se puede imprimir la asignación de un dato de entrada al argumento correspondiente? Se puede imprimir la asignación de un dato de entrada mediante en porcentaje % en el dato y el ampersand & antes del argumento. 4.27 Si la cadena de control de una función scanf contiene varios grupos de caracteres que no están separados por caracteres de espaciado, ¿Qué problema puede aparecer al utilizar la conversión tipo c? ¿Cómo se puede solucionar esto? Al existir este caso, si aparece entre los datos de entrada un carácter de espaciado, se lo interpreta como un dato más, para saltarse estos caracteres de espaciado y leer el siguiente que no sea de espaciado se debe utilizar el grupo de conversión %s.
68
4.28 ¿Cómo se interpretan los caracteres no reconocidos dentro de la cadena de control de la función scanf? Estos caracteres de entrada se leerán, pero no se asignan a ningún identificador; y si la entrada no coincide con los caracteres de la cadena de control, terminara la ejecución de la función scanf. 4.29 ¿Cuál es el propósito de la función printf? ¿Cómo se utiliza en un programa en C? Compárese con la función scanf. La función printf escribe datos en el dispositivo de salida estándar, se la puede utilizar para escribir cualquier combinación de valores, caracteres y cadenas de caracteres y se la usa en un programa en C escribiendo printf seguida de paréntesis donde se colocará una cadena de control seguida de argumentos separados por comas. 4.30 ¿En que difiere la cadena de control de la función printf de la función scanf? La cadena de control de la función printf hace referencia a una cadena de caracteres que contiene información sobre el formato de salida a diferencia de la cadena de control de la función scanf cuya información tenía un formato de entrada. 4.31 Si la cadena de control de la función printf contiene varios grupos de caracteres, ¿Cómo se pueden separar los grupos de caracteres? ¿Cómo se interpretan los separar adores? Los grupos de caracteres dentro de la cadena de control de la función printf se los puede separar por otros caracteres, incluidos los de espaciado; estos caracteres son transferidos directamente al dispositivo de salida estándar para ser visualizados. 4.32 Citar los caracteres de conversión de uso más frecuente en la cadena de control de la función printf y explicar su significado. Compárense con los caracteres de conversión que se utilizan en la función scanf. Algunos de los caracteres descritos a continuación tienen significado distinto que en la función scanf: Caracteres de conversión
Significado
4.33 En la función printf, ¿deben ir precedidos los argumentos (aquellos que no sean cadenas de caracteres) de ampersands? Compárese con la función scanf y explíquense las diferencias.
69
En la función printf los argumentos no deben ir precedidos de ampersand &, esto difiere de la función scanf que requiere ampersand & en todos los argumentos que no sean nombres de formaciones. 4.34 ¿Cuál es la diferencia entre las conversiones tipo f, tipo e y tipo g cuando se están presentando datos mediante la función printf? Las conversiones de tipo f y de tipo e se utilizan para visualizar valores en coma flotante y esta última hace que se incluya en la salida el exponente, mientras que la primera no. 4.35 Comparar el uso de la conversión tipo s en las funciones printf y scanf. ¿En que difiere la conversión tipo s cuando se están tratando cadenas de caracteres que contienen caracteres de espaciado? La función printf difiere de la scanf, ya que en ella se utiliza la conversión tipo s para visualizar una cadena de caracteres que acaba en el carácter nulo (\0) y se pueden incluir caracteres de espaciado en la cadena de caracteres. 4.36 ¿Cómo se puede especificar en la función printf la longitud de campo mínima para un dato? Se puede especificar en la función printf la longitud de campo mínima anteponiendo al carácter de conversión un entero sin signo. 4.37 ¿Qué ocurre si un dato contiene más caracteres que los especificados en la longitud de campo mínima? ¿y si los datos contienen menos caracteres? Compárese con la especificación de longitud de campo máxima en la función scanf. La especificación en la función printf es la contraria a la función scanf. En la función printf, si el numero de caracteres del dato es menos que la longitud de campo especificada, el dato será precedido por los espacios en blanco necesarios para que consiga la longitud especificada y si el numero de caracteres del dato excede la longitud de campo especificada, se visualiza el dato completo. 4.38 ¿Qué se entiende por precisión de un dato de salida? ¿a qué tipo de dato se aplica esto? La precisión es una especificación de un dato de salida y se aplica para datos de coma flotante o para una cadena de caracteres. 4.39 ¿Cómo se puede especificar la precisión en la función printf? Se la puede especificar ingresando un entero sin signo que siempre es precedido por un punto decimal. 4.40 ¿Qué le ocurre a un numero en coma flotante si se debe recortar para satisfacer la precisión especificada? ¿Y a una cadena de caracteres? El numero de coma flotante se redondea para satisfacer la precisión especificada y se añaden espacios en blanco para conseguir una longitud mínima especificada. A una cadena de caracteres, si la precisión especificada es menor que el número total de caracteres de la cadena, no se mostraran los caracteres sobrantes de la parte derecha de la cadena. 4.41 ¿Debe ir acompañada una especificación de precisión de una especificación de longitud de campo mínima en la función printf? 70
No, en la función printf no es necesario que la especificación de precisión vaya acompañada de la longitud de campo mínima ya que se puede especificar la precisión sin esta longitud. 4.42 ¿Cómo se pueden indicar los argumentos de tipo entero corto, entero largo y de doble precisión en la cadena de control de la función printf? ¿Cómo se pueden indicar los argumentos long double? Los argumentos de tipo entero largo, con o sin signo, o argumentos de doble precisión se pueden indicar con el prefijo l (L minúscula); un entero corto con o sin signo se indica con una h y algunas versiones de C permiten una L para indicar un long double. 4.43 ¿Cómo se interpretan los caracteres de conversión en mayúsculas en comparación con los caracteres en minúsculas correspondientes en la función printf? ¿A qué tipos de conversiones se aplica esto? ¿Permiten estas distinciones todos los compiladores de C? Algunas versiones de C permiten escribir en mayúsculas los caracteres de conversión X, E y G, quienes hacen que cualquier letra de los datos de salida se presente en mayúsculas. 4.44 Mencionar el propósito de los indicadores comúnmente utilizados en la función printf. Los indicadores tienen el propósito de afectar a como se muestra la salida. 4.45 ¿Pueden aparecer dos o más indicadores consecutivamente en el mismo grupo de caracteres? Sí, algunos compiladores permiten incluir dos o más indicadores seguidos dentro del mismo grupo de caracteres. 4.46 ¿Cómo se interpretan los caracteres no reconocidos dentro de la cadena de control de una función printf? Los caracteres no reconocidos se interpretarán tal y como aparezcan. 4.47 ¿Cómo se pueden rotular los datos presentados por una función printf? Se pueden rotular los datos presentados por una función printf al colocar caracteres en la cadena de control que no se reconozcan, en el caso de un signo de $ se lo colora antes del signo de%, si se quiere poner como rotulo un % se lo colocara luego del tipo de dato con un doble porcentaje %%. 4.48 Mencionar el uso de las funciones gets y puts en la transferencia de cadenas de caracteres entre la computadora y los dispositivos de entrada/salida estándar. Comparar estas funciones con scanf y printf. Las funciones gets y puts facilitan la transferencia de cadenas de caracteres entre la computadora y los dispositivos de entrada/salida estándar. Estas funciones aceptan un solo argumento que debe representar una cadena de caracteres, ofrecen alternativas más sencillas al uso de scanf y printf por su sintaxis. 4.49 Explicar, en términos generales como se puede generar un dialogo interactivo con el uso repetitivo de pares de funciones scanf y printf. Se lo puede generar ingresando la función printf con la cadena de control expresando lo que se desea conocer y después ingresar la función scanf para captar esa información que el usuario del 71
programa introducirá, esto se hace de forma repetitiva utilizando variables diferentes para cada argumento de la función scanf.
PROBLEMAS: 4.50.- Un programa en C contiene las siguientes sentencias # include< stdio.h> Char a, b, c; a) Escribir las sentencias getchar oportunas que permitan introducir los valores de a, b y c en la computadora Char a; a=getchar ();
Char b; b=getchar ();
Char c; c=getchar ();
b) Escribir las sentencias putchar que se ocupen de visualizar los valores presentes de a, byc Char a; Char b; Char c; putchar (); putchar (); putchar ();
4.51.- Resolver el Problema 4.50 utilizando solo una función scanf y una printf en lugar de las sentencias getchar y putchar. Comprar la respuesta con la solución al Problema 4.50 FUNCION SCANF: Char a; Scanf (“%c”, a);
Char b; Scanf (“%c”, b);
Char c; Scanf (“%c”, c);
Char b; printf (“%c”, b);
Char c; printf (“%c”, c);
FUNCION PRINTF Char a; printf (“%c”, a);
4.55.- Un programa en C contiene las siguientes sentencias # include< stdio.h> int i, j, k;
72
Escribir de forma adecuada una función scanf que permita introducir los valores numéricos de i, j y k, asumiendo que: a) Los valores de i, j y k son enteros decimales Scanf (“%d”, &i);
Scanf (“%d”, &j);
Scanf (“%d”, &k);
b) El valor de i es un entero decimal, j un entero octal y k un entero hexadecimal Scanf (“%d”, &i);
Scanf (“%o”, &j);
Scanf (“%x”, &k);
c) Los valores de i y j son enteros hexadecimales y k un entero octal Scanf (“%x”, &i);
Scanf (“%x”, &j);
Scanf (“%o”, &k);
4.56.- Un programa en C contiene las siguientes sentencias # include Escribir de forma adecuada una función scanf que permita introducir los valores numéricos de i, j y k, asumiendo que: a) Los valores de i, j y k son enteros decimales y cada uno no excede los seis caracteres. Scanf (“%5d”, &i);
Scanf (“%4j”, &j);
Scanf (“%3d”, &k);
b) El valor de i es un entero decimal, j un entero octal y k un entero hexadecimal y cada cantidad no excede los ocho caracteres Scanf (“%7d”, &i);
Scanf (“%6o”, &j);
Scanf (“%7x”, &k);
c) Los valores de i y j son enteros hexadecimales y k un entero octal. Cada cantidad tiene siete menos caracteres Scanf (“%4x”, &i);
Scanf (“%3x”, &j);
Scanf (“%6o”, &k);
73
4.57.- Interpretar el significado de la cadena de control de cada función scanf a) b) c) d)
4.58
scanf (“%121d %5hd %151f %151e “, &a, &b, &c, &d); scanf (“%101x %6ho %5hu %141u “, &a, &b, &c, &d) scanf (“%12D %hd %15f %15e “, &a, &b, &c, &d); scanf (“%8d %d %121f %121f “, &a, &b, &c, &d); #include //declaración de variables int a, b, c, d=0; int main () { printf ("\n a)"); scanf ("%121d %5hd %151f %151e",&a,&b,&c,&d); printf ("%d %hd %f %e",a,b,c,d); printf ("\n b)"); scanf ("%101x %6ho %5hu %141u",&a,&b,&c,&d); printf ("%x %ho %hu %u",&a,&b,&c,&d); printf ("\n c)"); scanf ("%12D %hd %15f %15e",&a,&b,&c,&d); printf ("%D %hd %f %e",&a,&b,&c,&d); printf ("\n d)"); scanf ("%8d %*d %121f %151f",&a,&b,&c,&d); printf ("%8d %*d %121f %151f",&a,&b,&c,&d); }
Un programa en C contiene las siguientes sentencias # include< stdio.h> Int i, j; Long ix; Short s; 74
Unsigned u; Float x; Double dx; Char c; Escribir una función scanf para cada uno de los siguientes grupos de variables que lea un conjunto de datos correspondiente y los asigne a las variables. Supóngase que todos los enteros se leerán como cantidades decimales a) i, j, x y dx scanf ("%d”, &i);
Scanf ("%d",&j);
scanf ("%f”, &x);
scanf ("%lf”, &dx);
b) i, ix, j, x y u scanf ("%d”, &i);
Scanf ("%ld",&ix);
scanf ("%f”, &x);
scanf ("%u”, &u);
scanf ("%d”, &j);
c) i, u y c scanf ("%d”, &i);
Scanf ("%u",&u);
scanf ("%c”, &c);
d) c, x, dx y s scanf ("%c”, &c);
scanf ("%f”, &x);
scanf ("%lf”, &dx);
scanf ("%hu”, &s);
4.59.- Un programa en C contiene las siguientes sentencias # include< stdio.h> Int i, j; Long ix; Short s; Unsigned u; Float x; 75
Double dx; Char c; Escribir una función scanf que satisfaga cada uno de los siguientes puntos suponiendo que todos enteros se leerán como cantidades decimales a) Introducir los valores de i, j, x y dx suponiendo que cada cantidad entera no excede los cuatro caracteres, la cantidad en coma flotante no excede los ocho caracteres y la cantidad en doble precisión no excede los 15 caracteres. Scanf (“%4d%4d%8f%15f”,&I,&j,&x,&dx); b) Introducir los valores de i, ix, j, x y u suponiendo que cada cantidad entera no excede los cinco caracteres, el entero largo no tiene más de 12 caracteres y la cantidad en coma flotantes no excede los 10 caracteres. Scanf(“%5d%10f%12d%5u”,&i,&x,&j,&u);
c) Introducir los calores de i, u y c suponiendo que cada cantidad no entera no tiene más de seis caracteres. Scanf(“%6d%6u%c”,&i,&u,&c); d) Introducir los valores de c, x, dx y s suponiendo que la cantidad en coma flotante no excede los nueve caracteres, la cantidad en doble precisión no excede los 16 caracteres y el entero corto no excede los seis caracteres. Scanf(“%c%9f%16f%d”,&c,&x,&dx,&s); 4.64.- Un programa en C contiene las siguientes instrucciones #include Char a, b, c; Supongamos que se desea introducir $ y que se le asigne a a, que a b se le asigne * y que a c se le asigne @. Muéstrele como se deben introducir los datos para cada una de las siguientes funciones socan: a. scanf (“%c%c%c “, &a, &b, &c); $*@ b. scanf (“%c%c%c “, &a, &b, &c); $*@ c. scanf (“%s%s%s “, &a, &b, &c); $*@ d. scanf (“%s%s%s “, &a, &b, &c); $*@ e. scanf (“%ls%ls%sl “, &a, &b, &c); $*@ 4.65.- Un programa en C contiene las siguientes sentencias # include< stdio.h> Int a, b; Float x, y; 76
Supongamos que se introducir 12 y que le sea asignado a a, que -8 le sea asignado en s b, 0.011 le sea asignado a x y −202 ∗ 106 le sea asignado a y. Muéstrese como se deberían proporcionar los datos a las computadora al ejecutarse cada una de las siguientes funciones scanf: a) Scanf (“%d %d %f %f”, &a, &b, &x, &y); 12 -8 0.011 -2.2x106 b) Scanf (“%d %d %e %e”, &a, &b, &x, &y); 12 -8 0.011 -2.2x106 c) Scanf (“%2 %2 %5 %6”, &a, &b, &x, &y); 12 -8 0.011 -2.2x106 d) Scanf (“%3 %3 %8 %8”, &a, &b, &x, &y); 12 -8 0.011 -2.2x106 4.66.- Un programa en C contiene las siguientes sentencias #include Int i, j, k; Escribir una función printf para cada uno de los siguientes grupos de variables o expresiones. Supóngase que todas las variables representan enteros decimales. a) I, j, y k b) (i + j), (i – j) c) Sqrt (i + j), abs (i – k) #include //declaracion de variables int i, j, k; int main() { printf("a) i,j y k \n"); scanf("%3d %3d %3d",&i, &j, &k); printf("\n%d %d %d",i,j,k); printf("\nb) (i+j) y (i-k) \n"); scanf("%5d %5d %5d",&i, &j, &k); printf("\n%d %d",(i+j),(i-k)); printf("\nc) sqrt(i+j)\n"); scanf("%9d %9d %92d",&i, &j, &k); printf("\n%9d %7d",sqrt(i+j),fabs(i-k)); } 77
4.67.- Un programa en C contiene las siguientes sentencias: #include Int i, j, k; Escribir una función printf para cada uno de los siguientes grupos de variable so expresiones, Supóngase que todas las variables representan enteros decimales. a) I, j, k, con una longitud de campo mínima de tres caracteres por cantidad. b) (i + j), (i – j), con una longitud de campo mínima de cinco caracteres por cantidad. c) Sqrt (i + j), abs (i – k), con una longitud de campo mínima de nueve caracteres para la primera cantidad y siete para la segunda. #include //declaracion de variables int i, j, k; int main() { printf("a) i,j y k con una longitud de campo minima de tres caracteres para cada cantidad\n"); scanf("%3d %3d %3d",&i, &j, &k); printf("\n%d %d %d",i,j,k); printf("\nb) (i+j) y (i-k) con una longitud de campo minima de cinco caracteres para cada cantidad\n"); scanf("%5d %5d %5d",&i, &j, &k); printf("\n%d %d",(i+j),(i-k)); printf("\nc) sqrt(i+j),fabs(i-k) con una longitud de campo minima de nueve caracteres para la primera cantidad y siete para la segunda\n"); scanf("%9d %9d %92d",&i, &j, &k); printf("\n%9d %7d",sqrt(i+j),fabs(i-k)); } 78
4.68.- Un programa en C contiene las siguientes sentencias: #include Float x, y, z; Escribir una función printf para cada uno de los siguientes grupos de variables o expresiones: a) X, y y z b) (x + y), (x – z) c) Sqrt (x + y), fabs (x – z) #include #include //Declaracion de variables float x, y, z; //DESARROLLO int main() { printf("a) x,y y z \n"); printf("\n%6f %6f %6f",(float)x,(float)y,(float)z); printf("\nb) (x+y) y (x-z) \n"); printf("\n%8f %8f",(float)(x+y),(float)(x-z)); printf("\nc) sqrt(x+y),fabs(x-z)\n"); printf("\n%9f %7f",(float)sqrt(x+y),(float)fabs(x-z)); }
79
4.69.- Un programa en C contiene las siguientes sentencias: #include Float x, y, z; Escribir una función printf para cada uno de los siguientes grupos de variables o expresiones, utilizando la conversión tipo f para cada cantidad en coma flotante. a) x, y y z, con una longitud de campo mínima de seis caracteres por cantidad. b) (x + y), (x – z), con una longitud de campo mínima de ocho caracteres por cantidad. c) Sqrt (x + y), fabs (x – z), con una longitud de campo mínima de 12 caracteres para la primera cantidad y nueve para la segunda. #include #include //Declaración de variables float x, y, z; //DESARROLLO int main() { printf("a) x,y y z con una longitud de campo minima de seis caracteres por cantidad\n"); printf("\n%6f %6f %6f",(float)x,(float)y,(float)z); printf("\nb) (x+y) y (x-z) con una longitud de campo minima de ocho caracteres por cantidad\n"); printf("\n%8f %8f",(float)(x+y),(float)(x-z)); printf("\nc) sqrt(x+y),fabs(x-z)con una longitud de campo minima de doce caracteres para la primera cantidad y nueve para la segunda\n"); printf("\n%9f %7f",(float)sqrt(x+y),(float)fabs(x-z));
80
}
4.70.- Repetir el ejemplo anterior utilizando la conversión tipo e
#include #include //Declaracion de variables float x, y, z; int main() { printf("a) x,y y z con una longitud de campo minima de seis caracteres por cantidad\n"); printf("\n%6e %6e %6e",x,y,z); printf("\nb) (x+y) y (x-z) con una longitud de campo minima de ocho caracteres por cantidad\n"); printf("\n%8e %8e",(x+y),(x-z)); printf("\nc) sqrt(x+y),fabs(x-z)con una longitud de campo minima de doce caracteres para la primera cantidad y nueve para la segunda\n"); printf("\n%9e %7e",sqrt(x+y),fabs(x-z)); }
81
4.71.- Un programa en C contiene las siguientes sentencias: #include Float x, y, z; Escribir una función printf para cada uno de los siguientes grupos de variables o expresiones, utilizando la conversión tipo f para cantidad en como flotante. a) x, y y z, con una longitud de campo mínima de ocho caracteres por cantidad, con solo cuatro cifras decimales. b) (x + y), (x – z), con una longitud de campo mínima de ocho caracteres por cantidad, con tres cifras decimales c) Sqrt (x + y), fabs (x – z), con una longitud de campo mínima de 12 caracteres para la primera cantidad y 10para la segunda. Presentar un máximo de cuatro cifras decimales en cada cantidad. #include #include //Declaracion de variables float x, y, z; //DESARROLLO int main() { printf("a) x,y y z con una longitud de campo minima de ocho caracteres por cantidad\n"); printf("\n%8f %8f %8f",(float)x,(float)y,(float)z); printf("\nb) (x+y) y (x-z) con una longitud de campo minima de ocho caracteres por cantidad\n"); printf("\n%8f %8f",(float)(x+y),(float)(x-z)); printf("\nc) sqrt(x+y),fabs(x-z)con una longitud de campo minima de doce caracteres para la primera cantidad y diez para la segunda\n"); 82
printf("\n%9f %7f",(float)sqrt(x+y),(float)fabs(x-z)); }
4.72.- Un programa en C contiene las siguientes sentencias: #include Float x, y, z; Escribir una función printf para cada uno de los siguientes grupos de variables o expresiones, utilizando la conversión tipo e para cantidad en como flotante. a) x, y y z, con una longitud de campo mínima de ocho caracteres por cantidad, con solo cuatro cifras decimales. b) (x + y), (x – z), con una longitud de campo mínima de ocho caracteres por cantidad, con cinco cifras decimales c) Sqrt (x + y), fabs (x – z), con una longitud de campo mínima de 12 caracteres para la primera cantidad y 15 para la segunda. Presentar un máximo de siete cifras decimales en cada cantidad.
#include #include //Declaracion de variables float x, y, z; //DESARROLLO int main() { printf("a) x,y y z con una longitud de campo minima de ocho caracteres por cantidad\n"); printf("\n%8e %8e %8e",x,y,z); 83
printf("\nb) (x+y) y (x-z) con una longitud de campo minima de ocho caracteres por cantidad\n"); printf("\n%8e %8e",(x+y),(x-z)); printf("\nc) sqrt(x+y),fabs(x-z)con una longitud de campo minima de doce caracteres para la primera cantidad y quince para la segunda\n"); printf("\n%9e %7e",sqrt(x+y),fabs(x-z)); }
4.73.- Un programa en C contiene las siguientes sentencias: #include Int a=0177, b=055, c=0xa8, d=0xff; Escribir una función printf para cada uno de los siguientes grupos de variables o expresiones: a) a, b, c y d b) (a + b), (c – d) #include #include //Declaracion de variables int a=0177, b=055, c=0xa8, d=0xff; int main() { printf("a) a,b,c y d \n"); printf("\n%d %d %d %d", a, b, c, d); printf("\nb) (a+b) y (c-d) \n"); 84
printf("\n%d %d",(a+b),(c-d)); }
4.74.- Un programa en C contiene las siguientes sentencias: #include Int i, j; Long ix; Unsigned u; Float x; Double dx; Char c; Escribir una función printf para cada uno de los siguientes grupos de variables. Supóngase que todos los enteros se desean presentar como cantidades decimales. a) i, j, x y dx b) i, ix, j, x y u c) i, u y e d) c, x, dx e ix
#include #include //Declaración de variables int i=3; int j=4; long ix=6823; unsigned u=-5; float x=6.65; double dx=4.21; char c='B'; int main() { 85
printf("a) i=%d j=%d x=%.2f\n", i,j,(float)x); printf("b) i=%d ix=%.2lf x=%.2f u=.2f\n", i, (float)ix, (float)x, (float)u); printf("c) i=%d u=.2f c=%c\n", i,(float)u, c); printf("d) c=%c x=%.2f dx=%.2lf ix=%.2lf \n", c,(float)x,(float)dx,(float)ix); }
4.75.- Un programa en C contiene las siguientes sentencias: #include Int i, j; Long ix; Unsigned u; Float x; Double dx; Char c; Escribir una función printf para cada uno de las siguientes situaciones. Suponiendo que todos los enteros se desean presentar como cantidades decimales. a) Escribir los valores de i, j, x y dx suponiendo que cada cantidad entera tiene una longitud de campo mínima de cuatro caracteres y cada cantidad de coma flotante se presenta en notación exponencial con una total de al menos 14 caracteres y no más de ocho cifras decimales. b) Repetir a), visualizando cada cantidad en una línea. c) Escribir los valores de i, ix, j, x y u suponiendo que cada cantidad entera tendrá una longitud de campo mínima de cinco caracteres, el entro largo tiene una longitud de campo mínima de 12 caracteres y la cantidad en coma flotante tiene al menos 10 caracteres con un máximo de cinco cifras decimales. No incluir el exponente.
d) Repetir c). visualizando las tres primeras cantidades en una línea, seguidas de una línea en blanco y las otras dos cantidades en la línea siguiente. 86
e) Escribir los valores de i, u y c, con una longitud de campo mínima de seis
f)
g) h) i) j)
caracteres para cantidad entera. Separar con tres espacios en blanco cada cantidad. Escribir los valores de j, u y x. Visualizaras cantidades enteras con una longitud de campo mínima de cinco caracteres. Presentar la cantidad en coma flotante utilizando la conversión tipo f, con una longitud de campo mínima de 11 caracteres y un máximo de cuatro cifras decimales. Repetir f), con cada dato ajustado a la izquierda dentro de su campo. Repetir f), apareciendo un signo (tanto + como -) delante de cada dato con signo. Repetir f), rellenando el campo de cada cantidad entera con ceros. Repetir f), apareciendo el valor de x con un punto decimal a la derecha.
#include #include //Declaracion de variables int i, j; long ix; unsigned u; float x; double dx; char c; int main() { printf ("a) i,j,x,dx cada cantidad entera tiene una longitud de campo mínima de cuatro caracteres \n"); printf(" %4e \n", i); printf(" %4e \n", j); printf(" %4e \n", x); printf(" %4e \n", dx); printf ("a) i,j,x,dx cada cantidad entera tiene una longitud de campo mínima de cuatro caracteres \n"); printf(" %4e %4e %4e %4e", i,j,x, dx); }
87
4.76.- Supongamos que i, j y k son variables enteras y que i representa una cantidad octal, j una cantidad decimal y k una cantidad hexadecimal. Escribir una función printf adecuada para cada una de las siguientes situaciones. a) Escribir el valor i, j y k con una longitud mínima de ocho caracteres por cada valor. b) Repetir a) con cada dato ajustado a la izquierda de su campo. c) Repetir a) con cada dato precedido de ceros (0x, en el caso de la cantidad hexadecimal). #include #include //Declaracion de variables int i=3; int j=4.5; int k=6; void main() { printf("a) i, j, k con una longitud mínima de ocho caracteres por cada valor.\n"); printf("%8o%8f%8x\n",i,j,k); printf("a) i, j, k con una longitud mínima de ocho caracteres por cada valor.\n"); printf("%8o\n",i); printf("%8f%\n",j); 88
printf("%8x\n",k); printf("a) i, j, k con una longitud mínima de ocho caracteres por cada valor.\n"); printf("%0o%0f%0x",i,j,k); } 4.77.- Un programa en C contiene las siguientes declaraciones de variables: int i=12345, j=-13579, k=-24680; long ix=123456789; short sx=-2222; unsigned ux=5555; Mostrar la salida resultante de cada una de las siguientes sentencias printf a) Printf (“%d%d%d%ld%d%u”, i, j, k, ix, ux); b) Printf (“%3d%3d%3d \n \n%3ld%3d%3u”, i, j, k, ix, sx, ux); c) Printf (“%8d%8d%8d \n \n15ld%8d%8u”, i, j, k, ix, sx, ux); d) Printf (“%-8d%-8d%-8d \n \n-15ld%-8d%-8u”, i, j, k, ix, sx, ux); e) Printf (“%+8d%+8d%+8d \n \n+15ld%+8d%+8u”, i, j, k, ix, sx, ux); f) Printf (“%08d%8d%08d \n \n015ld%08d%08u”, i, j, k, ix, sx, ux); #include #include //Declaracion de variables int i=12345, j=-13579, k=-24680; long ix=123456789; short sx=-2222; unsigned ux=5555; int main() { printf ("a.-%d%d%d%ld%d%u", i, j, k, ix, ux); printf ("b.-%3d%3d%3d \n \n%3ld%3d%3u", i, j, k, ix, sx, ux); printf ("c.-%8d%8d%8d \n \n15ld%8d%8u", i, j, k, ix, sx, ux); printf ("d.-%-8d%-8d%-8d \n \n-15ld%-8d%-8u", i, j, k, ix, sx, ux); printf ("e.-%+8d%+8d%+8d \n \n+15ld%+8d%+8u", i, j, k, ix, sx, ux); printf ("f.-%08d%8d%08d \n \n015ld%08d%08u", i, j, k, ix, sx, ux); }
89
4.78.- Un programa en C contiene las siguientes declaraciones de variables: int i=12345, j=0xabcd9, k=077777; Mostrar la salida resultante de cada una de las siguientes sentencias printf a) Printf (“%d%x%o”, i, j, k); b) Printf (“%3d%4x%3o”, i, j, k); c) Printf (“%8d%8x%8o”, i, j, k); d) Printf (“%-8d%-8x%-8o”, i, j, k); e) Printf (“%+8d%+8x%+8o”, i, j, k); f) Printf (“%08d%#8x%#8o”, i, j, k);
#include #include //Declaracion de variables int i=12345, j=0xabcd9, k=077777; int main () { printf ("a.-%d%x%o\n", i, j, k); printf ("b.-%3d%4x%3o\n", i, j, k); printf ("c.-%8d%8x%8o\n", i, j, k); printf ("d.-%-8d%-8x%-8o\n", i, j, k); printf ("e.-%+8d%+8x%+8o\n", i, j, k); printf ("f.-%08d%#8x%#8o\n", i, j, k); }
90
4.79.- Un programa en C contiene las siguientes declaraciones de variables: float a=2.5, b=0.0005, c=3000.; Mostrar la salida resultante de cada una de las siguientes sentencias printf a) Printf (“%f%f%f”, a, b, c); b) Printf (“%3f%3f%3f”, a, b, c); c) Printf (“%8f%8f%8f”, a, b, c); d) Printf (“%8.4f%8.4f%8.4f”, a, b, c); e) Printf (“%8.3f%8.3f%8.3f”, a, b, c); f) Printf (“%e%e%e”, a, b, c); g) Printf (“%3e%3e%3e”, a, b, c); h) Printf (“%12e%12e%12e”, a, b, c); i) Printf (“%12.4e%12.4e%12.4e”, a, b, c); j) Printf (“%8.2e%8.2e%8.2e”, a, b, c); k) Printf (“%-8f%-8f%-8f”, a, b, c); l) Printf (“%+8f%+8f%+8f”, a, b, c); m) Printf (“%08f%08f%08f”, a, b, c); n) Printf (“%#8f%#8f%#8f”, a, b, c); o) Printf (“%g%g%g”, a, b, c); p) Printf (“%#g%#g%#g”, a, b, c);
#include #include 91
//Declaracion de variables float a=2.5, b=0.0005, c=3000.; int main() { printf ("a.- %f%f%f\n", a, b, c); printf ("b.- %3f%3f%3f\n", a, b, c); printf ("c.- %8f%8f%8f\n", a, b, c); printf ("d.- %8.4f%8.4f%8.4f\n", a, b, c); printf ("e.- %8.3f%8.3f%8.3f\n", a, b, c); printf ("f.- %e%e%e\n", a, b, c); printf ("g.- %3e%3e%3e\n", a, b, c); printf ("h.- %12e%12e%12e\n", a, b, c); printf ("i.- %12.4e%12.4e%12.4e\n", a, b, c); printf ("j.- %8.2e%8.2e%8.2e\n", a, b, c); printf ("k.- %-8f%-8f%-8f\n", a, b, c); printf ("l.- %+8f%+8f%+8f\n", a, b, c); printf ("m.- %08f%08f%08f\n", a, b, c); printf ("n.- %#8f%#8f%#8f\n", a, b, c); printf ("o.- %g%g%g\n", a, b, c); printf ("p.- %#g%#g%#\n", a, b, c); }
4.80.- Un programa en C contiene las siguientes declaraciones de variables: char c1=’A’, c2=’B’, c3=’C’; Mostrar la salida resultante de cada una de las siguientes sentencias printf: a) Printf (“%c %c %c”, c1, c2, c3); b) Printf (“%c %c %c”, c1, c2, c3); c) Printf (“%3c %3c %3c”, c1, c2, c3); 92
d) Printf (“%3c %3c %3c”, c1, c2, c3); e) Printf (“c1=%c c2=%c c3=%c”, c1, c2, c3); #include #include //Declaracion de variables char c1='A', c2='B', c3='C'; int main() { printf ("a.-%c %c %c\n", c1, c2, c3); printf ("b.-%c %c %c\n", c1, c2, c3); printf ("c.-%3c %3c %3c\n", c1, c2, c3); printf ("d.-%3c %3c %3c\n", c1, c2, c3); printf ("e.-c1=%c c2=%c c3=%c\n", c1, c2, c3); }
4.83.- Escribir las sentencias scanf o printf necesarias para cada uno de los siguientes puntos: a) Generar el mensaje Por favor, introduce tu nombre; Y que el usuario introduzca en la misma línea su nombre. Asignar el nombre a un array de caracteres llamado nombre. - Scanf b) Supongamos que x1, x2 son variables de como flotante cuyos valores son 8.0 y 2.5, respectivamente. Visualizar los valores de x1 y x2, con los rótulos adecuados, por ejemplo. 93
X1= 8.0 x2= -2.5 - Printf c) Supongamos que a y b son variables enteras. Pedir al usuario que introduzca el valor de estas dos variables y mostrar después su suma. Rotular la salida adecuadamente. - Printf 4.84.- Determinar de qué caracteres de conversión dispones en tu versión de C. Determinar también de que indicadores se dispone para la salida de datos.
CARACTERES DE CONVERSIÓN Carácter de conversión
Significado
c
Carácter
d
Entero decimal
e
Coma flotante
f
Como flotante
g
Coma flotante
h
Entero corto
o
Entero octal
s
Entero hexadecimal
INDICADOR DE SALIDA DE DATO: -
printf
cout, pone caracteres en la salida estándar (pantalla);
94