Índex

 
Capítol02.zip Exercicis02.zip
Capítol 2

Les dades en C.

  1. Els tipus de dades numèrics i la seva representació interna.
  2. Els tipus numèrics char, int, long....
  3. Operadors que afecten a les variables numèriques.
  4. Els tipus de caràcters.
  5. El tipus boolean. Operadors entre variables booleanes.
    1. Expressions booleanes
  6. Exercicis

 

Les dades no estructurades en informàtica són, fonamentalment de tres tipus, numèriques, de caràcters i lògiques. El llenguatge C té aquest tres tipus de dades.
 
Tipus de dades numèriques nombres sencers (int) i nombres reals o en coma flotant (float).
Tipus de dades de caràcters Existeix en C el tipus char que permet incloure amb variables d'aquest tipus cadenes de caràcters.
Tipus lògic Aquest tipus en C és en realitat una variable de tipus sencer a la que no més se li assignen dos valors 0 o distint de cero.

En el següent programa observem dues línies de declaració de variables, una amb el tipus de dades float i l'altre amb el tipus de dades char.
 

#include <stdio.h>

int main(void) 
{
    float alumnes, professors, fracciodeprofessor; 

    char pita = '\7';
    printf("%cQuants alumnes hi ha en el teu grup? ",pita); scanf("%f",&alumnes);
    printf("%cQuants professors tens en el mòdul? ",pita); scanf("%f",&professors);
    fracciodeprofessor=professors/alumnes;
    printf("Et toquen %f professors%c\n",fracciodeprofessor,pita);

    return 0;
}

Si executem aquest programa veuràs que primer et demana quants alumnes hi ha a l'aula i s'espera que contestis. Desprès et demana quants professors tens i s'espera a que contestis. La funció que realitza l'operació d'esperar a que contestis és la funció scanf. A més la dada que l'usuari introdueix des de teclat és assignada a la variable corresponent de cada scanf.
 

El diàleg pot quedar així:

Quants alumnes hi ha en el teu grup? 23

Quants professors tens en el mòdul? 5

Et toquen 0.217391 professors
Aquest és el primer programa en el que pot considerar-se que el cicle de treball amb informació és complert. Si observem el següent diagrama ens adonem que les dades d'entrada cap al programa són 23 i 5, que el programa elabora aquesta informació en la línia fracciodeprofessor = professors/alumnes i que les dades de sortida del programa són 0.217391.

2.1. Els tipus de dades numèrics i la seva representació interna.

En primer lloc un bit és una posició de memòria, un transistor que deixa passar la co-rrent o que no la deixa passar. Per a nosaltres en programació ens és suficient saber que si passa la corrent vol dir que hi ha un 1 i si no passa vol dir que hi ha un 0.

Un byte es composa de 8 bits.

  1 0 0 1 1 0 0 1 }=153
Per 2 elevat a  7 6 5 4 3 2 1 0
Com veus en la figura un byte és un nombre binari que pot traduir-se al sistema deci-mal. Així el major nombre que pot contenir un byte és el 11111111 que en decimal és el 255 i el menor és el 00000000 que és el 0. Així podem dir que el rang de valors que pot tenir un byte és de 0 a 255.

Si posem dos bytes contigus com un únic nombre podem formar la xifra binària:

11111111 11111111 = 65.535


És a dir amb dos bytes podem formar tots els nombres binaris que escrits en sistema decimal cobreixen el rang 0 a 65.535.

Si posem quatre bytes contigus com un únic nombre podem formar la xifra binària:

11111111 11111111 11111111 11111111 = 4.294.967.296


És a dir amb quatre bytes podem formar tots els nombres binaris que escrits en siste-ma decimal cobreixen el rang 0 a 4.294.967.296.

Per a representar els nombres sencers negatius es fa un conveni que depèn del compilador que s'utilitzi. Per exemple en el cas dels bytes pot fer-se que el darrer bit representi el signe, negatiu si val 1 i positiu si val 0. Així com el byte 01111111 és igual a 127 el rang que pot cobrir un byte és de -128 a 127.

Un nombre reial de precisió simple es representa amb 32 bits i un de doble precisió necessita 64 bits.

Heu de tenir present que els nombres reials així representats a la memòria desprès poden perdre precisió en les darreres xifres si són molt grans.

2.2. Els tipus numèrics char, int, long....

Els principals tipus numèrics per a variables numèriques en C son les següents:
 
Tipus Mida en bits Rang
unsigned char 8 0 a 255
char 8 -128 a 127
unsigned int 16 0 a 65.535
int 16 -32.768 a 32767
unsigned long 32 0 a 4.294.967.295
long 32 -2.147.483.648 a 2.147.483.647
float 32 3.4x10-38 a 3.4x1038
double 64 1.7x10-308 a 1.7x10308
long double 64 3.4x10-4932 a 3.4x104932

Ja hem vist a l'inici del paràgraf com es poden utilitzar i assignar valor a les variables de dades numèriques. Però ara disposem de molts tipus de dades numèriques i és necessari saber que passa si es tracta d'assignar dades d'un tipus a un altre. Observa el següent programa i el seu resultat:
 

Programa Sortida per pantalla
#include <stdio.h>
int main(void)
{
   char petita;
   unsigned char petitapositiva;
   int sencera;
   unsigned int sencerapositiva;

   petita = -23;
   petitapositiva = -23;
   printf("%d, %u \n",petita,petitapositiva);

   sencera = -345;
   sencerapositiva = -345;
   printf("%d, %u \n",sencera,sencerapositiva);

   petita = sencera;
   printf("%d \n",petita); 

    return 0;


 
 
 
 
 
 
 
 

-23, 233
 
 

-345, 65191
 

-89

Podem arribar a una conclusió: Si es tracta d'assignar un valor fora de rang a una variable numèrica aquest valor no és acceptat. A més, encara que no ha quedat explicitat, quan s'assigna el valor d'un rang inferior a un de rang superior la dada es converteix al tipus superior, però mai al contrari. En les següents sentencies de programa queda explicitat:
 

Programa Sortida per pantalla
char petita;
int sencera;
petita = 23;
sencera=petita;
printf("%d, %d\n",petita,sencera);
sencera=2341;
petita=sencera;
printf("%d, %d\n",petita,sencera);

 
 

23, 23 
 

37, 2341 

2.3. Operadors que afecten a les variables numèriques.

Existeixen operadors de diferents classes que afecten a les variables numèriques. Els més elementals són els operadors suma, resta, multiplicació i divisió. Observa el següent programa i veuràs com s'utilitzen:
 
Programa Sortida per pantalla
#include <stdio.h>
int main(void)
{
   int Numero1,Numero2,a;
   Numero1 = 10;
   Numero2 = 3;
   a=Numero1+Numero2;
   printf("%d\n",a);
   a=Numero1-Numero2;
   printf("%d\n",Numero1 - Numero2);
   printf("%d\n",Numero1 * Numero2);
   printf("%d\n",Numero1 / Numero2);

   return 0;


 
 
 
 
 

13

7
30
3

L'operador % es diu mòdul i el que fa és calcular la resta de la divisió entera dels ope-ran-dos; el resultat de 12 % 5 és 2.
Els operadors ++ i -- són els operadors increment i decrement, que incrementen o decrementen el valor d'una variable en 1.
Si i=1 llavors ++i val 2. Pot posar-se ++i o i++. En el primer cas s'incrementa el valor de la variable i després s'utilitza el valor:

i=1;
printf("%d",++i) escriurà 2;   i valdrà 2
printf("%d",i++) escriurà 1;   i valdrà 2
Observa el següent programa i tracta d'entendre-ho:
 

Programa Sortida per pantalla
#include <stdio.h>
int main(void)
{
    int Numero1,Numero2;
    Numero1 = 10;
    Numero2 = 3;
    printf("%d\n",Numero1 % Numero2);
    Numero1++;
    printf("%d\n",Numero1);
    Numero2--;
    printf("%d\n",Numero2);

   return 0;


 
 
 
 

1

11

A més tenim els operadors d'assignació de la forma +=, -=, *=, /= i %=.

En el programa següent veus que les instruccions /*1*/ i /*2*/ fan la mateixa operació que és incrementar en 2 la variable corresponent
 

Programa   Programa  
#include <stdio.h>
int main(void)
{
   int Numero1,Numero2;
   Numero1 = 10;
   Numero2 = 10;
   Numero2 = Numero2 + 2; /*1*/
   Numero1 += 2; /*2*/
   printf("%d\n",Numero1);
   printf("%d\n",Numero2);

   return 0;


 
 
 
 
 
 

12
12

#include <stdio.h>
int main(void)
{
   int Numero1;
   Numero1 = 10;
   printf("%d\n",Numero1 -= 5);
   Numero1 = 10;
   printf("%d\n",Numero1 *= 5);
   Numero1 = 10;
   printf("%d\n",Numero1 /= 5);
   Numero1 = 10;
   printf("%d\n",Numero1 %= 5);

   return 0;


 
 
 

5

50

2

0

2.4. Els tipus de caràcters.

Fins ara hem vist que el tipus char actua com a tipus numèric, però també pot actuar com a tipus caràcter:
 
Programa Sortida per pantalla
#include <stdio.h>
int main(void)
{
   char lletra;
   lletra = 65;
   printf("%d, %c\n",lletra, lletra);

   return 0;


 
 
 

65, A 

La sortida per pantalla indica que el byte de memòria té el valor 65, però que amb %d la funció printf l'interpreta com un Numero i amb %c l'interpreta com caràcter i escriu a la pantalla el caràcter corresponent a 65 a la taula de codis ASCII.

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
0
nul
J
L
©
¨
§
ª
Ÿ
T
¡
U
J
K
M
N
&#142;
16
4
3
b
P
d
§
C
Q
­
¯
®
¬
S
«
5
6
32
space
!
#
$
%
&
(
)
*
+
,
-
.
/
48
0
1
2
3
4 5
6
7
8
9
:
;
<
=
>
?
64
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
80
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
_
96
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
112
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~
O
128
Ç
ü
é
â
ä
à
å
ç
ê
ë
è
ï
î
ì
Ä
Å
144
É
æ
Æ
ô
ö
ò
û
ù
ÿ
Ö
Ü
¢
£
¥
l
ƒ
160
á
í
ó
ú
ñ
Ñ
ª
º
¿
½
¼
¡
«
»
176
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
192
 
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
208
?
?
?
?
?
?
?
?
?
f
e
g
&#144;
z
z
&#144;
224
a
b
G
P
å
ó
m
t
f
q
W
d
¥
Æ
Ç
240
º
±
³
£
ó
õ
¸
»
°
·
×
h
2

2.5. El tipus boolean. Operadors entre variables booleanes.

El tipus boolean, en si mateix, no existeix el llenguatge C. Però tota variable de tipus sencer amb valor 0 o diferent de 0 és un variable booleana que es considera certa quan val diferent de 0 i falsa quan val 0.

Així es poden fer les operacions lògiques entre variables booleanes tenint present les següents taules d'operacions:
 

AND, I, Y
A B A && B
1 1 1
1 0 0
0 1 0
0 0 0
OR, O
A B A ¦¦ B
1 1 1
1 0 1
0 1 1
0 0 0
NOT, NO
A !A
1 0
0 1
Observa la següent seqüència d'instruccions i comprova els resultats amb les taules anteriors i escrivint un programa a l'ordinador:
 
Programa Sortida per pantalla
#include <stdio.h>
int main(void)
{
   int a,b,c;
   a = 1; b= 0;c = a && b;
   printf("%d\n",c);
   c = a || b;
   printf("%d\n",c);
   c = !a;
   printf("%d\n",c);

   return 0;


 
 
 

0

1

0

2.5.1. Expressions booleanes

Una expressió booleana és de la forma dies > 5 com a exemple. Les expressions booleanes tenen també un valor de veritat. Si la variable dies conté el Numero 25 llavors l'expressió dies > 5 és certa i per contra si dies = 3 l'expressió és falsa.

Els connectors per crear expressions booleanes son:
 

<
<=
==
>=
>
!= 
menor que
menor o igual que
igual que
major o igual que
major que
diferent de

Quan una expressió és certa, internament s'avalua amb un 0, i si és falsa s'avalua amb un 1. Així podem comprovar que el resultat per pantalla en el següent exercici és el de la dreta:
 

Programa Sortida per pantalla
#include <stdio.h>
int main(void)
{
   int Numero,lletra;
   Numero = 10;
   lletra = 'J';
   printf("%d\n",Numero>20);
   printf("%d\n",Numero<15);
   printf("%d\n",lletra>'A');
   printf("%d\n",lletra<'G');

   return 0;
}


 
 
 
 

0
1
1
0

Les expressions Numero>20 o lletra<'G' són expressions simples. Es poden fer expressions compostes de dues simples amb els operadors anteriors. Per exemple una expressió composta de dues anteriors és

(Numero>20) && (lletra>'A')

que en aquest cas és falsa. Observa que per sintaxi les expressions simples s'escriuen entre parèntesi per unir-se en una sola expressió més complexa.

En el següent programa veuràs tres expressions compostes i el seu valor lògic.
 

Programa Sortida per pantalla
#include <stdio.h>
int main(void)
{
   int Numero,lletra;
   Numero = 10;
   lletra = 'J';
   printf("%d\n",(Numero>20) && (Numero<15));
   printf("%d\n",(lletra>'A') || (lletra<'G'));
   printf("%d\n",((Numero>20) && (Numero<15)) || (lletra>'A'));

   return 0;
}


 
 
 
 

0
1
1

2.6. Exercicis

  1. Posa nom i tipus de variable a aquestes magnituds, intentant no utilitzar tipus més grans dels necessàries:

  2.  
    Magnitud Nom identificatiu Tipus
    Distància entre dues ciutats(km)    
    Distància entre dos planetes(km)    
    Talla de Pantalons    
    Llargada de les cames    
    Temperatura    
    Pressupost familiar    
    Nombre de Socis del Barça    
    Pressupost del Barça    

     
  3. Quins tipus de variables i resultats s'obtenen al realitzar les operacions següents?

  4.         int a=10, b=3, c,d,e;

            float x;
            x=a/b;
            y=a + 1.25++;
            e=++a - b;
            c=a/b;
            x*=a;
            y/=x+a%b;
     

  5. Fes un programa que demani el radi d'una circumferència i ens digui la superfície, la longitud i el volum de l'esfera corresponent.

  6.  
  7. Fes un programa que demani l'alçada de tres alumnes i ens doni la mitjana aritmètica.

  8.  
  9. Millora el programa anterior de manera que ens demani també la talla de sabates i ens doni la talla mitjana i una proporció entre l'alçada i la talla de sabates. Te cura amb els tipus de dades.

  10.  
  11. Fes un programa que demani un caràcter i ens doni el seu codi ASCII.

  12.  
  13. Fes un programa que demani un codi ASCII i ens doni el seu el seu caràcter corresponent. Troba tres elements de la taula de codis ASCII de la pàgina 2.4 dels apunts que no siguin correctes i rectifica'ls.

  14.  
  15. Avalua les següents expressions booleanes i escriu el resultat.

  16.     int num=75, lletra='K';

        (num-75) || lletra;
        num&& lletra-76;
        !(++num>=lletra);
        (num<60)&&(3+lletra>='m') || !0
        !(++num>=76)&&(--lletra<80)
        !((++num>=76)&&(--lletra<80));
     

  17. Escriu un programa que tingui dues variables anomenades BonTemps i SocFeliç a les quals se'ls assigni un valor per pantalla i mitjançant la operació booleana AND ens digui si és un dia perfecte (1) o no és un dia perfecte (0 ). Executa el programa canviant els valors d'aquestes variables i completa la següent taula.

  18.  

     
     
     
     
     

    BonDia SocFeliç EsPerfecte