Professional Documents
Culture Documents
Tractament de Dades Simples2012
Tractament de Dades Simples2012
3. Entrades i sortides
3.1. Sortida
3.2. Entrada
4. Operadors i expressions
4.1.
4.2.
4.3.
4.4.
4.5.
4.6.
4.7.
Operador d'assignaci
Operadors aritmtics
Operadors d'incrementaci i decrementaci
Operadors relacionals
Operadors lgics
Conversions de tipus implcites
Prioritat i associativitat
Quique Lorente
Pgina 1
Quique Lorente
Pgina 2
El primer format significa que els arxius es troben en el directori per defecte include. El segon
format significa que l'arxiu est al directori actual (al mateix lloc que l'arxiu font). Si l'arxiu est en
un altre directori s'ha d'especificar la ruta completa.
L'arxiu de capalera ms freqent s stdio.h. Aquest arxiu proporciona al compilador C la
informaci necessria sobre les funcions de biblioteca que realitzen operacions d'entrada i
sortida. Com quasi tots els programes que escriviu imprimiran informaci en pantalla i llegiran
dades de teclat, necessitaran incloure scanf() i printf().
La directiva #define indica al preprocessador que substitueixi en el programa l'identificador que
el segueix per all que ve a continuaci. Se sol utilitzar per a declarar constants.
#define NUM 20
Les variables i constants globals es declaren i defineixen fora de la definici de les funcions, abans
del main(), mentre que les variables i constants locals es declaren en la capalera del cos de les
funcions. Les sentncies situades en l'interior de les funcions han d'acabar en punt i coma.
1.4. Funcions definides per l'usuari
Un programa C s una collecci de funcions. Tots els programes es construeixen a partir d'una o
ms funcions que s'integren per crear una aplicaci.
Quique Lorente
Pgina 3
Les funcions definides per l'usuari s'invoquen pel seu nom i els parmetres opcionals que puguin
tenir. Desprs de qu cada funci s cridada, el codi associat amb la funci s'executa i, a
continuaci, es retorna a la funci que ha cridat.
Totes les funcions tenen nom i una llista de valors que reben. Es pot assignar qualsevol nom a una
funci, per generalment es procura que aquest nom descrigui el propsit de la funci. En C, les
funcions requereixen una declaraci o prototip en el programa:
void tracarcorba();
Una declaraci de funci indica al compilador el nom de la funci pel que aquesta ser invocada en
el programa. La paraula reservada void significa que la funci no torna cap valor.
void esvocal(char caracter);
suma.c
Programador:
Descripci:
Data creaci:
Quique Lorente
Primer programa en C
Octubre 2011
*/
scanf("%d",&x);
Quique Lorente
Pgina 4
La longitud d'un identificador pot ser qualsevol, si b noms es reconeixen els primers 31 carcters.
Per tant els segents identificadors sn el mateix:
Aquest_identificador_es_de_longitud_38
Aquest_identificador_es_de_longitud_major_de_31
C distingeix les majscules de les minscules. Per tant, els segents 4 identificadors no sn el
mateix: total, TOTAL, Total, ToTal.
A l'hora de definir un identificador no s'han d'escatimar carcters, sempre s millor definir una
variable que va a contenir el radi d'una circumferncia com radi que no com r. Pot costar ms
escriure la paraula radi, per tamb t un nom autoexplicatiu, que permet entendre el programa
amb major facilitat.
2.2. Paraules reservades
Una paraula reservada o paraula clau (keyword o reserved word) t un significat definit pel
llenguatge i noms poden ser utilitzades per al propsit establert pel llenguatge. Per tant, no poden
ser utilitzades com a identificador. En C existeixen les segents paraules clau:
auto
break
case
char
const
continue
default
do
Quique Lorente
double
else
enum
extern
float
for
goto
if
int
long
register
return
short
signed
sizeof
static
struct
switch
typedef
union
unsigned
void
volatile
while
Pgina 5
Significat
carcter
Exemple
'C'
Bytes
1
int
enter
-1024
long
enter llarg
262144
float
real
10.5
double
0.00045
void
sense valor
Rang
0..255
-32768..32767
-2147483648..2147483637
3.4*10-38..3.4*1038
1.7*10-308..1.7*10308
NOTA: la grandria en bytes depn del compilador i de la mquina. Per saber-ho exactament es pot utilitzar la funci sizeof()
2.4. Constants
En C existeixen quatre tipus bsics de constants: enteres, reals, carcter i cadena de carcters. Quan
s'utilitza una constant en diversos llocs del programa se sol declarar mitjanant la directiva
#define utilitzant un identificador.
2.4.1.Constants enteres
Sn constants que representen nmeros sense decimals. Es pot posar un signe davant del
nmero, el qual indicar que el nmero s negatiu. Segons la base en qu s'escrigui la constant
tenim tres tipus: decimals (dgits del 0 al 9), octals (dgits del 0 al 7 i sempre comenant per 0) i
hexadecimals (dgits del 0 al 9 i lletres A, B, C, D, E, F, comenant sempre per 0x o 0X).
Decimal:
19, -213, 3
Octal:
Una constant real comprn una part entera, un punt (forma anglosaxona de representar els
decimals), una part fraccionria, una "e" o una "E" seguida d'un exponent amb signe (potncia de
10).
4.7, -5.65, 5.0, 4E3, -7e-2, 4.8E4, -7.2e-2
s important fer notar que 5 s una constant entera, mentre 5.0 s una constant real. Quan apareix
la lletra "E" s'anomena notaci cientfica, on la lletra "E" substitueix al nmero 10. Aix, el
nmero 4.8 * 104 s el 4.8E4. Les segents constants representen el mateix valor:
0.00075E1, 0.0075, 0.075E-1, 0.75E-2, 75E-4
2.4.3.Constants carcter
Una constant carcter est constituda per un nic carcter entre cometes simples (').
'A', 'c', '?', ' '
Es pot utilitzar el conjunt de carcters ASCII. Cada carcter t associat un valor numric, el qual
tamb val per referenciar al carcter. Per tant, si en C comparem la constant carcter 'A' amb el
Quique Lorente
Pgina 6
seu codi ASCII, que s el 65, l'ordinador ens dir que sn iguals. Aix s perqu en realitat el que
s'emmagatzema en memria no s el carcter en s, sin el seu codi corresponent.
Hi ha carcters que no es representar utilitzant el teclat, com ara el carcter sigma (). Com el seu
codi ASCII s el 228, podem assignar a una variable carcter directament el nombre 228 perqu
contingui aquest carcter.
Existeixen alguns carcters no imprimibles o que tenen un significat especial per al C i que poden
ser expressats com seqncies d'escapament. Una seqncia d'escapament s una parella de
carcters que en realitat representen un sol carcter. D'aquests dos carcters, el primer sempre s la
barra invertida \. En la segent taula tenim les seqncies d'escapament ms usades:
Seqncia d'escapament
\n
\r
\t
\b
\f
\\
\"
\0
Significat
nova lnia
retorn de carro
tabulaci horitzontal
espai enrere
salt de pgina
barra invertida
cometa doble
carcter nul
Mnemotcnic
NL
HT
BS
CR
FF
\
"
NULL
Codi ASCII
13 + 10
13
9
8
12
92
34
\0
Podem veure que la seqncia d'escapament '\n' representa el carcter de nova lnia. Aquest
carcter no t un smbol que el representi en pantalla, sin que quan s visualitzat en la pantalla el
que es produeix s un salt de lnia.
Com el carcter barra invertida marca l'inici d'una seqncia d'escapament, per poder-lo expressar,
el que s'ha de fer s escriure dues barres invertides seguides '\\'.
2.4.4.Constants cadena
Una constant de tipus cadena de carcters est constituda per una seqncia de carcters
delimitada per cometes dobles (").
"Cadena de carcters"
"123"
"23 d'abril de 1707"
"El carcter barra invertida: \\"
"Per a posar \" mireu com es fa"
Es pot escriure una cadena en vries lnies, acabant cada lnia amb "\"
"Aix s una cadena\
que t dues lnies"
Tota cadena de carcters acaba amb el carcter NULL (ASCII 0) que colloca automticament el
compilador.
Els programadors principiants en C sovint confonen les cadenes d'un sol carcter amb les
constants carcter. Aix, no s el mateix el carcter 'A' que la cadena de carcters "A", i per tant
no poden intercanviar-se en el seu s. Mentre la primera t un valor numric corresponent, la
cadena no el t i inclou un nul al final.
Quique Lorente
Pgina 7
2.5. Variables
Una variable s un identificador que fa referncia a una posici de memria on s possible
emmagatzemar valors d'un cert tipus de dades. Aquest valor pot ser modificat al llarg del programa,
per aix el nom de variable.
Totes les variables han de ser declarades abans de seu usades. s a dir, abans d'usar una variable
s'ha de dir a quin tipus pertany. Aix es fa especificant un tipus, seguit d'una llista de variables.
tipus nom_variable;
int x, y, z;
char a, b;
Dins d'una funci. Se les anomena variables locals, i noms podran ser usades dins de la
funci.
Capalera d'una funci. Aleshores se les anomena parmetres de la funci, i contenen valors
que sn passats en la crida a la funci.
Fora de totes les funcions. Aleshores se les anomena variables globals, i poden ser usades en
totes les funcions que segueixen a la seua declaraci.
Les variables globals s'han d'evitar, ja que ocupen memria durant tota l'execuci del programa i, a
ms, poden ser modificades per error en qualsevol lloc del programa, cosa que dificulta la seua
depuraci.
Tant els parmetres com les variables locals noms existeixen mentre s'est executant la funci, per
tant desprs deixen d'ocupar memria. En conseqncia, podem utilitzar els mateixos identificadors
de variables en diferents funcions.
3. Entrades i sortides
Els programes interactuen amb l'exterior a travs de dades d'entrada o dades de sortida. El
llenguatge C no proporciona directament ordres d'entrada o sortida. Aix per, en la biblioteca de
funcions C trobem aquestes facilitats.
Quique Lorente
Pgina 8
3.1. Sortida
La funci ms significativa per a la sortida de dades s la funci printf(), definida en la
biblioteca stdio.h.
printf(cadena de control, llista de variables);
La cadena de control pot contenir b carcters normals o b codis de format que comencen pel
signe %.
Codi de format
%d
%ld
%e
%f
%g
%s
%c
%nmero
.nmero
Significat
enter
enter llarg
real amb notaci exponencial (cientfica)
real amb notaci decimal
real; representaci ms curta, %e o %f
cadena de carcters
carcter
ajustar a l'esquerra
amplitud del camp
amplitud del camp desprs del punt decimal
La llista de variables sn les variables, separades per comes, els valors de les quals es van a
mostrar per la sortida. Hauran d'haver tantes variables en la llista com carcters % hi hagi en la
cadena de control.
Conv recordar l'existncia de les seqncies d'escapament, ja que se solen utilitzar bastant en el
printf().
Exemple:
int i=23; char
c='f';
float x=12.23;
long l=45000;
printf("Enter: %d\nCarcter: %c\nReal: %f\nEnter llarg:%ld", i, c, x, l);
3.2. Entrada
La ms important de les funcions d'entrada de dades des de teclat s scanf(), tamb de la
biblioteca stdio.h. Podrem considerar que esta funci s la inversa de printf().
scanf(cadena de control, llista de variables);
La cadena de control s idntica al cas de printf(). Els parmetres de la funci scanf() s'han de
passar per referncia, s a dir, s'ha de passar la seua adrea de memria perqu puguin ser
modificats. Per a aix es necessita l'operador d'adrea, el prefix &.
printf("Introdueix edat i altura: ");
scanf(" %d %f", &edat, &altura);
printf(Preu de venda al pblic");
scanf(" %f", &preu_venda);
Quique Lorente
Pgina 9
A causa del funcionament un poc estrany de la funci scanf(), desprs de la seva utilitzaci
deixa un carcter Enter en la memria que llegeix la segent instrucci de lectura, cosa que
provoca problemes. Per tant, cada vegada que s'utilitzi la funci scanf() conv executar la
instrucci fflush(stdin), que allibera la memoria o b getchar().
4. Operadors i expressions
En els programes C tamb ens trobem amb expressions. Una expressi s una seqncia
d'operacions i operants que especifiquen un clcul.
Ens trobarem amb operadors binaris, com ara el - quan actua com a resta, i operadors unaris, com
ara el com a indicador de signe.
Els operadors tindran una precedncia i una associativitat entre ells, que es pot alterar mitjanant
l's dels operadors parntesis ( i ). En cas de dubte o simplement per facilitar la llegibilitat,
conv utilitzar parntesis.
4.1. Operador d'assignaci
L'operador d'assignaci (=) assigna el valor de l'expressi dreta a la variable situada a la seua
esquerra.
codi = 3467;
coordX = 525;
pi = 3.1416;
Este operador s associatiu per la dreta; aix permet realitzar assignacions mltiples. Esta propietat
permet inicialitzar vries variables amb una sola sentncia:
int a, b, c;
a = b = c = 5;
Significat
Suma i signe positiu
Resta i signe negatiu
Producte
Divisi entera o divisi real, depenent dels operants
Residu de la divisi entera
Precedncia (major a menor)
+, - (unaris)
*, /, %
+, -
Quique Lorente
Exemple
x + y
b c
x * y
b / 5
b % 5
Associativitat
esquerra dreta
esquerra dreta
esquerra dreta
Pgina 10
s igual que
a = a + 1;
Per a evitar problemes, conv utilitzar els operadors d'incrementaci i decrementaci sols, sense
mesclar-los en altres expressions.
4.4. Operadors relacionals
Els operadors relacionals permeten realitzar comparacions entre valors. El seu resultat s cert o
fals. C no t tipus de dades lgics per representar els valors cert i fals. En el seu lloc s'utilitza el
tipus int, amb el valor enter 0 que representa a fals i distint de zero a cert.
fals
cert
Quique Lorente
zero
distint de zero
Pgina 11
Els operadors relacionals s'usen normalment en sentncies de selecci o d'iteraci per a comprovar
el valor d'una condici.
Operador
==
!=
>
<
>=
<=
Significat
Igual a
No igual a
Major que
Menor que
Major o igual que
Menor o igual que
Exemple
a==b
a!=b
a>b
a<b
a>=b
a<=b
Un error tpic, fins i tot entre programadors experimentats, s confondre l'operador d'assignaci (=)
amb l'operador d'igualtat (==).
Quan s'utilitzen els operadors en una expressi, l'operador relacional produeix un 0, o un 1,
depenent del resultat de la condici, falsa o certa. Per exemple, si s'escriu
c = 3 < 7;
la variable c es posa a 1, donat que com 3 s menor que 7, aleshores l'operaci < torna un valor
d'1, que s'assigna a c.
Exemple: Si x, a, b i c sn de tipus float, nmero de tipus int, i inicial de tipus char, les
segents expressions sn vlides:
x < 5.75
b * b >= 5.0 * a * c
nmero == 100
inicial != 'M'
Els carcters tamb es comparen utilitzant els codis numrics del codi ASCII.
'A' < 'C' s 1, cert, ja que A s el codi 65 i s menor que el codi 67 de C.
'a' < 'c' s 1, cert: a codi 97, b codi 99.
'b' < 'B' s 0, fals: b codi 98, B codi 66.
Els operadors relacionals tenen menor prioritat que els operadors aritmtics, i associativitat
d'esquerra a dreta. m + 5 <= 2 * n equival a (m + 5) <= (2 * n).
4.5. Operadors lgics
A ms dels operadors matemtics, C t tamb operadors lgics. Estos operadors s'utilitzen amb
expressions per tornar un valor cert (qualsevol enter distint de zero) o un valor fals (0). Els
operadors lgics s'anomenen tamb operadors booleans, en honor de George Boole, creador de
l'lgebra de Boole.
Operador
Significat
!
Negaci
&&
I lgic
||
O lgic
Quique Lorente
Pgina 12
b
0
1
0
1
a && b
0
0
0
1
a || b
0
1
1
1
a
0
1
!a
1
0
Associativitat
esquerra dreta
esquerra dreta
esquerra dreta
Operadors
( )
++ -- ! - +
* / %
+ < <= > >=
== !=
&&
||
=
Associativitat
E-D
D-E
E-D
E-D
E-D
E-D
E-D
E-D
D-E
Si dos operadors s'apliquen al mateix operant, l'operador amb major prioritat s'aplica primer.
Quique Lorente
Pgina 13
Quique Lorente
Pgina 14
g)
h)
i)
j)
k)
l)
n
ProblemaMeu
JocMeu
Joc Meu
write
m&m
_m_m
registre
A B
85 Nombre
AAAAAAAAAA
Nom_Cognoms
m)
n)
o)
p)
q)
r)
Saldo_Actual
92
Universitat
Autnoma
Set 15
* 143Edat
char
char
char
char
char = 'A';
A = 65;
parell = "B";
pin = '7';
5.
Quin tipus de dades bsic s'ha d'utilitzar per a definir variables que continguin els segents
valors:
a)
b)
c)
d)
e)
7.
'\n'
27
99.44
-2.5E30
Quique Lorente
b.- 34.2e-12
f.- 87654321
j.- 0x25353
c.- 10101010
g.- O.SE 8
k.- 0XBATA
d.- 0.8E+0.8
h.- -12.8e22
l.- 0x2dab3
Pgina 15
Entrades i sortides
8. Proveu el segent programa:
#include <stdio.h>
void main()
{
int i = 1234;
char c = 'A';
float x = 123.456;
printf ("%d,%3d,%10d,%-10d,%010d.\n", i, i, i, i, i);
printf ("%c,%3c,%10c,%-10c.\n", c, c, c, c);
printf ("%f,%3f,%10f,%-10f,%010f.\n", x, x, x, x, x);
printf ("%.2f,%10.2f,%e,%g.\n", x, x, x, x);
printf ("Tabulador: \t, cometes: \", tant per cent: %%.\n");
}
Mostreu la sortida resultant de cadascuna de les segents sentncies, incloent espais i salts de
lnia.
printf("%c %c%% %c\n", a, b, c);
printf("%c%c\t\"%c\"\n", a, b, c);
printf ("%4c %5c %6c\n", a, b, c) ;
printf ("a=%c, b=%-12c, c=%10c\n",a,b,c) ;
Operadors i expressions
11. Determineu el valor de les segents expressions aritmtiques:
a)
b)
c)
d)
15 / 12
24 / 12
123 / 100
200 / 100
e)
f)
g)
h)
15 % 12
24 % 12
123 % 100
200 % 100
15 * 14 3 * 7
4 * 5 * 2
(24 + 2 * 6) / 4
3 / 3 / 3 * 4
3 + 4 * (8 * (4 (9 + 3) / 6))
4 * 3 * 5 + 8 / 3 * 2 5
Quique Lorente
Pgina 16
g) 4 - 40 / 5
h) (-5) % (-2)
13. Escriviu les segents expressions com expressions dordinador. La potncia pot fer-se amb la
funci pow(), per exemple (x+y)2==pow(x+y,2).
a)
b)
x
+1
y
e) (a + b)
x+ y
x y
f)
g)
x+
c)
d)
x+
((a + b) 2 ) 2
z
y
xy
1 4x
xy
h)
mn
i)
b
c+d
( x + y)2 (a b)
24 % 5
7 / 2 + 2.5
10.8 / 2 + 2
16 / 3 * 2 - 4 * 5 / 2
(4 + 6 ) * 3 + 2 * ( 5.5 - 1 )
22 / 3 + 5.5 * 2 - ( 7 % 2 + ( 6 * 2 ) ) + 7.5 / 2
7 >= 5 && 27 == 8
45 <= 7 || ! ( 5 >= 7 )
8 > 8 || 7 == 7 && ! ( 5 < 5 )
4 + 2 < 8 && 24 + 1 == 25 || 0
( 2 * 7 > 5 || 7 / 2 == 3 ) && ( 7 > 25 || ! 1 ) && 27
(8 == 3 + 2) && !(24 > 5) && (7 != 4) || (28 * 5)
16. Escriviu una expressi que indiqui la condici de qu un nmero enter n sigui estrictament
positiu i mltiple de 10 per distint de 500.
17. Donades les variables enteres a, b, c, d, expresseu amb llenguatge C:
Els valors da i b son ambds menors que 17.
Els valors da, b i c sn idntics i distints de d.
Els valors de b i d estan compresos estrictament entre els valors da i c, sabent que a s
inferior a c.
Entre els valors da, b, i c hi ha almenys dos idntics.
Entre els valors da, b i c hi ha dos valors i noms dos idntics.
Entre els valors da, b, i c hi ha com a mxim dos valors idntics.
a s inferior al producte de b per c i agafa un valor pertanyent al conjunt segent:
{3, 4, 5, 6, 7, 8, 9, 10, 11, 22, 23, 24, 25, 26, 27, 28, 29, 34}
a s un nmero parell i est comprs entre dues vegades b i quatre vegades la diferncia c
menys d.
el quocient enter de c entre a s un nmero divisible per tres vegades d.
Quique Lorente
Pgina 17
18. Donades les variables enteres europeu, casat, muller i edat i la variable de tipus float saldo
expresseu amb llenguatge C:
europeu s igual a 1 i casat s igual a zero.
europeu s distint de zero, casat s igual a 1 i edat est compresa entre 20 i 30.
saldo s superior a 100.000 o europeu s igual a zero i edat divisible por quatre.
europeu i casat sn iguals a 1 i edat s menor que 30 o europeu s igual a zero i saldo no
s inferior a 250.000.
muller s igual a 1, europeu s igual a zero i saldo est comprs entre 50.000 i 250.000 o
muller s igual a zero, europeu s igual a 1 i edat s superior a 25 i saldo s no negatiu.
23. Escriviu un programa que desglossi certa quantitat de segons introduda per teclat en el seu
equivalent en setmanes, dies, hores, minuts i segons.
24. Realitzeu un programa que certa quantitat d'euros la passi a pessetes (canvi 166.386).
25. Escriviu un programa que expressi certa quantitat d'euros en la mnima quantitat de bitllets i
monedes de curs legal en l'actualitat.
26. Dissenyeu un programa que calculi i escrigui el percentatge descomptat en una compra,
introduint el preu real de l'article i el preu pagat.
Quique Lorente
Pgina 18
31. Feu un programa que calculi l'rea d'un trapezi, introduint per teclat els valors de les bases i la
seua altura.
A = (B + b) * h / 2
32. Escriviu un programa que llegeixi el valor corresponent a una distncia en milles marines i
l'escrigui expressada en metres (1 milla, equival a 1852 metros).
33. Escriviu un programa que calculi la velocitat d'una pilota de tennis en qm/hora, coneixent la
distncia recorreguda en metres i el temps emprat en segons per a recrrer la distancia.
34. Un corredor de marat (distncia=42.195 qm.) ha recorregut la carrera en certa quantitat
d'hores, minuts i segons. Es desitja un programa que calculi i escrigui la mitjana de temps en
minuts i segons que ha tardat per quilmetre.
Quique Lorente
Pgina 19