Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


programacio, Apuntes de Informática

tema dos de informatica

Tipo: Apuntes

2014/2015

Subido el 05/05/2015

alberto74
alberto74 🇪🇸

4 documentos

1 / 43

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
Universitat de
Lleida
Fonaments d'Informàtica
Grau en Enginyeria Industrial
Escola Politècnica Superior
Tema 3. Introducció a la
Programació en Llenguatge C
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b

Vista previa parcial del texto

¡Descarga programacio y más Apuntes en PDF de Informática solo en Docsity!

Universitat de Lleida

Fonaments d'Informàtica

Grau en Enginyeria Industrial Escola Politècnica Superior

Tema 3. Introducció a la

Programació en Llenguatge C

TEMA 3. Introducció a la Programació en Llenguatge C

3.1 Plantejament i abordatge d’un problema. La principal raó perquè les persones aprenguin a programar, en general, és utilitzar la computadora com una eficaç eina de resolució de problemes. Ajudat per un ordinador, la resolució d’un problema es pot dividir en tres fases importants:

**1. Anàlisi del problema.

  1. Disseny o desenvolupament de l’algorisme.
  2. Resolució de l’algorisme en la computadora.** El primer pas - anàlisi del problema - requereix que el problema sigui definit amb tot detall i perfectament entès per poder analitza’l amb tot detall. Una vegada analitzat el problema, s’ha de desenvolupar l’algorisme. Per últim, per resoldre l’algorisme mitjançant una computadora es necessita codificar <> l’algorisme en un llenguatge de programació -QBASIC, PASCAL, COBOL, FORTRAN, C,etc.. - executar-lo i comprovar que el programa soluciona veritablement el problema plantejat. 3.1.1 Anàlisi del problema. El propòsit de l’anàlisi d’un problema és ajudar al programador a arribar a una certa comprensió de la natura del problema. El problema ha d’estar ben definit si es desitja arribar a una solució satisfactòria. Per definir amb certa precisió el problema es requereix que les especificacions d’entrada i sortida siguin definides amb detall. Una bona definició del problema, junt amb una descripció detallada de les especificacions d’entrada i sortida, són els requisits més importants per arribar a una solució eficaç. Per tant, el primer pas a realitzar per afrontar la resolució d’un problema serà contestar a les següents preguntes:
  • Quina informació ha de proporcionar el problema? ( sortides )
  • Quines dades es necessiten per resoldre el problema? ( entrades ) Exemple 1 : Llegir el radi d’un cercle, calcular, imprimir la seva superfície i circumferència. Anàlisi: La única dada que es necessita per assolir els objectius plantejats és el radi del cercle, donat que pot prendre qualsevol valor, aquesta dada serà de tipus real. Les sortides seran la superfície i circumferència que seran de tipus real. Entrades: Radi del cercle. Sortides: Superfície del cercle. Circumferència del cercle.

3.1.3 Resolució del problema mitjançant la computadora. En aquesta fase és quan realitzem el programa, que pugui ésser executat per l’ordinador; però: Què és un programa? Un programa no és més que la implementació de l’algorisme dissenyat en el punt anterior, en un llenguatge de programació i seguint les regles gramaticals o de sintaxis del mateix. La fase de conversió de l’algorisme en un llenguatge específic s’anomena codificació. Els algorismes estan escrits o representats en un llenguatge que el computador no pot interpretar, per això cal transformar-lo seguint els passos que mostra la següent figura. En primer lloc, cal implementar l’algorisme en un llenguatge de programació (codificació). Una vegada codificat (codi font) , s’ha de compilar obtenint el codi objecte. Què és el codi objecte? Com ja sabem els ordinadors treballen amb el sistema binari, és a dir, totes les instruccions i dades que processen es representen per mitjà de zeros i uns (llenguatge màquina). Per un programador és difícil treballar en format binari, ja que una successió de zeros i uns és molt complicada d’entendre i recordar. Per aquesta raó es van crear els llenguatges de programació, compostos de símbols i paraules molt més pròxims al llenguatge natural. Entenem per llenguatge natural el que està constituït per paraules que formen frases amb sentit per nosaltres. Com que l’ordinador és incapaç de treballar directament amb aquesta simbologia, hi ha d’haver una manera de traduir el programa font al sistema binari. Aquesta és la funció del programa traductor. Per tant la feina d’aquest és, bàsicament, una anàlisi del programa font per crear el programa objecte , en codi màquina, per mitjà de la consulta d’una sèrie de taules. Els programes traductors es poden classificar en: -Programes intèrpret. -Programes compilador. Un programa intèrpret és el que tradueix cada instrucció del programa font a llenguatge màquina i l’executa immediatament abans de passar a la instrucció següent. Si el programa font té un error, la màquina l’executarà fins a la instrucció on es troba aquest error.

Un programa compilador és un programa que tradueix a llenguatge màquina un programa font, una vegada que ha comprovat que no hagi cap error de tipus lèxic (us correcte del vocabulari del llenguatge) o sintàctic ( us de construccions sintàctiques correctes). En cas d’error, el compilador generarà un missatge d’error. De tota manera, l’ordinador és incapaç d’executar directament un programa compilat sense errors. Es necessita un pas més per crear un programa executable: l'enllaçador. (linkador). En general , la major part de les vegades, un programa té més d’un mòdul objecte , que s’han d’enllaçar o unir. Una de les raons d’aquesta fragmentació és la comoditat. El programador acostuma a dividir el programa en parts o mòduls (llibreries), de manera que les funcions incloses en cada una estiguin relacionades entre elles. Així es pot obtenir una llibreria d’entrada/sortida de dades, una de càlculs numèrics, una de gràfics, una de cadena de caràcters, etc.. Cada una es compila per separat i genera un mòdul objecte diferent. A més a més aquests mòduls poden ésser reutilitzats. El programador ha de fer programes molt semblants en moltes ocasions, o simplement, utilitzar una sèrie de mòduls que es repeteixen a la major part de les feines. Procedint així només a desenvolupar els mòduls nous. Una altra de les raons que obliguen a fragmentar un programa és l’extensió o la complexitat, que implica que el programador passi molt temps confeccionant-lo. La manera d’agilitzar la realització és dividir el programa en diferents mòduls, perquè cadascun el faci un programador. Per tant, després de crear els mòduls, només falta unir-los per mitjà d’un enllaçador (linkador) , per obtenir un programa executable. Una vegada obtingut un programa executable, sense errors de compilació ni d’enllaçament, vindrà la part més difícil: comprovar que un programa funciona bé; és a dir, veure que el programa no conté errors lògics. La bondat d’un programa es pondera en funció dels següents aspectes: a) Correcció : Ha de complir les especificacions donades exactament. b) Eficiència : Pot ser avaluat des de dos punts de vista diferents:

  • Eficiència en el temps: Un programa serà més eficient en el temps quan menys temps de la màquina requereix la seva execució.
  • Eficiència en l’espai: Fa referència a la quantitat de memòria d’emmagatzemament necessari per executar-lo. c) Flexibilitat :Canvis menors en l’entorn (Coordenades del procés) han de permetre una acomodació del programa sense necessitat de reescriure’l. d) Llegibilitat : Consisteix en la facilitat d’interpretació del que el programa fa a partir de la seva lectura. Aquest factor és crític quan el programa assoleix una certa complexitat. e) Portabilitat : Un altre aspecte que hem de tenir en compte a l’hora de fer un programa és que es pugui instal·lar en diferents tipus d’ordinador sense haver-ne de canviar el codi corresponent.

Connector dins d’una pàgina. Representa la continuïtat del diagrama dins de la mateixa pàgina. Línies de flux o direcció. Indiquen la seqüència en que es realitzen les operacions. Recomanacions pel disseny de Diagrames de Flu x: o S’han d’utilitzar solament línies de flux horitzontals i/o verticals. o S’ha d’evitar el creuament de línies utilitzant els connectors. o S’han d’utilitzar connectors solament quan sigui necessari. o No han de quedar línies de flux sense connectar. o S’han de traçar els símbols de manera que es puguin llegir de dalt cap a baix i d’esquerra a dreta. o Tot text escrit a dins d’un símbol haurà de ser escrit clarament, evitant l’ús de moltes paraules. Exemple: Calcular el salari net d’un treballador a partir de la lectura del nom, hores treballades, preu de la hora, i sabent que els impostos aplicats són el 10% sobre el sou brut. Encara que els diagrames de flux és una manera molt senzilla de representar un algorisme, presenten els següents inconvenients:

  • Qualsevol mínima modificació ens obliga a reorganitzar-lo de nou.
  • El procés de recórrer el graf des del principi al final pot ésser complex.

3.2.2 Pseudocodi Barreja de llenguatge de programació i català (o anglès o qualsevol altre idioma) que s’utilitza, dins de la programació estructurada, per a realitzar el disseny d’un programa. El pseudocodi es pot definir com un llenguatge d’especificacions d’algorismes. És la representació narrativa dels passos que ha de seguir un algorisme per a donar solució a un problema determinat. El pseudocodi utilitza paraules que indiquen el procés a realitzar. L’estructura d’un algorisme és la següent: Algorisme nom_algorisme const {Definició de constants} fconst tipus {Definició de Tipus} ftipus var {Declaració de variables} fvar {Acció 1} {Acció 2} ... falgorisme Avantatges d’utilitzar Pseudocodi a un Diagrama de Flux o Ocupa menys espai en un full de paper. o Permet representar en forma fàcil operacions repetitives complexes. o És molt fàcil passar de pseudocodi a un programa en qualsevol llenguatge de programació. Exemple: Calcular el salari net d’un treballador a partir de la lectura del nom, hores treballades, preu de la hora, i sabent que els impostos aplicats són el 10% sobre el sou brut. Algorisme {nom_del_algorisme} tipus tnom = taula [1..20] de caràcter ftipus

3.3 Estructura d’un programa en C L’estructura general d’un programa senzill en C és el següent: declaració d'importacions declaració de constants definició de tipus int main(void) { declaració de variables locals seqüència d’instruccions } f1( ) { variables locals seqüència de sentències } f2( ) { variables locals seqüències de sentències } . . . fn( ) { variables locals seqüència de sentències } La declaració de importacions s’utilitza per comunicar al compilador quines funcions esmentades en el programa es troben en altres mòduls. A fi de simplificar aquesta declaració, molts mòduls tenen associat un fitxer amb extensió .h (arxius de capçalera) que conté la llista de les funcions importables, llavors només caldria incloure’l amb una instrucció del tipus #include <nom_modul.h> Exemples de mòduls emprats amb freqüència són “ stdio.h” (que conté els procediments d’entrada i sortida) i “ math.h” (que conté funcions matemàtiques). Les definicions de constants assignen a un identificador una cadena de caràcters o bé una valor numèric. Un procés previ a la compilació substituirà el identificador pel seu valor corresponent. El seu format és: #define identificador valor

La declaració de tipus permet definir tipus de dades diferents dels ja implementats en llenguatge C. La declaració de nous tipus serà tractada en una secció posterior. Tots els programes en C consisteixen en una o més funcions. La única funció que té que està sempre present és l’anomenada main() , essent la primera funció que es crida quan comença la execució d’un programa. Tal com s’explicarà en capítols posteriors un bon programa estructurat es divideix en diferents subproblemes (disseny descendent), els quals els representem per f1()...fn(); on f1()....fn() representen funcions definides per l’usuari. El tema del disseny descendent s’abordarà en capítols posteriors. A continuació podem veure un programa molt bàsic escrit en C: #include <stdio.h> /* aquí comença el programa */ int main(void) { printf("Benvingut a C"); } Aquest programa desplega el missatge Benvingut a C en la pantalla. La primera línia és una ordre al compilador per a que s’inclogui un arxiu de biblioteca, o sigui, un arxiu que conté funcions incorporades en C com per exemple printf. La segona línia és un comentari. Els comentaris no tenen cap efecte en la sortida per pantalla però són molt útils per a seguir el codi. La tercera línia és l’encapçalament de la funció main(). Aquesta funció és obligatòria i es pot tractar com a qualsevol altra, en aquest cas, main() no torna ni rep res. Les claus marquen el inici i el final del bloc que composa la funció, i la cinquena línia és una crida a una funció de la llibreria stdio.h , la funció printf , que rep un argument i el mostra per la pantalla. Totes les sentències en C acaben en un punt i coma (;). Com es pot veure, C es basa en funcions, pel qual s’incentiva l’ús d’una programació estructurada. Les funcions fan els programes més sistemàtics, ja que són en gran part independents unes de les altres. 3.4 Tipus de dades en C Tipus Byte s Descripció Rang char 1 caràcter -128 a 127 unsigned char 1 caràcter positiu 0 a 255 int 4 enter -2.147.483.648 a 2.147.483. unsigned int 4 enter positiu 0 a 4.294.967. long int 4 enter llarg -2.147.483.648 a 2.147.483. unsigned long int 4 enter llarg positiu 0 a 4.294.967.

3.4.2 Operadors Aritmètics Suma + Diferència - Producte * Quocient / Mòdul % Autoincrement ++ /augmenta una variable en 1/ Autodecrement -- /disminueix una variable en 1/ Comparació Igual = = Diferent != Menor o igual <= Major o igual >= Major > Menor < Lògics AND && OR || NOT! Exemple (si a és igual a b i (no és cert que b és major que c o és cert que a és diferent de 6) if ((a= =b) && (!(b>c) || (a!=6))) Assignació Assignació = Multiplicar i assignar *= Dividir i assignar /= Mòdul i assignar %= Restar i assignar -= Sumar i assignar +=

3.5 Estructures de Selecció Les sentències de selecció permeten crear "bifurcacions" dins dels programes, depenent de si una condició es certa o no en algun moment donat. C incorpora dues sentències d’aquest tipus: if i switch. 3.5.1 La sentència IF Té la següent forma: if (expresion) sentència; else sentència; on sentència pot ser una sentència simple, un bloc de sentències o simplement res (sentències buides). Expressió és qualsevol expressió vàlida en C, si és certa (qualsevol valor distint de zero) llavors s’executa la primera sentència, en cas contrari, s’executa la sentència corresponent al else. Exemple: #include <stdio.h> int main(void) { int num; printf("Introdueixi un número: "); scanf("%d", &num); if (num < 0) printf("El número %d és negatiu", num); else if(num == 0) printf("El número es zero"); else printf("El número %d és positiu", num); return 0; }

3.6 Estructures Iteratives o de Repetició 3.6.1 El bucle FOR El bucle for en C compleix la mateixa funció que en la resta dels llenguatges de programació, però, a més, se li afegeix una potència i flexibilitat únics, el qual el converteix en una eina força poderosa. La forma és la següent: for(inicialització; condició; increment) sentència; On inicialització és una sentència d’assignació per a inicialitzar la variable de control del bucle, condició és una expressió relacional que determina el final del bucle i increment defineix com canvia la variable de control cada vegada que s’executa una iteració del bucle. Exemple: #include <stdio.h> /* Imprimeix els nombres de l’1 al 100 / int main(void) { int x; for (x=1; x<=100; x++) printf("%d ", x); return 0; } En aquest exemple, x s’inicialitza a 1 i es compara amb 100, ja que la condició és certa, s’executa la funció printf() i x s’incrementa en 1, aquest bucle es repeteix fins que x es major que 100. A continuació, un exemple del bucle for amb vàries sentències: #include <stdio.h> / Imprimeix el quadrat dels nombres del 10 a l’1 / int main(void) { int i, x; for (i=10; x>0; x--){ x := ii; printf("%d al quadrat és: %d\n", i, x); return 0; }

3.6.2 El bucle WHILE Anomenat bucle "mentre", executa una sentència mentre certa condició sigui vertadera, la seva forma és la següent: while(condición) { sentencies;} On sentència és una sentència vàlida o un bloc de sentències. La condició pot ser qualsevol expressió, i, a més, qualsevol valor diferent de 0 és cert. Exemple: #include <stdio.h> int main(void) { int i; float x, suma, mitjana; /* llegeix números des del teclat per a calcular la seva mitjana, acaba quan s’introdueix –1 */ x = suma = 0; i = 1; while (x != -1){ printf("\nIntrodueix el valor %d:", i); scanf("%f", &x); suma += x; } mitjana := suma/i; printf("\nLa mitjana és: %f / %d = %f", suma, i, mitjana); return 0; } 3.6.3 El Bucle DO-WHILE A diferència dels bucles anteriors, que analitzen la condició al principi dels mateixos, el bucle do-while ho fa al final, això significa que s’executa sempre al menys una vegada. La seva forma general és: do{ sentència; }while(condició); Les claus no són necessàries en el cas d’una sentència simple, però es recomana posar- les per raons de llegibilitat, aquest bucle iterarà fins que la condició sigui falsa. Exemple: El següent bucle llegeix números des del teclat fins que troba un número negatiu: do{ scanf("%d", &num); }while(num != 0);

int main(void) { int a = 3; char c ='B'; float d; d = 4.3; printf("Tinc %d anys.\n",a); printf("Estic a la classe %c\n",c); printf("\t\tI les meves notes són %f",d); printf("\nEl codi ascii de la lletra %c és %d",c,c); return 0; } Es poden escriure enters entre el signo de percentatge i el caràcter que especifica el tipus de dada a presentar. Això serveix per a determinar la longitud del camp, el nombre de decimals i un indicador de justificació a l’esquerra. Per a especificar la longitud del camp, només cal escriure el número després del signe de percentatge; després s’agrega un punt i el número de posicions decimals que es desitja presentar en el cas dels números en coma flotant. Si la cadena és major que la amplada del camp, es trunquen els caràcters pel final. Per exemple, %12.4f determina un número de com a màxim dotze caràcters de longitud amb quatre posicions per a la part decimal. Quan s’aplica a cadenes de caràcters o enters, el número després del punt determina la màxima longitud del camp. Per exemple %3.5s presenta una cadena que té almenys tres caràcters i que no excedeix de cinc. Si la cadena es major que el camp, es trunquen els caràcters pel final. Per defecte, tota sortida està justificada per la dreta. En altres paraules, si l’amplada del camp és major que la de les dades presentades, aquestes són situades en la part dreta del camp. Es pot forçar que la informació quedi justificada a l’esquerra situant un signe menys immediatament després del signe de percentatge. Per exemple %-6.3f justifica un número en coma flotant per l’esquerra amb tres posicions decimals en un camp de sis caràcters. Exemple: printf("%10.3f\n",10.30); printf("%10.3f\n",10.30); printf("%-10.3f\n",10.30); Resultat

3.7.1.2 Funció scanf()

  • Utilitat: Permet llegir dades de l’entrada estendard, generalment el teclat, segons el format especificat en el primer argument i emmagatzema el resultat de la lectura en les variables que rep com argument.
  • Sintaxi: scanf(“format”, llista d’arguments);
  • Exemple: #include <stdio.h> int main(void) { int a; char b; printf("Introdueix un numero:"); scanf("%d",&a); fflush(stdin); printf("Entra una lletra:"); scanf("%c",&b); fflush(stdin); printf("El nombre és:%d\n",a); printf("La lletra és:%c\n",b); return 0; } La secció de format correspon als modificadors " %d, %c, %f, etc ", on s’indica el tipus de valor que s’ha de llegir; &a correspon a llista_arg i indica que els caràcters llegits seran emmagatzemats a l’adreça que ocupa la variable a. La diferència entre la sintaxi de scanf() y printf() consisteix en que en la llista d’arguments, scanf() necessita que se li especifiqui que el lloc on s’emmagatzemaran les dades és en l’adreça de la variable( &a ). La única excepció és quan es va a llegir una cadena de caràcters, ja que aquest tipus de variables indiquen una adreça per si mateixes. Exemple: char nom[10]; scanf("%s", nom);