Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C...

27
Programaci´o en C Informatica biotecnologia: Curs 07/08 Aquestes s´ on les transpar` encies de classe de la part de programaci´ o en C de l’assignatura de Inform` atica de la Llicenciatura de Biotecnologia de la UAB. Aquestes transpar` encies van ser creades per en Llu´ ıs Alsed` a. Aquesta ´ es una versi´ o de Yago Antol´ ın pel curs 2007/2008. Contents 1 Sessi´ o1 1 1.1 ¿Com es fa un programa? ................................. 1 1.2 Algorismes ......................................... 2 1.3 Aritm` etica bin` aria ..................................... 3 2 Sessi´ o2 5 2.1 Estructura d’un programa ................................. 5 2.2 Tipus de dades, operadors, preced` encia. ......................... 5 2.3 La Llibreria stdio.h ..................................... 8 2.4 Flux de dades I ....................................... 8 3 Sessi´ o3 10 3.1 Flux de dades II ...................................... 10 3.2 La coerci´ o de tipus de dades ................................ 11 3.3 Entrada/sortida — Formats d’impressi´ o ......................... 11 4 Sessi´ o4 14 4.1 Funcions ........................................... 14 4.2 Variables locals i globals .................................. 15 4.3 Els operadors de direcci´ o i indirecci´ o ........................... 15 4.4 Par` ametres del main .................................... 16 5 Sessi´ o5 18 5.1 Vectors i matrius ...................................... 18 5.2 Cadenes de car` acters .................................... 21 6 Sessi´ o6 24 6.1 Preprocesador i macros .................................. 24 6.2 Entrada/sortida: Fitxers .................................. 24 1 Sessi´ o1 1.1 ¿Com es fa un programa? ¿Qu` es un programa? Un algorisme ´ es una seq¨ u` encia d’instruccions. Un llenguatge de programaci´o ´ es un llenguatge que es pot fer servir per controlar un ordinador. Un programa (en C) ´ es un fitxer de text que cont´ e un algorisme escrit utilitzant el lleguatge de programaci´ o C. 1

Transcript of Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C...

Page 1: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

Programacio en C

Informatica biotecnologia: Curs 07/08

Aquestes son les transparencies de classe de la part de programacio en C de l’assignatura deInformatica de la Llicenciatura de Biotecnologia de la UAB. Aquestes transparencies van ser creadesper en Lluıs Alseda. Aquesta es una versio de Yago Antolın pel curs 2007/2008.

Contents

1 Sessio 1 11.1 ¿Com es fa un programa? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 Algorismes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.3 Aritmetica binaria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2 Sessio 2 52.1 Estructura d’un programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.2 Tipus de dades, operadors, precedencia. . . . . . . . . . . . . . . . . . . . . . . . . . 52.3 La Llibreria stdio.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.4 Flux de dades I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

3 Sessio 3 103.1 Flux de dades II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103.2 La coercio de tipus de dades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113.3 Entrada/sortida — Formats d’impressio . . . . . . . . . . . . . . . . . . . . . . . . . 11

4 Sessio 4 144.1 Funcions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144.2 Variables locals i globals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154.3 Els operadors de direccio i indireccio . . . . . . . . . . . . . . . . . . . . . . . . . . . 154.4 Parametres del main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

5 Sessio 5 185.1 Vectors i matrius . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185.2 Cadenes de caracters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

6 Sessio 6 246.1 Preprocesador i macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246.2 Entrada/sortida: Fitxers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

1 Sessio 1

1.1 ¿Com es fa un programa?

¿Que es un programa?Un algorisme es una sequencia d’instruccions.Un llenguatge de programacio es un llenguatge que es pot fer servir per controlar un ordinador.Un programa (en C) es un fitxer de text que conte un algorisme escrit utilitzant el lleguatge de

programacio C.

1

Page 2: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

Compilant el programa obtenim un fitxer executable. L’executable conte instruccions de proces-sador, que s’executen quan el Sistema Operatiu les hi envia.

El programa ’bondia.c’

Exemple 1.//programa bondia.c/* Aquesta lınea i l’anterior son comentaris*/

#include<stdio.h>

int main(){printf("Bon dia a tothom\n");return 0;

}

Compilant bondia.c

Bondia.c −→ gcc -Wall Bondia.c -o Bondia.exe −→ Bondia.exe

• bondia.c: es el fitxer font. Es crea amb un editor. Per exemple el Kate.

• gcc -Wall bondia.c -o bondia.exe: es la instruccio de compilacio

• Bondia.exe: es el programa (executable). S’executa com qualsevol altra comanda: Passant elseu nom al Sistema Operatiu.

1.2 Algorismes

Escrivint algorismes

• Descrivim una sequencia finita d’instruccions.

• Cal que hi consti l’inici i el final i a mes cal que estiguin definides les variables.

• Cal que sigui concıs, detallat i precıs.

• Usarem instruccions com ara Llegir del teclat, Escriure per pantalla, Si(Condicio)- Instruc-cions -FiSi, Repetir - Instruccions - Mentre(Condicio) ...

Nota. No hi ha una manera estandar per escriure algorismes.

Un algorisme per calcular l’area d’un triangle

ALGORISME: Calcular l’area d’un triangle

INICIVARIABLES

Area Tipus realBase Tipus realAltura Tipus real

ALGORISMEEscriure "Introdueix la base del triangle"Llegir BaseEscriure "Introdueix l’alcada del triangle"Llegir AlturaArea = (Base * Altura)/2Escribir "L’area del triangle es", Area

FI

2

Page 3: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

Un algorisme per calcular el factorial de un nombre

n! = n(n− 1)(n− 2) . . . 3 · 2 · 1

Por exemple 4! = 4 · 3 · 2 · 1 = 24.

ALGORISME: Calcular el factorial de un numero

INICIVARIABLES

numero Tipus enterfactorial Tipus enter

ALGORISMEEscriure "Introdueix un nombre enter del qual en calcularem el factorial"Llegir numeroSi (numero >0)

factorial = 1Repetir

factorial = factorial * numeronumero = numero -1

Mentre (numero > 0)Escriure "El factorial es", factorial

FiSiFI

1.3 Aritmetica binaria

La memoria La memoria de l’ordinador emmagatzema la informacio com a sequencies de bits(zeros i uns). La memoria s’organitza en bytes que son paraulas de 8 bits. Quan l’ordinador realitzacalculs:

• Treballa amb nombres escrits amb un nombre fixat de bytes. Es a dir, no es pot operar ambnombres arbitrariament grans.

• Les operacions depenen de l’aritmetica binaria. Aixo te consequencies, per exemple, als tipusd’arrodoniment.

Passar de binari a decimal: L’ordinador utilitza bits per representar signe (+ -) i punt “decimal”.Per simplificar, farem servir - per representar un numero negatiu i . pels “decimals”.

Exemple 2. Per exemple el numero 1101.1

Posicions dels bits: pos 3 pos 2 pos 1 pos 0 . pos -1Num. binari: 1 1 0 1 . 1

Num. decimal: 1 · 23 + 1 · 22 + 0 · 21 + 1 · 20 + 1 · 2−1 = 13 + 2−1

Aritmetica binaria Les operacions seguexen les mateixes regles que en el cas decimal. Per mul-tiplica nomes cal saber-se les tules del 0 i de l’1!!!!

Exemple 3. Suma, resta i producte binari.

Suma 2 + 3 Resta 5 - 3 Producto 5× 3

11 0

+ 1 11 0 1

1 0 1- 1 10 1 0

1 0 1× 1 11 0 1

1 0 11 1 1 1

3

Page 4: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

Exemple 4. Divisio

101110

11110110100

|10101.1

1010111010011101001110...

|1111.010101. . .

4

Page 5: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

2 Sessio 2

2.1 Estructura d’un programa

Un exemple que fa calculs: el programa area.c El seguent programa calcula l’area d’un cerclede radi r. El radi es llegeix del teclat.

Exemple 5.// Programa area.c#include <stdio.h>#define PI 3.141592653589793238462643383279502884197

int main (){

double r;printf("Entra el radi del cercle: ");scanf ("%lf", &r);printf("\nL’area es: %14.6f\n\n", PI*r*r);return 0;

}

Totes les instruccions de C s’han d’acabar en punt i coma ;

Estructura d’un programa

/* Capcalera d’identificacio del programa i l’autor *//*Fitxer: nom.cContingut: Exemple d’estructura d’un programa en CAutor: nom de l’autorRevisio: preliminar; data de la darrera modificacio */

/* Comandes del preprocessador. Son de dos tipus *//* Tipus 1: inclusions de fitxers de capcelera. Per exemple: */

#include <stdio.h>/* Tipus 2: definicio de constants simboliques. Per exemple: */#define PI 3.141592653589793238462643383279502884197

int main() /* Funcio principal. Hi poden haver parametres *//* El programa es comenca a executar per aquı */

{/* Declaracions. Per exemple: */

double r;.. /* cos de la funcio principal; instruccions del programa*/.

} /* Fi del main *//* FUNCIONS AUXILIAR

2.2 Tipus de dades, operadors, precedencia.

Tipus de dades

5

Page 6: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

Especificacio bytes Rang Precisiounsigned char 1 0 — 255(signed) char 1 -128 — 127

unsigned short (int) 2 0 — 65535(signed) short (int) 2 -32768 — 32767

unsigned (int) 4 0 — 4294967295(signed) int 4 -2147483648 — 2147483647

unsigned long (int) 4 0 — 4294967295(signed) long (int) 4 -2147483648 — 2147483647

float 4 3.4 x 10±38 15 dıgitsdouble 8 1.7 x 10±308 15 dıgits

long double 12 1.1 x 10±4932 15 dıgits

Constants:

’A’ ’3’ ’\t’ char3 char short int long unsigned-27 char short int long-100000 int long4294967200 unsigned int unsigned long3. 3.0 float double long double-0.03 -3.0e-2 float double long double

Declaracio de variables Qualsevol declaracio de variable consistira en una especificacio de tipus:

char, int, float

precedida d’un modificador:

unsigned, signed, short, long

a menys que aquest ultim ja indiqui clarament el tipus de variable.

Exemple 6.unsigned short natural; /* La variable ’natural’ es declara */

/* com un enter positiu */int i, j, k = 1; /* Les variables ’i’ ’j’ ’k’ */

/* seran enters (amb signe). */

Aquı s’han fet tres operacions diferents:

• Declaracio de variables (que consisteix en la reserva de memoria que ocupara la variable il’etiquetatge del “calaix” de memoria que ocupa).

• Inicialitzacio de variables. La variable k pren el valor 1.

El tipus char El Sistema Operatiu utilitza una codificacio estandar d’alfabet llatı. Aquesta codi-ficacio depen de la configuracio regional la qual esta basada en la codificacio ASCII de 7 bits.

Comandes a executar:. $ man iso 8859-15 o be $ man latin9

Les variables tipus char utilitzan 8 bits per emmagatzemar nombres. En funcio de la codificaciopel Sistema Operatiu, cada numero 0-255 representa un caracter.

Exemple 7.char caracter=’a’; //La variable caracter val 97

6

Page 7: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

Els operadors

operadors aritmetics: % modul (nomes per enters)* \ producte i divisio+ - suma i resta

operadors relacionals: < <= mes petit (o igual) que> >= mes gran (o igual) que== != igual i diferent

operadors logics: ! no(proposicio logica)&& i logic|| o logic

operador incrementals: ++ increment una unitat-- decreixment una unitat

Exemple 8.5 % 3; // El resultat es 25 > 3; // El resultat es veritat5 <=3; // El resultat es fals

!(5 > 3); // El resultat es fals(5 > 3)||(3 < 5) // El resultat es vertitat

num++; // Aquestas dues linea fan el mateixnum = num+1;

Exemple 9. Compte!!:

real = 3/2; // El resultat es 1.0; NO 1.5

real = 3.0 / 2; // En canvi, ara, el resultat sı que es 1.5.

Precedencia dels operadors en C

Operador Significat( ) Crida a funcio[ ] Acces a component de vector.-> Acces a camp d’estructura! Negacio logica

++ -- Autoincrement i autodecrement+ - Indicacio i canvi de signe* & Indireccio i adreca

( tipus ) Coercio de tipussizeof() Numero de bytes% * / Modul, producte i divisio+ - Suma i resta

< <= > >= Comparacio de nombres== =! Igualtat i diferencia logica&& i logica|| o logica? : Expressio condicional= Assignacio

+= -= Assignacio amb operacio*= /= \%= Assignacio amb operacio

, Concatenacio

7

Page 8: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

A la taula es poden observar els operadors (ordenats de mes a menys prioritat, amb els grups deprioritat separats per lınies horitzontals) i el seu significat. Evidentment, els parentesis es poden usarper trencar la prioritat d’un determinat conjunt d’operadors en una expressio. Es molt recomanableemprenar parentesis en els casos en que l’ordre d’avaluacio no quedi clar sense consultar la taula deprecedencia d’operadors.

2.3 La Llibreria stdio.h

Entrada/sortida: basics La llibreria stdio.h (standart input/output) ens permet utilitzar lesfuncions:

• printf per escriure a la pantalla

• scanf per llegir del teclat

La inclourem a traver de la commanda de preprocesador

#include<stdio.h>

Exemple 10.int a; \\creem una variable de tipus intfloat real=3.2; \\creem una varible real amb valor 3.2

printf("Escriu un nombre enter\n"); \\escribim a la pantallascanf("%d",&a); \\llegim un nombre del teclat i

\\el guardem a la variable a

printf("Has escrit %d i real val %f\n",a, real);\*imprimim el nombre que vam escriure i el valor que conte real*\

2.4 Flux de dades I

Instruccions de control de flux: l’if

if (expressio ) instruccio ;else instruccio ;if (expressio ) {

instruccio ;..

instruccio ;}else{

instruccio ;..

instruccio ;}/* fi de l’if */

Exemples

Exemple 11. Suposem que tenim ax2 + bx + c.

disc = b*b - 4*a*c;if(disc < 0) printf("Discriminant negatiu. No hi ha arrels reals.\n");else {

disc = sqrt(disc); a = 2*a;

8

Page 9: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

printf("Les arrels son: %f i %f\n", (-b+disc)/a,(-b-disc)/a);}

Exemple 12. if(((a > 0) && (d*c <= a)) || (d > 0 && d < 4))printf("Les variables a, d i c son correctes\n");

9

Page 10: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

3 Sessio 3

3.1 Flux de dades II

Instruccions de control de flux: els llacos for i while

for (inicialitzacio; /* Per ex.: i = 0 */expressio; /* Per ex.: i < LIMIT */continuaci ; /* Per ex.: i = i + 1 */){instruccions;...}/* fi del for */

while (expressio) {instruccions;...}/* fi del while */

do {instruccions ;...}while (expressio);

Exemple 13.for (i = 0, pot=1; i <= n; i++, pot *= 3) printf ("3^%d = %d\n", i, pot);%

Equivalencia entre el llac for el i el while

for( inicialitzacio ; inicialitzacio ;expressio ; while( expressio )continuacio ; {

){ ;instruccions ; instruccions ;

continuacio ;} /* fi del for*/ } /* fi del while */

Exemple 14.

pot = 1; i=0; pot=1;for (i = 0; i <= n; i++){ while(i <= n){printf ("3^%d = %d\n", i, pot); printf ("3^%d = %d\n", i, pot);pot = pot * 3; pot = pot * 3; i = i + 1;’}’ }

Control de flux dels llacos: break; i continue; L’estructura de control d’un programa noreflecteix el que realment fa el processador (salts condicionals i incodicionals) en l’aspecte del controlde flux d’un programa.

El llenguatge C, no obstant aixo, incorpora instruccions que ens acosten mes a la realitat de lamaquina com la sortida forcada de bucle (break) i la de continuacio forcada del bucle (continue).

Nota. Tambe existeix la instruccio de salt incondicional goto, que, per a conservar la programacioestructurada, no s’ha d’utilitzar mai.

Problema d’exemple: Per n variant de 1 a 20 i a enter positiu calcular n/(n2−a∗n+375) sempreque el denominador sigui positiu.

Variant 2: Fer el calcul nomes fins la primera vegada que el denominador no es positiu.

10

Page 11: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

El programa llacos.c

Exemple 15.// Programa llacos.c

#include <stdio.h>void main (){int a, n;printf("Entra el parametre a: "); scanf("%d",&a);for (n = 1; n <= 20; n++){ int denom;denom = n*n -a*n + 375;printf("n = %d:\n",n);

// Metode inicial// if (denom > 0)

// Quan la resta del llac es molt gran pot ser mes clar:// if (denom <= 0) continue;

// Variant 2:// if (denom <= 0) break;

printf ("Formula = %lf\n",((double) n)/denom);}

}

3.2 La coercio de tipus de dades

La coercio de tipus de dades A l’exemple anterior noteu l’expressio ((double) n)/denom. Siposem simplement n/denom el resultat es trunca a un enter (erroni!!). Per forcar que el resultat siguifloat o double es pot fer la potineria: (n*1.0)/denom.

La manera de fer-ho pero es forcant el canvi de tipus. L’expressio ((double) n) te com a resultatel nombre n pero en format double. En general, el canvi de tipus es pot forcar indicant el tipus d’unoperand entre parentesis que el precedeixin. Es a dir:

( especificacio_tipus ) operand

Exemple contrari: Si a es un float o un double positiu, llavors

(int) a

torna la part entera de a.

3.3 Entrada/sortida — Formats d’impressio

Sortida La instruccio base es:

printf( format d’escriptura entre cometes, llista de variables a imprimir );

Exemple 16.printf( "L’import de la factura numero %5d", NumFact );printf( "del Sr. %s puja a %d Euros.\n", NomClient, Import );

El format pot contenir caracters especials i especificadors de camp. Si s’especifiquen mes campsa imprimir que variables a la llista d’objectes imprimir, els resultats son imprevisibles (en general,veurem caracters estranys a la pantalla).

11

Page 12: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

Caracters especials

\n newline\f form feed\b backspace\t tab\nnn ASCII nnn\0nnn ASCII nnn (octal)\0xnn ASCII nn (hexadecimal)\\ backslash%% el caracter del %

Especificadors de camps

% [-][+][amplada[.precisio ]]tipus-dada%d enter en base decimal%i enter amb signe (igual a d)%u enter no signat%o enter en base vuit (octal)%x enter en hexadecimal%c caracter%s cadena de caracters%f real en punt flotant%e real en format exponencial%g real en format e, f o d%% el caracter del %

• El signe -indica que el camp s’alinea a la dreta, cosa comuna per a la impressio de nombresenters el signe del qual nomes s’escriu en cas que siguin negatius a menys que no s’indiqui +.

• L’amplada s’utilitza per delimitar el nombre de caracters mınim que es reservara per a laimpressio del camp corresponent. En el cas dels nombres en punt flotant, es pot especifiar elnombre de nombres decimals que es desitja imprimir amb precisio.

Tots aquests camps son opcionals

Exemple: fabriquem la taula ASCII. El programa fesascii

Exemple 17.// Programa fesascii.c#include <stdio.h>void main (){char codi;for(codi=33 ; codi < 127 ; codi++) printf("%3d <--> %c\n", codi, codi);

}

Notem que cada enter entre 33 i 126 (els caracter visibles) l’imprimim de dues maneres diferents:com a enter %d (codi numeric) i com a caracter %c (que tradueix el codi numeric a caracter).

Entrada La instruccio base es:

scanf(<format de lectura entre cometes>, llista de variables a llegir amb & );

La funcio scanf( ) llegeix els caracters teclejats per convertir-los en nombres del tipus especificatpel format. Els nombres que s’obtinguin d’aquesta operacio es situaran a l’adreca indicada al seuargument, es a dir, a &variable. Aquesta lectura de caracters del teclat s’atura quan el caracterllegit ja no es correspon amb un possible caracter del format especificat. La resta de caracters quedenal bufer del teclat en espera d’alguna altra lectura.

12

Page 13: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

Exemple 18.scanf( "%d %f %c", &enter, &real, &caracter);3 2.4 ascanf( "%d; %f, %c: %lf", &enter, &real, &caracter, &doble);3; 2.4, a: 0.37

Funcions especıfiques d’entrada/sortida de caracters

• putchar( character ): Mostra character per pantalla.

Exemple:putchar( ’\n’ );

• puts( string ): Mostra una cadena de caracters string per pantalla.

Exemple: puts( "Hola a tothom!" );

• getchar( ): Retorna un caracter llegit del teclat.

Exemple: Opcio = getchar( );

13

Page 14: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

4 Sessio 4

4.1 Funcions

Utilitat

• Eficiencia. Si cal fer el mateix procediment a diferents llocs diferents del programa, el codi-fiquem una unica vegada en una funcio i l’utilitzem als llocs que calgui cridant la funcio.

• Estructura-Modularitat. La creacio de funcions permet dividir la comprensio fa mes facil larealitzacio del programa i el seu depurat d’errors.

• Seguretat. Cada funcio es pot provar i consolidar per separat. En cas d’error podem descartarles funcions consolidades.

Estructura de les funcions

tipus nomfuncio ( llista-parametres ){// Declaracions de variables locals// Instruccions de la funcio

return (expressio);

} /* Fi de la funcio */

Els tipus de la funcio es el tipus de dade que torni amb el return. Si no torna cap valor amb elreturn, la funcio es tipus void

Exemple 19. La funcio que calcula1

1 + x2:

double f( double x ){return 1.0/(1.0 + x*x);

} /* f */

Exemple d’us: El programa grafica.c

Exemple 20.// Programa grafica.c#include <stdio.h>/* Prototipus de la funcio f.

Com als fitxers de capcalera.

Serveix perqu el compilador puguicomprovar que utilitzem be la funcio */

double f( double );void main (){double x;for(x=0.0; x<= 10.0 ; x+= 0.01) printf("%f %f\n",x,f(x));

}double f( double x ){return 1.0/(1.0 + x*x);

} /* f */

Comandes a executar:. $./grafica > funcio.dat

14

Page 15: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

4.2 Variables locals i globals

Les variables del C: variables locals i globals En el programa anterior, el fet que la variablees digui x al programa principal i a la funcio no es important. En llenguatge C els parametres de lesfuncions es passen per valor. Aixo vol dir que, quan es crida la funcio, el valor de la variable x delprograma principal es copia al contingut de la variable x de la funcio. En particular

1. La variable x del programa principal es diferent de la variable x de la funcio.

2. Si modifiquem la variable x a dins de la funcio, la variable x al programa principal no s’altera.

Les variables en llenguatge C son locals del modul on viuen!!

Exemple: El programa grafica2.c

Exemple 21.// Programa grafica2.c#include <stdio.h>double f( double );double uno=1.0; // Aquesta variable es global a tot el programavoid main (){double x = 2.0;printf("Uno: %lf\n", uno); // Correcte: variable conegudaprintf("Dos: %lf\n", dos); /* Error de compilat.

La variable dos solament es coneix mes avall*/

printf("Aux: %lf\n", aux); /* Error de compilat.La variable aux solament es coneix dins del bloc seguent*/

printf("z: %lf\n", z); /* Error de compilat.La variable z solament es coneix dins de la funcio*/

{ double aux=2*x;printf("Aux: %lf\n", aux); // Correcte: variable conegudaprintf("x abans = %f; Funcio = %f; x despres = %f\n",x,f(x),x);

}printf("Aux: %lf\n", aux); /* Error de compilat. La variable aux solament es

coneix dins del bloc anterior */}double dos=2.0; // Aquesta variable solament es coneguda a partir d’aqui

double f( double z ){z = dos/(uno + z*z); // Correcte aquı coneixem uno i dos. Redefinim la z.return z;

} /* f */

4.3 Els operadors de direccio i indireccio

Els operadors * i & El valor de cada variable esta emmagatzemat en un lloc determinat de lamemoria, caracterizat per una direccio.

Un apuntador es una variable (tipus apuntador a tipus int, float, char...) que conte ladireccio d’una altra variable (del mateix tipus).

L’operador direccio & retorna la direccio de la variable a la qual s’aplica.L’operador indireccio * te duas aplicacions:

• retorna la informacio continguda a la direccio que conte el apuntador.

• defineix un apuntador.

15

Page 16: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

Exemple 22.int i,*p; // p es un apuntador a variable intp=&i; // p conte la direccio d’i

*p=10; // la informacio de la direccio de *p// ara conte el valor 10

printf("El valor emmagatzemat a la variable i = %d\n",i);printf("El valor emmagatzemat al apuntador p = %d\n",p);printf("El valor contingut a la direccio de p = %d\n",*p);

Funcions que tornen mes d’un valor. Recordem que una funcio nomes retorna un valor ambreturn.

Si volem que una funcio torni mes d’un valor una possibilitat es fer-ho utilitzant els apuntadors.

• Definim al programa principal variables r1,r2,... que contindran els valors de retorn.

• Copiem a la funcio la direccio les varibles r1,r2... anteriors dins dels apuntadors.

• Tornem els valors escrivint els valors desitjats en les posicions d’r1,r2,...

Exemple: el programa calculs.c Estudiem i “juguem” amb el programa seguent. Donats dosnombres x i y volem calcular x + y, x− y, x · y i x/y.

Exemple 23.// Programa calculs.c#include <stdio.h>// Prototipusvoid calculs( double, double, double *, double *, double *, double *);void main (){double x,y;double suma, resta, p, q;printf("Entra x i y separats per una coma: "); scanf("%lf,%lf", &x,&y);calculs(x, y, &suma, &resta, &p, &q);printf("La suma es: %f\n", suma);printf("La resta es: %f\n", resta);printf("El producte es: %f\n", p);printf("El quocient es: %f\n", q);

}void calculs( double x, double y, double *s, double *r, double *p, double *q){

*s = x+y;*r = x-y;*p = x*y; // No confongueu els dos *. Son diferents!!*q = x/y; // Error. Pot donar problemes.

} /* Fi de calculs */

Comandes a executar:. $ ./calculs

4.4 Parametres del main

Parametres del main Estudiem i “juguem” amb el programa seguent:

Exemple 24.// Programa parametres.c#include <stdio.h>

16

Page 17: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

int main (int argc, char *argv[]){int n;printf(

"---Informe del Programa Parametres---\n\Numero de parametres: %d\n",argc);

if(argc == 1){printf("Error: No hi ha parametres\n\n");return 1;

}for(n=0; n<argc; n++){

printf("Parametre %d: %s\n",n,argv[n]);}putchar(’\n’);return 0;

}

Comandes a executar:. $./parametres, $./parametres 1 -2 -3 4 55

17

Page 18: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

5 Sessio 5

5.1 Vectors i matrius

Vectors i Matrius Son tires de variables que permeten emmagatzemar conjunts de dades ennombre variable.

Exemple: Els coeficients d’un polinomi, els resultats d’un experiment per fer-ne una estadıstica,...

Nota. Les cadenes de caracters son vectors de tipus char amb el codi ASCII 0 al final com a marcade final de cadena (notem que no hi ha cap caracter que tingui el codi ASCII 0 — En particular elcaracter 0 te el codi ASCII 48).

Nota. Les matrius m× n es representen com a vectors de llargada m · n escrits per files.

Inicicialitzacio-declaracio

Exemple 25.double vector[5] = { 1.0, 1.1, 1.2, 1.3, 1.4 };int matriu[3][3] = { 00, 01, 02, 10, 11, 12, 20, 21, 22 };int matriu[3][3] = { /* o be, mes recomanable ... */

{ 00, 01, 02 },{ 10, 11, 12 },{ 20, 21, 22 },

};

char cadena[21] = { ’H’, ’o’, ’l’, ’a’, 0 };char cadena[21] = "Hola"; /* o be, mes comodament ... */char missatge[] = "Hola a tothom";int vector[30] = { 20, 21, 22, 23, 24, 25, 26 };

/* Inicialitzacio incompleta (permesa) */

Nota. En llenguatge C els vectors i matrius sempre comencen per l’ındex 0. Per tant,les componentsde vector[5] son vector[0], vector[1], vector[2], vector[3] i vector[4].

Nota. Les cadenes inicialitzades amb un text entre cometes ja porten implıcit el caracter ’\O’d’acabament i no cal incloure’l a la cadena de caracters del text constant.

Us de vectors i matrius Per fer referencia a un element d’un vector o matriu, nomes cal indicarel nom i la posicio de l’element en particular al qual volem accedir:

vector[i]matriu[i_0][i_1]...[i_n]

i i les ik han de ser variables, constants o expressions el resultat de les quals siguin enters. Perexemple, llegir els elements de la matriu de 3×3 enters declarada anteriorment, es faria de la maneraseguent:

for( i = 0; i<3; i = i + 1 ) {for( j = 0; j<3; j = j + 1 ) {printf( "matriu[%d][%d] = ? ", i, j );scanf( "%d", &(matriu[i][j]) );

} /* for */} /* for */

Avıs!!! El llenguatge C no comprova que al referenciar un element d’un vector o matriu no enspassem del rang de dimensionament. Per exemple, la instruccio

vector[27] = 1.e-8

18

Page 19: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

es perfectament valida independentment de la dimensio de vector. El que fa es que copia laconstant 1.e-8 27 posicions de memoria mes endavant del principi del vector (que, de fet, es elprincipi de vector[0] = &(vector[0])). El fet de posar un nombre en una posicio de memoriaincontrolada, com a mınim, pot comprometre l’execucio del nostre programa i, probablement, elfuncionament del sistema operatiu.

Exemple: Entrar i escriure vectors i matrius. El programa matrius.c

Exemple 26.#include <stdio.h>#define DIMENSIO 2int main(){

int a[DIMENSIO][DIMENSIO];int i,j;puts("Entrem la matriu");for (i=0; i < DIMENSIO ; i++){

for (j=0; j < DIMENSIO ; j++){printf("a(%d,%d)=?",i+1,j+1);scanf("%d",&(a[i][j]));

}}puts("Ara imprimim la matriu:");for (i=0; i < DIMENSIO ; i++){

for (j=0; j < DIMENSIO ; j++){printf("%d ",a[i][j]);

}printf("\n");

}return 0;

}

Mes elegant: la impressio la fa una funcio. El programa vectorsf.c

Exemple 27.#include <stdio.h>#define DIMENSIO 2void imprimeixvector (float *, int);int main(){

float v[DIMENSIO];int i;puts("Entrem el vector");for (i=0; i < DIMENSIO ; i++){

printf("v(%d)=?",i+1);scanf("%f",&(v[i]));

}puts("Ara l’imprimim:");imprimeixvector (v, DIMENSIO);return 0;

}void imprimeixvector (float *vect, int dim){

int i;

19

Page 20: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

for(i=0; i < dim ; i++) printf("%f ",vect[i]);printf("\n");return;

}

Les matrius son especials perque son quadrades.

Exemple 28. El programa matriusf.c#include <stdio.h>#define DIMENSIO 20void imprimeixmatriu (float [][DIMENSIO], int);int main(){float a[DIMENSIO][DIMENSIO];int i,j, dim;printf("Entra la dimensio <= %d\n",DIMENSIO);scanf("%d", &dim);if(dim > DIMENSIO) {

puts("Error: dimensio massa gran");return 1;

}puts("Entrem la matriu");for (i=0; i < dim ; i++){

for (j=0; j < dim ; j++){printf("a(%d,%d)=?",i+1,j+1);scanf("%d",&(a[i][j]));

}}puts("Ara imprimim la matriu com a matriu:");imprimeixmatriu (a, dim);return 0;

} /* Fi del main */La funcio imprimeix matriu

void imprimeixmatriu (float mat[][DIMENSIO], int dim){int i, j;

for (i=0; i < dim ; i++){for (j=0; j < dim ; j++){

printf("%f ",mat[i][j]);}printf("\n");

}return;

}

Mes difıcil encara: les matrius, de fet, son vectors i es guarden per fileres. El programamatriust.c

Exemple 29.#include <stdio.h>#define DIMENSIO 2void imprimeixvector (float *, int);int main()

20

Page 21: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

{float a[DIMENSIO][DIMENSIO];int i,j;puts("Entrem la matriu");for (i=0; i < DIMENSIO ; i++){

for (j=0; j < DIMENSIO ; j++){printf("a(%d,%d)=?",i+1,j+1);scanf("%f",&(a[i][j]));

}}La “trampa”

puts("Ara imprimim la matriu com a vector");imprimeixvector ((float *) a, DIMENSIO*DIMENSIO);return 0;

}void imprimeixvector (float *vect, int dim){

int i;for(i=0; i < dim ; i++) printf("%f ",vect[i]);printf("\n");return;

}

5.2 Cadenes de caracters

Un tipus especial de vectors: les cadenes de caracters En C no es poden fer assignacions,comparacions ni cap altra operacio directa amb cadenes completes ja que son vectors. Solament espoden fer caracter a caracter. D’aquesta manera, una assignacio d’una cadena a una altra s’hauriade fer de la forma seguent:

Exemple 30.char cadena[MAXLEN]="Cadena font";char altra[MAXLEN];int i;.......for(i=0; i<MAXLEN; i = i + 1) { /* copia de cadenes */

altra[i]=cadena[i];} /* for */

Funcions estandard per a cadenes de caracters Com que l’us de cadenes de caracters espracticament obligat en qualsevol programa, afortunadament, per estalviar feina, existeix una bib-lioteca de funcions estandard per fer les operacions mes habituals sobre cadenes. Els seus prototipuses carregen usant el fitxer de capalera:

#include <string.h>

Un llistat breu d’aquestes funcions es:

int strlen ( char *string );char *strcpy ( char *destination, char *source );char *strncpy ( char *destination, char *source, int num-de-chars );char *strcat ( char *destination, char *source );char *strncat ( char *destination, char *source, int num-de-chars );char *strdup ( char *source );

21

Page 22: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

int *strcmp ( char *string_1, char *string_2 );int *strncmp ( char *string_1, char *string_2, int num-de-chars );char *strchr ( char *string, char character );char *strrchr ( char *string, char character );

Comentaris

• La longitud real d’una cadena de caracters kdna en un moment determinat es pot obtenir atraves de la funcio strlen( kdna ).

• En cas que es vulgui copiar el contingut de la cadena de caracters kdna a kdna9, es pot usar lafuncio strcpy( kdna9, kdna ) o, si la cadena font pot ser mes llarga que la capacitat de lacadena destinacio, strncpy( kdna9, kdna, LONGKDNA9-1 ). En aques ultim cas, cal preveurela possibilitat que la cadena resultant no porti un 0 final. Per aixo, cal reservar l’ultim caracterde la copia amb compteig per situar-hi un 0 de guarda. Si la nova cadena no tingues espaireservat, caldria fer el.

• La comparacio de cadenes es fa caracter a caracter, comencant pel primer caracter de lesdues cadenes a comparar i passant als caracters seguents mentre la diferencia dels codis ASCIIcorresponents sigui 0. La funcio strcmp( ) retorna el valor de l’ultima diferencia. Es a dir,negatiu si la segona cadena es alfabeticament mes gran que la primera, positiu en el cas oposat,i 0 si son iguals.

Per entendre-ho millor, tot seguit apareix el possible codi d’una funcio de comparacio decadenes:

Exemple 31. int strcmp( char *cad1, char *cad2 ){int dif = 0;while((*cad1 != ’\0’) &&(*cad2 != 0) &&( ( dif = *cad1 - *cad2 ) != 0 )) {

cad1 = cad1 +1;cad2 = cad2 +1;

} /* while */return dif;

} /* strcmp */

• La funcio strncmp( ) fa el mateix que la seva germana strcmp( ) amb els primersnum-de-caracters.

• Finalment —tot i que n’hi ha mes—, comentarem les funcions de cerca de caracters dinsde cadenes: strchr( ) i strrchr( ). Aquestes funcions retornen la cadena de caractersque comenca al caracter buscat dins la cadena o NULL si no el troben. La primera funcioinspecciona la cadena des del primer caracter i la segona ho fa comencant pel final. Aixı, lafuncio strchr( ) seria, aproximadament, com la seguent:

Exemple 32. int strchr( char *cadena, char caracter ){

while( (*cadena != ’0’) && (*cadena != caracter) ) { cadena = cadena +1; }return cadena;

} /* strchr */

22

Page 23: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

Entrada sortida a cadenes de caracters Tot i que moltes operacions sobre cadenes de caracterses poden fer amb les funcions anteriors, pot resultar molt util treballar amb una cadena com si fosuna sortida o una entrada estandard de dades. Per aixo, existeixen les versions per a cadenes de lesfuncions printf( ) i scanf( ):

sprintf( cadena, format [, llista_variables ] );sscanf ( cadena, format [, llista_&variables ] );

En tots dos casos, cadena es refereix a la cadena de caracters sobre la qual es fara l’operacio,format es la cadena que conte el format en que s’ha d’escriure o llegir la cadena, i els claudatorsindiquen l’opcionalitat de la llista de variables subseguent.

23

Page 24: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

6 Sessio 6

6.1 Preprocesador i macros

Preprocessador Ja hem vist que el preprocessador permet d’incloure els fitxers de capcalera deles funcions i definir constants simboliques.

#include <fitxer-de-capcalera.h>#include "fitxer-de-capcalera-propi.h"#define sımbol expressio_constant

Exemple 33. Ja vistos:

#include <stdio.h>#define DIMENSIO 2#define PI 3.141592653589793238462643383279502884197#define TOL 1.0e-6

Macros A mes, el preprocessador permet algunes substitucions amb parametres (les “macros”),en contraposicio a les substitucions literals de les definicions constants vistes fins ara:

#define nom_de_macro( arguments ) expressio_constant_amb_arguments

L’us de les macros ajuda a aclarir petites parts de codi emprant una “especie de funcio” ambalgun nom significatiu de manera que la lectura en sigui mes facil i no impliqui una crida real a unafuncio amb un cos de codi que no la justifiqui com a tal. En aquesta funcio es molt util la construccio(if aritmetic):

(condicio) ? valor-si-veritat : valor-si-falsxx = (x < 0 ? -x : x) ; // xx es el valor absolut d’x

Exemple 34.#define abs(x) (x < 0 ? -x : x)#define round(x) ((int) ((double) x + 0.5 ))#define trunc(x) ((int) (x))#define MAX(x,y) ((x<y) ? y : x)#define PI 3.141592653589793238462643383279502884197#define quadrat(x) x*x#define area_cercle(r) PI*quadrat(r)

Cal tenir en compte que el nom de la macro i el parentesi esquerre no poden anar separats i que lacontinuacio d’una lınea es fa col.locant una barra inversa just abans del caracter de salt de lıınia (encas que la comanda de preprocessador sigui massa llarga).

6.2 Entrada/sortida: Fitxers

Mes entrada/sortida: Fitxers La connexio del nostre programa amb fitxers es fa usant apun-tadors a fitxers:

FILE *apuntador_a_fitxer

La variable de tipus apuntador a fitxer que s’inicialitza a l’obrir el fitxer. Es el nom del nostre canalde comunicacio (dins del programa) amb el fitxer. Aquest tipus de dades es defineix al fitxer decapcalera stdio.h.

Esquema base per a llegir/escriure un fitxer:

24

Page 25: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

#include <stdio.h>...

FILE *apuntador_a_fitxer;...

apuntadoro_a_fitxer= fopen(......); // Inicialitzacioif(apuntador_a_fitxer== NULL){ // SEMPRE cal comprovar que s’ha pogut obrir el fitxerputs(... treure un missatge d’error ...);return 1;

}...

while(1) { // Recorregut sequencial del fitxerfscanf(apuntador_a_fitxer, ... ); // Lectura de cada lıniaif(feof(apuntador_a_fitxer)) break;...

} /* Fi del while */...

fclose( apuntador_a_fitxer ); // Tanquem el fitxer

Obrir i tancar: les funcions fopen i fclose La funcio base es la fopen: crea un canal decomunicacio entre el fitxer i el programa amb la finalitat especificada pel mode d’obertura.

FILE * fopen( const char *nom-del-fitxer, const char *mode-d-obertura );

mode-d-obertura = "r" (read) "t" (text - es el defecte)"w" (write) "b" (binary)"a" (append)

Si, s’aconsegueix crear el canal (el fitxer existeix i tenim permisos de lectura o be tenim permisosper crear el fitxer i hi ha prou espai de disc) es “connecta” a la nostre apuntador a fitxer; que esdeveel nom logic del canal de connexio amb el fitxer. Si el proces falla la nansa conte un NULL.

Es important tacar el fitxer quan acabem.

int fclose( FILE *apuntador_a_fitxer );

Hi ha tres apuntadors a fitxers que estan definides sempre:

variable significat dispositiustdin entrada estandard teclatstdout sortida de dades estandard pantallastderr sortida d’errors estandard pantalla

Nota. Aixı

printf(format [, llista_var]) = fprintf(stdout, format [, llista_var])scanf (format [, llista_&var]) = fscanf (stdin, format [, llista_&var])

Funcions d’entrada/sortida a fitxers

25

Page 26: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

FILE * fopen( const char *nom-de-fitxer, const char *mode-d-obertura );int fclose( FILE *stream );void rewind( FILE *stream );int feof( FILE *stream );int fgetc( FILE *stream );

char * fgets( char *string, int maxchar, FILE *stream );int fscanf( FILE *stream, const char *format_string, ... );int fputc( int character, FILE *stream );int fputs( const char *string, FILE *stream );int fprintf( FILE *stream, const char *format_string, ... );long ftell( FILE *stream );int fseek( FILE *stream, long int offset, int direction );

direction = SEEK_SET forward from beginning of fileSEEK_CUR forward from current position

SEEK_END backward from end of file

Un SuperExemple El programa te 2 parametres

• nom d’un fitxer de dades (fin)

• nombre de columnes (ncols) del fitxer fin

L’inici del programa

#include <stdio.h>#include <string.h>#include <stdlib.h> /* Per la funcio atoi */

#define MAXLENNOM 251int main (int argc, char *argv[]){

FILE *fin, *fout;int x, xx=0,col,n,ncols;char nomsortida[MAXLENNOM];if (argc != 3 || (ncols = atoi (argv[2])) <=0) {

fprintf(stderr, "\nUs: %s <nomfitxer> <nombre-de-columnnes>\n\n", argv[0]);return 1;

}if(strlen(argv[1])+4 >= MAXLENNOM) {

fprintf(stderr, "\nERROR: El nom del fitxer %s es massa llarg...\n\n", argv[1]);return 1;

}if ((fin = fopen (argv[1], "r")) == NULL) {

fprintf(stderr,"\nERROR: El fitxer ’%s’ no existeix o no es pot obrir...\n\n", argv[1]);return 1;

}strcpy(nomsortida,argv[1]); strcat(nomsortida,".trp");printf("Comprovacio: %s\n", nomsortida );if ((fout = fopen (nomsortida, "w")) == NULL) {

fprintf (stderr,"\nERROR: No es pot obrir el fitxer de sortida ’%s’...\n\n", nomsortida);return 1;

}// fout = stdout; // Trampa!! aixo fa que la sortida sigui per pantalla

El nucli del programa

for(col=0;col<ncols; col++) /* Anem a escriure la columna col.{ Cal que llegim ncols vegades tot el fitxer */

while (1){

26

Page 27: Programaci o en C - UAB Barcelonamat.uab.es/~infobiotec/materials/CInfobiotec.pdfProgramaci o en C Informatica biotecnologia: Curs 07/08 Aquestes s on les transpar encies de classe

for(n=0;n<ncols;n++) // Cal llegir els ncols nombres de cada lınia{

fscanf (fin, "%d", &x); if(n == col) xx= x;} /* Fi del for n */if(feof(fin)) break ;fprintf(fout, "%d ", xx);

} /* Fi del while */fprintf(fout,"\n");rewind(fin);

} /* Fi del for col */fclose (fin);fclose(fout);return 0;}

27