![]()  | 
Í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 |