![]() |
Índex |
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';
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.
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 |
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.
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;
sencera = -345;
petita = sencera;
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 |
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
|
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 2 |
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
|
#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 |
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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 | 5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
|
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
?
|
|
|
|
|
z |
z
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Així es poden fer les operacions lògiques entre variables
booleanes tenint present les següents taules d'operacions:
|
|
|
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 |
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
|
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
|
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 |
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;
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));
BonDia | SocFeliç | EsPerfecte |