Arantza Diaz de Ilarraza
Kepa Sarasola
OINARRIZKO
PROGRAMAZIOA
ARIKETA BILDUMA
Udako Euskal Unibertsitatea
Bilbo, 1999
© Arantza Diaz de Ilarraza, Kepa Sarasola
© Udako Euskal Unibertsitatea
ISBN: 84-8438-002-5
Lege-gordailua: SS-1052-99
Inprimategia: ANTZA, Lasarte Oria
Azaleko diseinua: Iñigo Ordozgoiti
Banatzaileak: UEU. Concha Jenerala 25, 4. BILBO telf. 94-4217145
e-mail: bulegoa@ueu.org www.ueu.org
Zabaltzen: Igerabide, 88 DONOSTIA
Aurkibidea
SARRERA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
A ZATIA: ARIKETA-BILDUMARAKO SARRERA . . . . . . . . . . . . . . . . 13
I. KONPUTAGAILUEN PROGRAMAZIOA: ALGORITMOAK . . . . . . . . . 15
I.1. Informatika eta programazioa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
I.2. Algoritmoak eta programak. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
I.2.1. Zehaztapena.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
I.2.2. Algoritmoa.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
I.2.3. Programa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
I.2.4. Proba. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
I.2.5. Estiloa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
II. EREDU ALGORITMIKOA. ALGORITMOEN OSAGAIAK. . . . . . . . . . 19
II.1. Objektuak: Aldagaiak, konstanteak eta literalak . . . . . . . . . . . . . . 19
II.1.1. Datu-mota sinpleak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
II.1.1.1. Osokoak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
II.1.1.2. Errealak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
II.1.1.3. Boolearrak. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
II.1.1.4. Karaktereak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
II.1.1.5. Kateak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
II.1.2. Datu-mota egituratuak. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
II.1.2.1. Bektoreak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
II.1.2.2. Matrizeak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
II.1.2.3. Erregistroak. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
II.1.2.4. Datu-egitura mistoak. . . . . . . . . . . . . . . . . . . . . . . 29
II.2. Adierazpenak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
II.3. Aginduak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
II.3.1. Asignazioa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
II.3.2. Datuak irakurri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
II.3.3. Datuak idatzi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
II.4. Kontrol-egiturak. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
II.4.1. Agindu-sekuentzia. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
II.4.2. Baldintzazko egiturak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
II.4.3. Iterazio-egiturak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
II.4.3.1. Iterazio arrunta . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
II.4.3.2. Aldi-kopuru jakineko iterazioa . . . . . . . . . . . . . . . 34
II.5. Moduluak: funtzioak eta prozedurak . . . . . . . . . . . . . . . . . . . . . . . 36
II.5.1. Funtzioak. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
II.5.2. Prozedurak. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
II.5.3. Moduluen parametroak . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
II.5.3.1. Sarrera-parametroak . . . . . . . . . . . . . . . . . . . . . . . 40
II.5.3.2. Irteera-parametroak. . . . . . . . . . . . . . . . . . . . . . . . 41
II.5.3.3. Sarrera-irteera parametroak. . . . . . . . . . . . . . . . . . 41
II.6. Algoritmoen idazkera. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
II.6.1. Formatu orokorra. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
II.6.2. Programazio-estiloa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
III. ALGORITMOEN OSAGAIAK ADA PROGRAMAZIO-LENGOAIAN. 45
III.1. Programetako hitzak eta iruzkinak . . . . . . . . . . . . . . . . . . . . . . . . 45
III.1.1. Literalak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
III.1.2. Identifikadoreak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
III.1.3. Hitz erreserbatuak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
III.1.4. Banatzaileak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
III.1.5. Iruzkinak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
III.2. Objektuak Ada lengoaian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
III.2.1. Oinarrizko DATU-MOTAK Ada lengoaian. . . . . . . . . . . 47
III.2.2. Objektu konstanteak eta aldagaiak. . . . . . . . . . . . . . . . . . 47
III.3. Oinarrizko aginduak Ada lengoaian . . . . . . . . . . . . . . . . . . . . . . . 47
III.3.1. Datu-irakurketa (teklatutik) . . . . . . . . . . . . . . . . . . . . . . . 47
III.3.2. Datu-idazketa (pantailan). . . . . . . . . . . . . . . . . . . . . . . . . 48
III.3.3. Esleipenak (asignazioak) . . . . . . . . . . . . . . . . . . . . . . . . . 49
III.4. Kontrol-egiturak Adan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
III.4.1. Baldintzazko egitura. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
III.4.2. Iterazioa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
III.4.2.1. Iterazio arrunta . . . . . . . . . . . . . . . . . . . . . . . . . 50
III.4.2.2. Aldi kopuru jakineko iterazioa . . . . . . . . . . . . . 50
III.5. Moduluak edo azpiprogramak Ada lengoaian (sinplifikatua). . . . 50
B ZATIA: ARIKETA-BILDUMA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
IV. ALGORITMOEN OINARRIZKO OSAGAIAK. . . . . . . . . . . . . . . . . . . . 55
Enuntziatuak. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Ebazpenak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4 Oinarrizko programazioa. Ariketa bilduma
IV.1. Adierazpenak ebaluatzeko ordena. . . . . . . . . . . . . . . . . . . . . . . . . 57
IV.2. Balio absolutua . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
IV.3. Ordenatu bi zenbaki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
IV.4. Orduak beste formatoan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
IV.5. Bolumenaren kalkulua. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
IV.6. Zatitzaileen kalkulua . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
V. ALGORITMOEN ZEHAZTAPENAK I.. . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Enuntziatuak. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Ebazpenak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
V.1. Bi aldagaien arteko balio trukaketa . . . . . . . . . . . . . . . . . . . . 62
V.2. Hiru zenbaki ordenatu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
V.3. Txanponak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
V.4. Triangelua. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
VI. SEKUENTZIEN TRATAMENDUA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Enuntziatuak. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Ebazpenak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
VI.1. 'A' karakterearen kontaketa sekuentzian. . . . . . . . . . . . . . . . 70
VI.2. Bokalen agerpena sekuentzian . . . . . . . . . . . . . . . . . . . . . . . 71
VI.3. Bokal ez direnen agerpen kopurua. . . . . . . . . . . . . . . . . . . . 71
VI.4. Bokalen, ez-bokalen eta karaktereen kontaketa . . . . . . . . . . 72
VI.5. Sekuentziako osagaien batezbestekoaren kalkulua. . . . . . . . 73
VI.6. Sekuentziako osagai positiboen batezbestekoaren kalkulua 73
VI.7. Elementu baten bilaketa sekuentzia ez ordenatuan . . . . . . . 74
VI.8. Elementu baten bilaketa sekuentzia ordenatuan. . . . . . . . . . 76
VI.9. Elementu maximoaren bilaketa sekuentzian . . . . . . . . . . . . 77
VI.10. Elementu maximoaren posizioa sekuentzian . . . . . . . . . . . 77
VI.11. Elementu minimoaren bilaketa sekuentzian . . . . . . . . . . . . 78
VI.12. Elementu minimoaren posizioa sekuentzian . . . . . . . . . . . 79
VI.13. "TA" karaktere-bikotearen kontaketa sekuentzian . . . . . . . 79
VI.14. Lehena ote den aztertu . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
VI.15. M baino txikiagoak diren zenbaki lehenak kalkulatu. . . . . 82
VI.16. Erro karratuaren kalkulua Newtonen metodoaren arabera. 83
VI.17. Exekutatu algoritmoa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
VI.18. Exekutatu algoritmoa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
VII. AZPIPROGRAMEN DEFINIZIOA ETA ERABILERA I. . . . . . . . . . . . 85
Enuntziatuak. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Ebazpenak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
VII.1. Zenbaki perfektua . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Aurkibidea 5
VII.2. Sekuentziako zenbaki perfektuak . . . . . . . . . . . . . . . . . . . . 87
VII.3. Sekuentziako zenbaki bikoitiak. . . . . . . . . . . . . . . . . . . . . . 89
VII.4. Sekuentziako posizio bakoitiko osagaiak idatzi.. . . . . . . . . 90
VII.5. Zenbaki positibo baten atzekoz aurreko zenbakia. . . . . . . . 90
VII.6. Kapikua ote da. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
VII.7. Sekuentziako kapikuen kopurua . . . . . . . . . . . . . . . . . . . . . 92
VII.8. Sekuentziako monotonia gorakorren kopurua. . . . . . . . . . . 92
VII.9. Sekuentziako hitz-kopurua kontatu. . . . . . . . . . . . . . . . . . . 93
VII.10. Sekuentziako karaktere guztiak atzekoz aurrera . . . . . . . . 94
VII.11. Zenbat aldiz sekuentziako lehenengo hitza? . . . . . . . . . . . 94
VIII. AZPIPROGRAMEN ZEHAZTAPENAK II. . . . . . . . . . . . . . . . . . . . . . 95
Enuntziatuak. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Ebazpenak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
VIII.1. N zenbakia [N1,N2] tartean al dago?. . . . . . . . . . . . . . . . . 97
VIII.2. Urte bisustukoa ote da? . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
VIII.3. Zenbaki bitarra hamartar bihurtu . . . . . . . . . . . . . . . . . . . . 98
VIII.4. Hiru zenbakiren arteko maximoa. . . . . . . . . . . . . . . . . . . . 98
VIII.5. Hiru zenbaki ordenatu . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
VIII.6. Eman hurrengo segundoa. . . . . . . . . . . . . . . . . . . . . . . . . . 99
VIII.7. N baino txikiagoa edo berdina den handiena bilatu. . . . . . 99
VIII.8. Esaldiko hitz guztiak letra berarekin hasten dira? . . . . . . . 100
VIII.9. Bi sekuentzia kateatu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
VIII.10. Positiboak eta negatiboak bereizi. . . . . . . . . . . . . . . . . . . 101
VIII.11. Bi sekuentzia ordenatutako osagaiak sekuentzia
batean bildu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
IX. AZPIPROGRAMEN DEFINIZIOA ETA ERABILERA II. . . . . . . . . . . . 103
Enuntziatuak. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Ebazpenak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
IX.1. Bolumena kalkulatu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
IX.2. Zatitzaileak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
IX.3. A eta B aldagaien arteko balio-trukaketa . . . . . . . . . . . . . . . 106
IX.4. Hiru zenbaki ordenatu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
IX.5. Triangelua. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
IX.6. 'A' karakterea zenbat aldiz? . . . . . . . . . . . . . . . . . . . . . . . . . 108
IX.7. K1 karakterea zenbat aldiz? . . . . . . . . . . . . . . . . . . . . . . . . . 108
IX.8. Bilatu zenbaki bat. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
IX.9. K1-K2 karaktere-bikotea zenbat aldiz segidan?. . . . . . . . . . 110
6 Oinarrizko programazioa. Ariketa bilduma
X. BEKTOREA DATU-EGITURA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Enuntziatuak. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Ebazpenak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
X.1. Bektoreko batezbesteko aritmetikoa . . . . . . . . . . . . . . . . . . . 114
X.2. Bektorea idatzi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
X.3. Bektoreko elementu maximoa eta bere posizioa . . . . . . . . . . 115
X.4. 'A' karakterea zenbat aldiz karaktere-bektorean . . . . . . . . . . 115
X.5. Zenbat bokal karaktere-bektorean . . . . . . . . . . . . . . . . . . . . . 116
X.6. Zenbat ez-bokal karaktere-bektorean. . . . . . . . . . . . . . . . . . . 116
X.7. Zenbat aldiz errepikatzen den "TA" karaktere-bikotea . . . . . 117
X.8. Zenbat zenbaki lehen osoko-bektorean . . . . . . . . . . . . . . . . . 118
X.9. Zenbakia bilatu osoko-bektore ez-ordenatuan. . . . . . . . . . . . 118
X.10. Zenbakia bilatu osoko-bektore ordenatuan . . . . . . . . . . . . . 119
X.11. Posizio bat eskuinera mugitu . . . . . . . . . . . . . . . . . . . . . . . . 120
X.12. Sekuentzia irakurri eta bektorean ordenaturik sartu . . . . . . 121
X.13. Sekuentzia irakurri eta N osagaiko bektorean
ordenaturik sartu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
X.14. Bektoreko ordenazioa, Burbuila deritzon algoritmoari
jarraituz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
X.15. Bektoreko ordenazioa, Txertaketa algoritmoari jarraituz . . 123
X.16. Bektoreko zenbaki perfektuak eman . . . . . . . . . . . . . . . . . . 124
X.17. Sarrerako sekuentziako palindromoak idatzi. . . . . . . . . . . . 124
X.18. Lehenengo hitza zenbat aldiz?. . . . . . . . . . . . . . . . . . . . . . . 127
XI. MATRIZEA DATU-EGITURA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Enuntziatuak. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Ebazpenak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
XI.1. Bi matrizeren batura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
XI.2. Zenbaki baten eta matrize baten arteko biderkadura . . . . . . 130
XI.3. Bi matrizeren biderkadura . . . . . . . . . . . . . . . . . . . . . . . . . . 131
XI.4. Matrizeak idatzi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
XI.5. Matrizea irakurri. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
XII. ARIKETA AURRERATUAK. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Enuntziatuak. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Ebazpenak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
XII.1. Asignazio zuzenak markatu . . . . . . . . . . . . . . . . . . . . . . . . 144
XII.2. N txikienak lortu (1. bertsioa) . . . . . . . . . . . . . . . . . . . . . . . 144
XII.3. N txikienak lortu (2. bertsioa) . . . . . . . . . . . . . . . . . . . . . . . 146
XII.4. Permutazio izan. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
XII.5. Ordenatu bektorea kolorearen arabera . . . . . . . . . . . . . . . . 149
Aurkibidea 7
XII.6. Besteen bestekoa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
XII.7. Eratostenesen bahea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
XII.8. Meseta luzeenaren luzera . . . . . . . . . . . . . . . . . . . . . . . . . . 152
XII.9. Multzoen ebakidura. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
XII.10. Multzoen bildura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
XII.11. Multzo guztien ebakidura . . . . . . . . . . . . . . . . . . . . . . . . . 157
XII.12. Zatikien definizioa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
XII.13. Zatidura-lista datu-mota definitu. . . . . . . . . . . . . . . . . . . . 158
XII.14. Zatidura-lista lortu. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
XII.15. Zatiki ez-negatiboen adierazle kanonikoa. . . . . . . . . . . . . 160
XII.16. Zatiki-listaren adierazle kanonikoen batura eta maiztasun
handieneko kanonikoa. . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
XII.17. Ezkutatu laukia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
XII.18. Karrera bukaerako proiektuen asignazioa I. . . . . . . . . . . . 165
XII.19. Karrera bukaerako proiektuen asignazioa II . . . . . . . . . . . 167
BIBLIOGRAFIA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
8 Oinarrizko programazioa. Ariketa bilduma
Sarrera
Konputagailuen programazioan lehenengo pausoak egin nahi dituenarentzat
sortu dugu liburu hau. Gehienetan unibertsitatean erabiliko da; informatika
fakultateetan ez ezik, informatikaren sarrera egiten duten ikasgai guztietan ere.
Adibidez: informatikan, enpresa ikasketetan, ingeniaritza ikasketetan, ingeniaritza
teknikoetan, zientzi fakultateetan eta abar.
Konputagailuen programazioaren oinarrizko kontzeptuak landu nahi dira
ariketen bidez, azalpen teoriko labur baten ostean: programazio agintzailearen
kontrol-egiturak, oinarrizko datu-egituren diseinua, eta azpiprogramen erazagupe-
na eta erabilpena. Mundu honetara lehenengo aldiz hurbiltzen denarentzat ez da
egokiena zuzenean programazio-lengoaia bat ikastea. Askoz egokiagoa da progra-
mazio-lengoaia agintzaile guztiek konpartitzen dituzten kontzeptuak ezagutzea, eta
abiapuntu horretatik gero programa idaztea lengoaia bat erabiliz. Euskaraz erraz
irakurtzen diren algoritmoak asmatu beharko ditu ikasleak kontzeptu komun
horiek lantzeko, beti ere, programazio-lengoaien sintaxi-arau estuak alboratuz.
Kapitulu bakoitza programazioko kontzeptu bati dagokio, eta zailtasun
txikienetik handienera ordenatuta azaltzen dira liburuan zehar. Algoritmoen
zehaztapenak eta azpiprogramak, funtsezko kontzeptuak direnez, salbuespenak
izan dira; bina kapitulu eskaini dizkiegu bi zailtasun-maila bereiziz. Kapituluz
kapitulu landu ditugun kontzeptuak hauexek izan dira:
1. Algoritmoen oinarrizko osagaiak. Algoritmo sinpleak dira.
Datu motak: osokoa, erreala, boolearra eta karakterea
Ekintzak: esleipena, irakurketa eta idazketa.
Kontrol-egiturak: baldin eta bitartean
2. Algoritmo sinpleen zehaztapena.
Aurrebaldintza eta post-baldintzaren bidez.
3. Sekuentzien tratamendua.
Sekuentzia baten korritze-prozesu desberdinak aztertzen dira; adibidez,
elementu nabarmen baten (edo batzuen) bilaketa, edo sekuentzia baten
elementu guztiekin eragiketa bat egitea proposatzen da. Hasierako
ariketetan sekuentziako elementuak irakurriz lortuko dira; bukaerako
ariketetan, ordea, sortu egin beharko dira tratatu beharreko elementuak.
4. Azpiprogramen definizioa eta erabilera.
Azpiprograma kontzeptua lantzea izan da helburua, problemen ebazpena
errazteko baliagarria dela erakutsiz. Enuntziatu multzo honetan batetik
azpiprogramen erabilera lantzen da, eta bestetik, azpiprogramen definizioa.
5. Azpiprogramen zehaztapena.
6. Azpiprogramen definizioa eta erabilera.
Aurretik egindako algoritmo batzuk birplanteatu egiten dira hemen
azpiprograma bezala egiteko.
7. Bektorea datu-egitura. Zenbait ariketa Ada programazio-lengoaian lantzen
hasten da.
8. Matrizea datu egitura
9. Programa aurreratuak.
Bektore eta erregistro datu-motekin datu-egitura berriak sortuz, sinpleak
ez diren programak planteatzen dira.
Hasierako kapituluetako ebazpenetan notazio algoritmikoa erabili dugu, baina
azkeneko kapituluetan Ada programazio-lengoaiara jo dugu pixkanaka. Bi arrazoi
eman behar ditugu horrela jokatzeko: alde batetik, ikasketa-prozesuaren barruan
programazio-lengoaia bat apurka sartzea metodologikoki egokia iruditzen
zaigulako, eta bestetik, ikasleari, gehiegi luzatu gabe, bere lehenengo programak
inplementatzeko aukera ematen zaiolako.
Ada ez den beste lengoaia bat aukeratzea bazegoen; adibidez: C, Java, Pascal,
Prolog edo Miranda. Hori eztabaidagarria da, jakina. Beste aukerak ere onak ziren,
baina programazio sendo eta metodologikorako tresna egokienak eskaintzen
dituelakoan aukeratu dugu Ada; beti ere eredu agintzailearen barruan.
Adaren tresna ahaltsuenak ez dira agertuko hasi berrientzako liburu honetan.
Berau ezin da hartu Ada ikasteko helburuarekin; Adaren erabilera oso murritza
eginez, lengoaiaren baliabide oinarri-oinarrizkoak baino ez dira erabiltzen gure
ariketetan. Azalpen teorikoak labur-labur eman dira.
Liburu honek orain dela 15 urte argitaratu zen beste liburu baten eguneraketa,
moldaketa eta hobekuntza izan nahi du. Orduko liburuak "Programatzeko
algoritmoak. Ariketa Bilduma" izenburua zuen eta UEUk berak atera zuen.
Hamabost urtetan euskarak eta informatikak izan dituzten aldaketek behartu
gaituzte liburu berri hau argitaratzera.
Etorkizunean Interneteko edo paperezko bertsio berriei begira, erroreak edo
oharrak jasotzea interesatzen zaigu. Liburu honetan errorerik aurkitzen baduzu edo
aholkurik luzatu nahi badiguzu jo ezazu jipsagak@si,ehu,es posta-helbidera.
Eskerrik asko.
Donostia, 1999ko uztailaren 16an
Arantza Díaz de Ilarraza
Kepa Sarasola
10 Oinarrizko programazioa. Ariketa bilduma
Esker emanez
Ariketa gehienak geuk asmatuak izan dira, baina ezin utzi aipatu gabe
inspirazio-iturri izan direnak: batetik UPV-EHUko Informatika Fakultateko
Oinarrizko Programazioa irakasgaiko azterketa-ariketak (hainbat urtetakoak eta
hainbat irakaslerenak), eta bestetik, bide honetan aspaldiko laguna dugun ondoko
liburuaren egileei.
Peyrin, Jean-Pierre eta Scholl, Pierre-Claude
ALGORITHMIQUE ET PROGRAMMATION
Laboratoire IMAG, bp53 x, 38041 GRENOBLE-CEDEX, 1982
Ariketa-bilduma honen zirriborroak sufritu dituzten ikasleek zenbait akats
zuzentzeko iradokizunak helarazi dizkigute.
Lehenengo hiru kapituluetako azalpen teorikoan hainbat adibide eta deskriba-
pen Xabier Artolak idatzitako apunteetatik jaso ditugu, baita Elhuyarren euskaratu-
tako liburu honetatik ere:
Watt, D., Wichmann, B., Findlay, W
"ADA Lengoaia eta Metodologia"
EHUko Argitalpen Zerbitzua Leioa 1996.
Bukatzeko, eskerrak Jose Ramon Etxebarriari testuari egindako
zuzenketengatik, eta Nekane Intxaurtzari formatua egokitzeagatik.
A zatia:
Ariketa bildumarako sarrera
I. Konputagailuen programazioa: algoritmoak
I.1. KONPUTAGAILUEN PROGRAMAZIORAKO ALGORITMOAK
Konputagailua luze, zail eta errepikakorrak diren agindu-sekuentziak
burutzen dituen makina da. Agindu horiek eragiketa logikoak edo kalkulu
matematikoak izaten dira. Agindu-sekuentzia egikarituz erabiltzaileak ematen
dituen datuak (informazioa) hartu, eta lortu nahi diren emaitzak (beste informazio
bat) kalkulatzen dituzte. Berau lortzeko asmatu behar den agindu-sekuentziari
programa deitzen zaio.
Nahiz eta konputagailuak berez ez diren adimendunak, ematen zaizkien
agindu-sekuentziak exekutatzen badakite, eta datuak irakurtzen eta idazten ere bai;
baina ez dakite problema baterako programa asmatzen. Datuekin zer nolako
aginduak egikaritu behar diren zehatz-mehatz eta zuzen definitzen ez badiogu
(programa egokia ematen ez bazaio, hain zuzen), konputagailuak ez du ezer
egingo, edo emaitza okerrak eskainiko ditu programa hori zuzena ez bada.
Programak idazteko, programazio-lengoaiez baliatzen gara. Programatzeko
lengoaia bakoitzak bere arauak ditu, batetik datuak memoria barruan adierazteko
eta bestetik exekutatu ahal diren aginduak definitzeko. Beraz, programa bat
idazteko, programatzeko lengoaia baten arauak bete behar dira.
Goi-mailako lengoaia asko daude gaur egunean, bakoitzari bere erabilpen-
eremu egokiena dagokiolarik. Zenbait lengoaiak adierazpide algebraiko eta
zenbakizkoetarako erraztasuna eskaintzen dute eta, beraz, kalkulu zientifikoeta-
rako erabiltzen dira; beste zenbaitek hitzak eta zenbaki sinpleak erabiltzen dituzte,
baina datu-kopuru handietarako balio dute eta ondorioz, enpresa-arazoetarako
erabiltzen dira.
Liburu honetan problema-bilduma bat aurkezten da, problema bakoitzerako
algoritmo bat eraikiz. Algoritmoak idazteko lengoaia berezia erabiliko dugu; ez da
programazio-lengoaia bat, baina edozein programazio-lengoaia hautatuz gero,
erraza izango da programa idaztea algoritmotik abiatuta. Azken kapituluko
ariketetan Ada programazio-lengoaia ere erabili dugu.
I.2. ALGORITMOAK ETA PROGRAMAK
Problema bat konputagailuaren bidez ebatzi gura denean, ondoko hiru
pausoak bete behar dira: zehaztapena, algoritmoa, programa eta proba. Ikus
ditzagun banan-banan.
I.2.1. Zehaztapena.
Oso ondo definituta egon behar du problemaren enuntziatuak; zalantza-
izpirik gabekoa izan behar du, bestela nahasteak azalduko baitira gero. Sarritan,
problema daukan pertsona ez da programa asmatuko duena, eta horrelakoetan oso
garrantzitsua da zehaztapena, zeren pauso horretan zehatz-mehatz ezartzen baita
programak zer egin beharko duen eta zer egin behar ez duen.
Zehaztapenean, alde batetik, jasoko diren sarrera-datuak, eta beste aldetik,
lortu nahi diren irteera-datuak zehaztu behar dira; hau da, sarrera-datuek eta
irteera-datuek bete beharko dituzten propietateak zein diren.
Pauso hau funtsezkoa da. Zalantza guztiak argitu behar dira, zeren bestela,
problema duenak eta programa asmatuko duenak gauza bera ulertzen ez badute,
sortuko den programak ez baitu ezertarako balio izango. Programa ondo eginda
egongo da, agian, baina pertsona eta egun askoren fruitua izan arren, programak ez
dio problema ebatziko erabiltzaileari. Beste problema bat ebazteko balioko du,
programa asmatu duenak ulertu zuena ebazteko, hain zuzen, baina ez konputa-
gailua erabili nahi duenaren problemari soluzioa emateko.
I.2.2. Algoritmoa.
Problemaren zehaztapena egin ondoren, eta erabiliko den programazio-
lengoaia ondo ezagutuz gero, programa idazten besterik gabe has daitekeela dirudi.
Nahiz eta kasu errazenetan noizbait horrela jokatzen den, hori ez da ohiko
prozedura. Zuzenean idatzi gabe, tarteko pauso bat bete behar da: algoritmo bat
diseinatzea.
Programan bezala algoritmoan ere agindu-sekuentziak definitzen dira, baina
ez programazio-lengoaia jakin baten aginduak erabiliz, programazio-lengoaia
guztietan erabiltzen diren aginduen abstrakzioak (lengoaia guztiek konpartitzen
dutena edo) erabiliz baizik. Ondorioz, algoritmoan ez dira gorde behar programa-
zio-lengoaia batez idazteko gorde behar diren arau sintaktiko estuak. Zailtasun-
maila hori geroago egin beharko den kodeketa-faserako lagatzen da.
16 Oinarrizko programazioa. Ariketa bilduma
I.2.3. Programa.
Pauso honetan, hautatutako programazio-lengoaiaren arauak ondo ezagututa,
programagileak programazio-lengoaiara itzultzen ditu algoritmoko aginduak.
Ondoren, programa-itzultzaile bat (konpiladorea edo interpretzailea) beharko da
goi-mailako programa hori ordenadorearen makina-lengoaiara itzul dezan. Kasu
gehienetan konpilatzaileak programako errore sintaktikoak nabarituko ditu.
Horrelako errore guztiak zuzendu arte, konpilatzaileak ez du sortuko programa
itzulia. Orduan prest egongo gara programa lehenengo aldiz egikaritzeko.
I.2.4. Proba.
Eraikitako programak erroreren bat izan dezake. Frogatu egin behar da
programaren zuzentasuna. Horregatik, programaren zuzentasuna frogatzeko,
proba-kasuak egikaritzen dira. Horretarako, programaren zehaztapenaren arabera
esanguratsu diren sarrera-datuen multzoak definitu eta bakoitzari dagokion emaitza
ezarri behar da aldez aurretik. Errorerik aurkitzen bada, zuzendu egin beharko da
programa, edo algoritmoa, edo zehaztapena. Pauso honi errore-arazketa deritzo.
Errore-arazketa ez da inoiz ere amaitzen programa handiekin, ezinezkoa izaten
baita zuzentasunerako proba guztiak egikaritzea, oso errepresentagarriak direnak
soilik hartzen dira-eta; probetan errorerik agertzen ez bada, zuzentzat ematen da
programa eta erabiltzen hasteko prest dago; baina erabiltzerakoan kontuan hartu ez
diren posibilitateak gertatuz gero, errore berririk ager daiteke, eta orduan ere
zuzenketa berri bat egin beharko da.
I.2.5. Estiloa.
Programak ahalik eta modu ulergarrienean idatzi behar dira, beren
zuzentasunaz edo errorerik eza ziurtasuna emateko eta errore-zuzenketa errazagoa
izan dadin. Programazio-estiloari begira, ondoko puntuak hartu behar ditugu
kontuan:
· Programa erabilgarri gehienak, egileez gain, beste programatzaile batzuek
ere irakurtzen dituzte.
· Irakurle bakoitzak programak nola lan egiten duen erraz ikusi behar du,
erroreak aurkitu ahal izateko eta zuzentzeko edo aldaketak egiteko.
· Estilo txarrez eginiko programa bat irakurtzea ez da batere atsegina, ezta
egilearentzat berarentzat ere.
Konputagailuen programazioa: algoritmoak 17
II. Eredu algoritmikoa. Algoritmoen osagaiak
Bost dira algoritmoak idaztean menperatu behar diren oinarrizko kontzeptuak:
objektuak (edo datuak), objektuak manipulatzeko aginduak, datu berriak kalkula-
tzeko balio duten adierazpenak, aginduak betetzeko ordena alda dezaketen
kontrol-egiturak eta algoritmo zailak azpiproblema sinpleagotan banatu eta azpi-
problema bakoitza bere aldetik ebazteko laguntza eskaintzen duten moduluak
(funtzioak eta prozedurak).
II.1. OBJEKTUAK: ALDAGAIAK, KONSTANTEAK ETA LITERALAK
Problema baten datuak objektuen bidez adierazten ditugu algoritmoetan.
Objektu horiek hiru ezaugarri dituzte beti:
· IZENA: identifikadore bat.
· MOTA: mota batek definitzen du:
· bere balio posibleen multzoa
· eta balio horiekin egin daitezkeen eragiketak.
Adibidez: osokoa, erreala, karakterea
· BALIOA: une zehatz batean daukana
Objektuen artean konstanteak eta aldagaiak bereizten dira. Kasu bietan izena
eta mota aldaezinak dira algoritmoa egikaritzen denean; konstanteen kasuan berdin
gertatzen da balioarekin, baina aldagaien balioa aldatu egin daiteke.
Konstantea deritzo, behin bere balioa finkatu denetik aurrera, balio hori inoiz
aldatzen ez zaion objektuari (adibidez: Pi konstantea 3.14159 balio erreala
adierazteko defini daiteke, eta Segundoak_Orduko konstantea, ordu batek dituen
3600 segundoren kopurua adierazteko).
Aldagaia berriz, alda daitekeen balioa duen objektua da (adibidez: algoritmoa
egikaritzen hasten denean, Kontagailua izeneko aldagai batek 0 osoko balioa du
eta bukaeran 21 balioa).
Literalak deritzen objektuak ere balio konstanteak adierazteko erabiltzen dira,
baina zuzenean balioa idatziz, identifikadorerik erabili gabe; adibidez:
0 1 60 1_000_000 (osoko literalak)
0.0 3.14158 (literal errealak)
`H' `:' ` ` (karaktere motako literalak)
"Ordua: " "???" (kate motako literalak)
Objektu bat datu-mota batekoa dela esaten dugunean, bi gauza zehazten dugu:
batetik objektuak har ditzakeen balio posibleen multzoa (domeinu deritzona) zein
den, eta bestetik balio horiekin erabil daitezkeen eragiketak zein diren.
Objektu batzuk sinpleak dira, datu bakar batekin errepresentatzen baitira
(bakunak edo eskalarrak ere esaten zaie); beste batzuk, ordea, konposatuak dira
eta datu-mota egituratuak erabili behar dira haiek errepresentatu ahal izateko.
Azter ditzagun oinarrizko algoritmoetan erabiltzen diren datu-mota arruntenak!
Lehenengoz, datu-mota sinpleak, eta gero, egituratuak.
II.1.1. Datu-mota sinpleak
Hauexek dira balio bakar bat dakarten datu-motak:
Datu-mota Balioak
Osoko osoko zenbakiak
Erreal zenbaki errealak
Karaktere karaktereak
Boolear balio boolearrak
Kate karaktere-kateak
II.1.1.1.Osokoak
Zenbaki osoak adierazteko datu-mota
DOMEINUA: ..., ­3, ­2, ­1, 0, +1, +2, +3, ...
20 Oinarrizko programazioa. Ariketa bilduma
ERAGIKETAK:
Eragigaiak eta emaitzak osokoak dira. Adi zatiketarekin!
Eragile diadikoak Eragile monadikoak
+ batuketa - ukapena
- kenketa abs balio absolutua
* biderketa
/ zatiketa moztua
rem zatiketaren hondarra
mod modulua
** berreketa
Eragiketa erlazionalak: <, <=, >, >=, /=, =
II.1.1.2. Errealak
Zenbaki errealak adierazteko datu-mota.
DOMEINUA:
0.0 1.5 386_473.0 3.141_592_65
3.86473e5 3.0e+8 0.1234E-20
ERAGIKETAK:
Eragigaiak eta emaitzak errealak dira. Berreketako berretzailea izan ezik,
osoko motakoa izan behar baita
Eragile diadikoak Eragile monadikoak
+ batuketa abs balio absolutua
- kenketa - ukapena
* biderketa
/ zatiketa moztua
Eragiketa erlazionalak: <, <=, >, >=, /=, =
II.1.1.3.Boolearrak
Balio logikoak (egiazkoa ala faltsua) adierazteko datu-mota.
Eredu algoritmikoa. Algoritmoen osagaiak 21
DOMEINUA:
{egiazkoa , faltsua }
ERAGIKETAK:
Eragile erlazionalak.
Eragigai biak mota berekoak dira eta, emaitza, boolearra.
= berdin <= txikiago edo berdin
/= desberdin >= handiago edo berdin
< txikiago > handiago
Eragiketa logikoak.
Eragigai biak eta emaitza ere boolearrak dira.
and eta eragiketa logikoa
or edo eragiketa logikoa
xor ala eragiketa logikoa
not ez eragiketa logikoa
and, or, xor eta not eragiketa boolearren egia-taulak:
A B A and B A or B A xor B not B
Faltsua Faltsua Faltsua Faltsua Faltsua Egiazkoa
Faltsua Egiazkoa Faltsua Egiazkoa Egiazkoa Faltsua
Egiazkoa Faltsua Faltsua Egiazkoa Egiazkoa
Egiazkoa Egiazkoa Egiazkoa Egiazkoa Faltsua
II.1.1.4.Karaktereak
Karaktereak adierazteko datu-mota.
22 Oinarrizko programazioa. Ariketa bilduma
DOMEINUA:
`a' `A' `1' `?' ...
Kontuz ! 3 eta `3' balio desberdinak dira.
ERAGIKETAK:
Eragiketa erlazionalak: <, <=, >, >=, /=, = (ordena alfabetikoaren arabera)
II.1.1.5. Kateak
Karaktere-kateak adierazteko datu-mota.
DOMEINUA:
Karaktere-kateak.
"Maite", "Kale Nagusia 12, 3.C"
Kontuz ! "3", 3 eta `3' balio desberdinak dira.
ERAGIKETAK:
Eragiketa erlazionalak: <, <=, >, >=, /=, =
II.1.2. Datu-mota egituratuak
Orain arte definitutako datu-motak sinpleak izan dira: balio bakarra biltzen
dute. Datu-mota egituratuek balio bat baino gehiago biltzen dute. Datu-mota
egituratu arruntenak hiru dira:
· Bektorea: Osagaiak mota berekoak dira eta indize bakar batekin erreferen-
tziatzen dira.
· Matrizea: Osagaiak mota berekoak dira eta indize birekin erreferentziatzen
dira.
· Erregistroa: osagai guztiak ez dira mota berekoak
II.1.2.1. Bektoreak
Bektore motako aldagai batek bere barruan mota berekoak diren hainbat
aldagai dauzka. Osagai horiek indize bat erabiliz erreferentziatzen dira.
Eredu algoritmikoa. Algoritmoen osagaiak 23
Hasieran ariketa-bilduma honetan lau datu-mota berri erabili ahal izango
ditugu: Osokoen_Bektore (osagai bezala zenbaki osoak dituen bektorea),
Errealen_Bektore, Boolearren_Bektore eta Karaktereen_Bektore; baina edozein
motatako osagaiak dituen bektorea definitzea ere posiblea da, aurrerago azalduko
dugunez.
Bektore motako aldagai (edo objektu) bat erazagutzeko hiru gauza zehaztu
behar dira: bektorearen izena, osagaien kopurua (indizeetarako tartea definituz) eta
osagaien mota. Adibidez:
Kalifikazioak: Osokoen_Bektore(1..10)
Batezbestekoak: Errealen_Bektore(1..66)
Bektorearen osagai bat adierazteko, bektorearen izena eta osagaiari dagokion
indizea idatzi behar dira.
Kalifikazioak(6) Kalifikazioak deritzon bektorearen seigarren osagaia da
Batezbestekoak(2) Batezbestekoak bektorearen bigarren osagaia da
Indizea adierazpen bat ere izan daiteke:
Kalifikazioak(I) Kalifikazioak izeneko bektorearen I-garren osagaia da.
I aldagaiak exekuzio-unean daukan balioa da indizea.
Kalifikazioak(2*I -3) Une batean I-ren balioa 4 bada, 5. osagaia da aipatzen
dena; geroago I-ren balioa 5 bada, 7. osagaia da orduan
aipatzen dena.
KONTUZ! Kalifikazioak(2*I -3) erabiliz gero, une batean I-ren balioa 8
bada, 13. osagaia aipatu nahi da eta Kalifikazioak bektoreak hainbeste osagai ez
duenez, errore bat sortuko da.
Hona hemen nola definitzen diren bektoreen datu-motak:
BALIO POSIBLEAK:
Osagai bakoitzak bere motako balio bat dauka.
Bektorearen balio posibleak bere osagaien balio-konbinazio guztiak dira.
24 Oinarrizko programazioa. Ariketa bilduma
ERAGIKETAK:
Osagai bakoitzak bere motako aldagai bakun modura jokatzen du
Osagai-kopuru berdineko bektoreen artean bi eragiketa hauek egin daitezke:
· Bektore osoaren asignazioa
· Bektore osoen arteko konparazioa (=, /=)
Definitu ditugun lau datu-motak (Osokoen_Bektore, Errealen_Bektore, ...)
azpiprogrametan erabil daitezke parametro baten mota adierazteko, osagaien kopu-
rua zehaztu gabe. Parametro errealak zehaztuta eduki beharko du osagaien kopurua,
baina parametro formala orokorragoa izan daiteke; horrela eginez, azpiprogramak
edozein tamainatako bektoreen tratamendua definitzeko aukera eskainiko du.
Parametro erreal eta formalak zer diren ulertzeko jo II.5 atalera.
1. erabilera-adibidea: Gehienez 100 karaktere dituen eta puntuz bukatzen den
karaktere-sekuentzia bat emanda, karaktere guztiak atzetik aurrera idatziko dituen
algoritmoa espezifikatu eta egin.
Honelako bektore bat behar dugu
Bektorea: Karaktereen_Bektore (1..100)
algoritmo Alderantziz
Aurrebaldintza: S (karaktere-sekuentzia).
Puntuz bukatzen da eta ez dago beste
punturik.
Postbaldintza: S' (karaktere-sekuentzia).
S sekuentziako karaktereak dauzka baina
alderantzizko ordenan
hasiera
Testua_Gorde(Bektorea, Kar_Kopurua)
Idatzi_Atzekoz Aurrera (Bektorea, Kar_Kopurua)
amaia
algoritmo Testua_Gorde
(B: emaitza Karaktereen_Bektore ;
Kop: emaitza Osokoa)
Aurrebaldintza: S (karaktere-sekuentzia).
Puntuz bukatzen da eta ez dago beste
punturik.
Postbaldintza: Kop-ek adierazten du S
sekuentziaren karaktere-kopurua puntua
kontatu gabe.
S sekuentziako karaktereak B bektorean
gorde dira lehenengo posiziotik Kop-garren
posizioraino
Eredu algoritmikoa. Algoritmoen osagaiak 25
hasiera
Irakurri_Karakterea (Kar)
I:= 1
bitartean Kar /= ´ ´ egin
B(I) := Kar
I := I + 1
Irakurri_Karakterea (Kar)
ambitartean
Kop := I ­ 1
amaia
algoritmo Idatzi_Atzekoz Aurrera
(B: datu Karaktereen_Bektore;
Kop: datu Osokoa)
Aurrebaldintza: Kop-ek adierazten du B
bektoreko indize bat
Postbaldintza: S´ (karaktere-sekuentzia)
B bektoreko osagaien karaktereak idatzi dira
lehenengo posiziotik Kop-garren posizioraino
hasiera
I:= Kop
bitartean I > 0 egin
Idatzi_Karakterea (B(I))
I := I ­ 1
ambitartean
amaia
2. erabilera-adibidea: N elementu duen osokoen bektore bat emanda,
bektoreko zenbakien batezbesteko aritmetikoa kalkulatzen duen algoritmoa
espezifikatu eta egin. Azpiprograma bezala inplementatu.
funtzio Batezbestekoa (B: Osokoen_Bektore; N: Osokoa)
itzuli Erreala
Aurrebaldintza: N>0
Postbaldintza: Itzuli da zenbaki erreal bat, B
bektoreko N osagaien batezbesteko aritmetikoa
adierazten duena
hasiera
Batura := 0
egin I guztietarako 1 tik N raino
Batura := Batura + B(I)
amguztietarako
itzuli (Erreal_Bihurtu (Batura) / Erreal_Bihurtu(N))
amaia
Erreal_Bihurtu funtzioak osoko bat hartu eta zenbaki erreal bihurtzen du.
26 Oinarrizko programazioa. Ariketa bilduma
II.1.2.2. Matrizeak
Azaldu dugun bezala, bektore motakoa den aldagai bat osatzen duten aldagai
guztiak mota berekoak dira, eta indize bakar baten arabera erreferentziatzen dira.
Matrizeetan, berriz, bi indize erabiltzen dira.
Lau datu-mota berri erabili ahal izango ditugu: Osokoen_Matrize (osagai
bezala zenbaki osoak dituen matrizea), Errealen_Matrize, Boolearren_Matrize eta
Karaktereen_Matrize. Edozein motatako osagaiak dituen bektorea definitzea ere
posiblea da.
Matrize motako aldagai bat erazagutzeko hiru gauza zehaztu behar dira: ma-
trizearen izena, osagaien kopurua (bi indizeetarako tarteak definituz) eta osagaien
mota. Adibidez:
Itsasontziak: Boolearren_Matrize (1 .. 10, 1 .. 10)
Pantaila: Karaktereen_Matrize (1 .. 24, 1 .. 80)
Matrizeko osagai bat adierazteko, bektorearen izena eta osagaiari dagozkion
indizeak idatzi behar dira. Adibidez:
Pantaila(6, 25) Pantaila izeneko matrizeko 6. errenkadako 25. osagaia da
Itsasontziak(I, J+1) Itsasontziak izeneko matrizeko I. errenkadako
(J+1)garren osagaia da
II.1.2.3. Erregistroak
Datu-mota egituratuek balio bat baino gehiago biltzen dute. Datu-mota egitu-
ratu arruntenen arteko aldeak hauexek dira:
Bektorea:
osagai guztiak mota berekoak dira
osagaiak indexazio bidez erreferentziatuko dira
Erregistroa:
osagai guztiak ez dira mota berekoak
osagaiak identifikadore bidez erreferentziatuko dira.
Objektu-bilduma bat erregistro batean biltzeak abantailak ditu: batetik,
objektuek batak bestearekin duten erlazioa esplizituki adierazten da, eta bestetik,
Eredu algoritmikoa. Algoritmoen osagaiak 27
erregistroa objektu bakun modura maneiatu edo bere osagaiak indibidualki ma-
neiatzearen artean aukera dezakegu, uneko beharren arabera.
Erregistro motako objektu bat erazagutzeko bi gauza definitu behar dira:
objektuaren izena eta erregistro-motaren definizioa, hau da, erregistro-osagai
bakoitzaren identifikadorea eta mota. Adibidez:
Hitza: erregistro
Karaktereak: katea(1..20) ;
Luzera: osoko ;
amerregistro;
Erazagupen bera lortu liteke, lehenago erregistroarekin mota berri bat
definituz, eta ondoren Hitza aldagaia mota horrekin erazagutuz:
mota Hitz da erregistro
Karaktereak: katea(1..20) ;
Luzera: osoko ;
amerregistro;
Hitza: Hitz ;
Modu batera edo bestera eginda, Hitza izeneko aldagaiaren erazagupena
berdina da. Hala ere, komeni da Hitz izeneko mota definitzea; horrela eginez,
azpiprogrametako parametroetan edo programako beste toki batean ere erabili ahal
izango da gero.
Erregistro baten osagai bat erreferentziatzeko erregistro motako aldagaiaren
izena, puntu bat eta osagaiari dagokion identifikadorea idatzi behar dira. Adibidez:
Hitza.Luzera Hitza aldagaiko Luzera osagaia.
Hitza.Karaktereak Hitza aldagaiko karaktere-bektorea.
Hitza.Karaktereak(2) Hitza aldagaiko karaktere-bektorearen 2. osagaia.
Hitza Erregistro osoa duen Hitza aldagaia.
Hona hemen nola definitzen diren erregistroen datu-motak:
BALIO POSIBLEAK:
Osagai bakoitzak bere motako balio bat dauka.
Erregistro osoak balio guztiek osaturiko egitura dauka baliotzat.
28 Oinarrizko programazioa. Ariketa bilduma
ERAGIKETAK:
Osagai bakoitzak bere motako aldagai bakun modura jokatzen du.
Mota bereko erregistroen artean bi eragiketa hauek egin daitezke:
· erregistro osoaren asignazioa
· eerregistro osoen arteko konparazioa (=, /=)
II.1.2.4. Datu-egitura mistoak
Algoritmo batean erabili behar den objektu bat oso konplexua bada, datu-
-egitura bat definitu beharko da hura adierazteko. Datu-egitura gisa, osagaien
arteko erlazioa erakusteko moduan antolatuta dagoen datu-elementuen bilduma
ulertzen dugu.
Datu-egiturak definitzeko oinarrizko eraikuntza-blokeak bektoreak eta
erregistroak dira. Bektoreen eta erregistroen osagaiak berak ere bektoreak edo
erregistroak izan daitezke. Honek nahi adinako konplexutasuneko datu-egiturak
definitzeko aukera ematen du. Hona hemen datu-egitura mistoen zenbait adibide:
Datu-egitura mistoa (adibidea)
mota Hiztegi da Hitz bektore(1..1000)
mota Hitz da erregistro
Karaktereak: Katea(1..20)
Luzera: Osoko
amerregistro
Datu-egitura mistoa (adibidea)
mota Talde da Ikasle bektore(1..100)
mota Hitz da erregistro
Karaktereak: Katea(1..20)
Luzera: Osoko
mota Ikasle da erregistro
Kodea: Osoko
Izena, Deitura1, Deitura2: katea (1..20)
Kalifikazioak: Osokoen_Bektore (1..10)
amerregistro
Datu-egitura mistoa (adibidea)
mota Talde da erregistro
Ikasleak: Ikasle bektore(1..100)
Batezbestekoak: Errealen_Bektore(1..10)
amerregistro
mota Ikasle da erregistro
Kodea: osoko
Izena, Deitura1, Deitura2: katea(1..20)
Kalifikazioak: Osokoen_Bektore(1..10)
amerregistro
Eredu algoritmikoa. Algoritmoen osagaiak 29
II.2. ADIERAZPENAK
Balio berri bat kalkulatzeko formulak dira. Oro har, balio bat erabil daitekeen
tokian adierazpen bat ere jar daiteke, adierazpena kalkulatuz lortzen den balioa
adierazten duelarik. Adierazpen bat ebaluatzean, bertan dauden aldagaien ordez
une horretan aldagaiek duten balioak erabiltzen dira kalkuluak egiteko. Adibidez:
Une batean I aldagaiaren balioa 5 baldin bada, 2*I+3 adierazpena ebaluatuz
13 lortuko da. Geroxeago I aldagaiaren balioa 6 baldin bada orduan 2*I+3
adierazpen bera ebaluatuz 15 lortuko da.
Adierazpen berean zenbait eragiketa biltzen direnean, ondo zehaztu beharko
da eragiketak burutzeko ordena. Ebaluatzeko ordena zein izango den jakiteko,
eragiketen arteko lehentasunak ezagutu behar dira. Hala ere, beti izango da posible
parentesiak erabiltzea, lehentasun esplizitua ezartzeko.
Adibidez, I+J/K adierazpena honako adierazpen hauetako zeinen arabera
ebaluatuko da: I+(J/K) erara? edo (I+J)/K erara? Maila berean azalduz gero, zati-
ketak batuketak baino lehentasun handiagoa duenez, I+(J/K) erara ebaluatuko da.
Lehentasun-maila bereko bi eragile biltzen direnean, ezkerraldetik hasiko da
ebaluatzen. Adibidez, I/J*K adierazpena (I/J)*K erara ebaluatuko da. Ondoko
taulan eragiketa arrunten arteko lehentasunak erakusten dira:
Eragile diadikoak Eragile monadikoak Lehentasuna
** abs not handiena
* / mod rem
+ - & + -
= /= < <= >= >
eta edo ala txikiena
II.3. AGINDUAK
Hiru dira datuak erabiltzeko oinarizko aginduak1: balio baten asignazioa edo
esleipena, datu baten irakurketa eta datu baten idazketa..
II.3.1. Asignazioa
aldagaia := adierazpena
30 Oinarrizko programazioa. Ariketa bilduma
1. Aginduei ekintza ere esaten diegu algoritmoez ari garenean.
Asignazioak adierazpena ebaluatuz lortzen den balioa ezartzen dio aldagaiari,
balio berri modura. Aldagaiak galdu egiten du aurreko balioa. Adierazpenean alda-
gairik azaltzen bada, adierazpena ebaluatzean aldagaiak duen balioa erabiliko da,
baina aldagaiaren balio hori ez da aldatzen ikusia izateagatik. Adibidea:
Hasierako egoera:
N: 3 P: 4 X: 1.0 Y: 4.5
Asignazioak
M := (N + P) * 6
Z := Y - X
P := P + 1
Asignazioak egikaritu ondoko egoera hauxe izango da:
N: 3 P: 5 X: 1.0 Y: 4.5 M: 42 Z: 3.5
II.3.2. Datuak irakurri
Datuak sekuentzia batetik irakurtzen dira. Sekuentziako elementu guztiak
mota berekoak direla suposatzen da. Gehienetan sekuentzia hori teklatutik idatziko
diren balio-sekuentzia modura ikus daiteke. Oinarrizko mota bakoitzerako, agindu
bat dago mota horretako balioak irakurtzeko.
Irakurri_Osokoa (ald1)
Sekuentzian oraindik irakurri gabe dagoen lehenengo osokoa ald1 aldagaiari
asignatzen dio.
Antzekoak dira honako hauek:
Irakurri_Erreala (ald2)
Irakurri_Karakterea (ald3)
Sekuentziako elementuen motak eta aldagaiarenak berdinak izan behar dute.
Sekuentziako elementu bat irakurri ahal izateko, aldez aurretik irakurri behar izan
dira aurretik zeuden guztiak.
Adibidea. Demagun datuak irakurtzeko sekuentzia hau dela:
37 9 4 17 -78 0
Eredu algoritmikoa. Algoritmoen osagaiak 31
Honako irakurketak egikaritzen badira:
Irakurri_Osokoa (X)
Irakurri_Osokoa (Z)
Irakurri_Osokoa (Y)
Bukaeran aldagaien balioak hauek izango dira:
X: 37 Y: 4 Z: 9
Eta hurrengo irakurketan hartuko den zenbakia 17 izango da.
II.3.3. Datuak idatzi
Emaitzak beste sekuentzia batean idazten dira.
Idatzi_Osokoa ( adierazpen1)
Agindu honek adierazpena ebaluatuz lortzen den balioa (osokoa) idatzi egiten
du irteera-sekuentzian. Ordenadoreko pantailan idazten du balioa. Adibidez:
Hasierako egoera:
X : 3 Y : 45
Agindua:
Idatzi_Osokoa ((X+Y)*2)
Pantailan idazten dena:
96
Antzekoak dira honako hauek:
Idatzi _Erreala ( adierazpen2)
Idatzi_Karakterea ( adierazpen3)
32 Oinarrizko programazioa. Ariketa bilduma
II.4. KONTROL-EGITURAK
II.4.1. Agindu-sekuentzia
Algoritmoko agindu-sekuentzia pausoz pauso eta ordenan egikaritzen da.
Ordena sekuentzial eta lineal hori aldatzeko bi aukera daude: baldintzazko egiturak
edo iterazio-egiturak erabiltzea.
II.4.2. Baldintzazko egiturak
Agindu bat (edo gehiago) baldintza bat betetzen denean bakarrik egin behar
bada, baldin izeneko kontrol-egitura erabili beharko da. Emaitza boolearra itzuliko
duen adierazpena izan behar du baldintzak.
baldin baldintza orduan
ekintza1... ekintzan
ambaldin
Baldintza betetzen ez denean beste agindu bat (edo gehiago) egin behar bada,
bestela motako atal bat ere sar daiteke:
baldin baldintza orduan
ekintza1... ekintzan
bestela
ekintzab1... ekintzabm
ambaldin
baldintza
egiazkoa
faltsua
ekintza 1 ... ekintza n
Eredu algoritmikoa. Algoritmoen osagaiak 33
II.4.3. Iterazio-egiturak
II.4.3.1. Iterazio arrunta
Agindu bat (edo gehiago) errepikatu behar direla adierazteko, bitartean izeneko
kontrol-egitura erabiltzen dugu: Aginduak errepikatuko dira baldintza betetzen den
bitartean
bitartean baldintza egin
ekintza1
ekintza2
...
ekintzan
ambitartean
II.4.3.2. Aldi-kopuru jakineko iterazioa
Iteratzen hasi baino lehenago aginduak zenbat aldiz errepikatu behar diren
jakiterik badago, egokiago izaten da guztietarako motako kontrol-egitura
erabiltzea. Definizioko n1 eta n2 horiek adierazpenak dira, alegia, errepikaketak
kontrolatzeko I aldagaiak hartu behar dituen lehenengo eta azken balioak
kalkulatzeko erabiliko direnak. Adierazpen horiek iterazioa hasi aurretik bakarrik
baldintza
egiazkoa
faltsua
ekintza 1 ... ekintza n
baldintza
egiazkoafaltsua
ekintza 1 ... ekintza nekintza b1 ... ekintza bm
34 Oinarrizko programazioa. Ariketa bilduma
kalkulatzen dira, baina, kontuz!, ez geroago. I kontrol-aldagaiaren balioa erabil
daiteke iterazioko adierazpenetan; baina I kontrol-aldagai horri ezin zaio balio
berri bat asignatu begiztaren barruko ekintzaren batean.
egin I guztietarako n1 tik n2 raino
ekintza1 ... ekintzan
amguztietarako
Adibidea:
algoritmo Kuboak_1_30
hasiera
egin I guztietarako 1 tik 30 raino
Idatzi_Osokoa (I**3)
amguztietarako
amaia
Emaitza:
1 8 27 64 125 216 ... 27000
Ondoko algoritmoak ere emaitza berdinak ematen ditu baina bitartean
izeneko kontrol-egitura erabiliz definitu da:
algoritmo Kuboak_1_30
hasiera
I := 1
bitartean I <=30 egin
Idatzi_Osokoa (I**3)
I := I + 1
ambitartean
amaia
egiazkoa
faltsua
ekintza 1 ... ekintza n
I : = I + 1
I : n1
I < n ?2
Eredu algoritmikoa. Algoritmoen osagaiak 35
II.5. MODULUAK: FUNTZIOAK ETA PROZEDURAK
Algoritmo zailak azpiproblema sinpleagotan banatu eta azpiproblema
bakoitza bere aldetik ebazteko laguntza eskaintzen dute moduluek. Moduluak bi
eratakoak izan daitezke:
Funtzioa
· Emaitza bat kalkulatzeko balio du.
· Balio modura erabiltzen da.
· Emaitza hau adierazpen baten barruan erabili behar da nahitaez.
Adibidez, Pred funtzioa zenbaki oso baten aurrekoa itzultzeko definitu
bada, Pred(8)*2 adierazpenak 14 balioa itzuliko du.
Prozedura
· Aldagai baten balioa aldatu edo sarrera-irteera bat egikaritzeko balio du.
· Agindu modura erabiltzen da, beste algoritmo edo modulu baten barruan.
Adibidez, Idatzi_Osokoa prozedura osoko bat idazteko prozedura bada,
Idatzi_Osokoa(N-4) agindu posible bat da algoritmo batean.
Modulu batek parametroak eduki ditzake. Parametroei esker moduluaren
definizioa orokorragoa izango da, eta eragin berdina lortu ahal izango da datu edo
aldagai desberdinekin. Parametroen bitartez datuak pasatzen zaizkio eta emaitzak
jasotzen dira.
Moduluak algoritmoak bezala definitzen dira agindu-multzo batekin; eta mul-
tzo honi moduluaren gorputza deritzo. Gorputz hau moduluari deitzen zaionean
egikaritzen da; ondoren algoritmoaren exekuzioak deiaren ondoko puntutik
jarraituko du. Moduluko barruko aldagaiak eta konstanteak zeintzuk diren hobeto
zehaztearren, hobe izaten da agindu-sekuentzia baino lehenago aipatzea. Horrela,
objektu horiek modulu horretatik kanpo ezin erabil daitezkeela adierazi nahi dugu.
Programazio-lengoaiek oso erabilgarriak diren azpiprograma edo modulu
estandarrak eskainiko dituzte. Programategi bakoitzak programatzaile-talde bere-
zientzat erabilgarriak diren azpiprogramak ere izango ditu. Adibidez, programa-
tzaile `zientifikoek' sinuak, kosinuak, erro karratuak eta horrelakoak kalkulatzeko
gai diren funtzio matematikoak beharko dituzte. Horrela, programategiak esfortzu-
-bikoizketa ekiditen du eta adituek eginiko algoritmo sofistikatuak erabilgarri
izango dira esperientziarik ez duten programatzaileentzako ere.
36 Oinarrizko programazioa. Ariketa bilduma
II.5.1. Funtzioak
Imajina ezazu karaktere bat hartu eta letra bat den ala ez aztertzen duen
Alfabetikoa izeneko funtzio bat. Alfabetikoa('K') eta Alfabetikoa(Iniziala) funtzio-
-deien adibideak dira (Iniziala delakoa karaktere motako aldagaia izanik).
Parentesi artean dagoen adierazpenari parametro erreal deitzen zaio, eta funtzioak
parametro erreal horrekin egingo du kalkulua. Funtzio-dei hauetan parametroa
karaktere motakoa da, eta emaitza boolear motakoa.
Adibidez, ZKH funtzioak bi osoko positiboen zatitzaile komunetatik handiena
kalkulatzen badu, Y := 1+ ZKH(N+1, 72) asignazioan erabili den modura erabil
daiteke funtzio-deietan. Funtzio honen bi parametroak eta bere emaitza Osoko
motakoak izan beharko dira.
Funtzioaren definizioan izena, parametroak (bakoitzerako izena eta mota), eta
kalkulatuko duen emaitzaren mota zehaztu behar dira. Funtzio-etan nahi adina
parametro erreal defini daitezke. Hemen dituzu, aurrez aipaturiko Alfabetikoa eta
ZKH funtzioen erazagupenak:
funtzio Alfabetikoa (Kar : Karaktere) itzuli Boolear
funtzio ZKH (Zenb1, Zenb2 : Osoko) itzuli Osoko
Funtzioaren izena funtzio hitz erreserbatuaren jarraian dago. Bere emaitzaren
mota itzuli hitz erreserbatuaren ondoren dago zehaztuta. Hauen artean eta paren-
tesien bidez bildurik, edozein parametro-espezifikazio idazten dugu. Hauetako
bakoitzak parametro bat edo gehiagoren izena eta hauen mota zehazten ditu.
Alfabetikoa izeneko funtzioak parametro bakarra du, Karaktere motakoa da
eta bere izena Kar da. Kar izenari esker, posible izango zaigu funtzio-gorputzaren
barrutik parametroa erreferentziatzea, deietan erabiliko den parametro erreala
aipatu gabe. Horregatik Kar delakoari funtzioaren parametro formal deitzen zaio.
ZKH funtzioak bi parametro formal ditu, Zenb1 eta Zenb2, biak Osoko
motakoak.
Hala ere, funtzio-erazagupen batek ez du zehazten funtzioaren emaitza nola
kalkulatzen den. Horregatik, funtzioaren gorputza ere idatzi behar dugu, honek
baititu parametroen balioetatik abiatuz funtzioaren emaitza kalkulatuko duten
aginduak.
Ondoko hau Alfabetikoa deritzon funtzioaren definizio posible bat duzu:
Eredu algoritmikoa. Algoritmoen osagaiak 37
funtzio Alfabetikoa (Kar : Karaketere) itzuli Bollearra
hasiera
baldin ((Kar >= 'A') eta (Kar <= 'Z'))
edo ((Kar >= 'a') eta (Kar <= 'z'))
orduan itzuli egiazkoa
bestela itzuli faltsua
amaia
Edo baliokidea eta laburragoa den beste gorputz batekin:
funtzio Alfabetikoa (Kar : Karaketere) itzuli Bollearra
hasiera
itzuli ((Kar >= 'A') eta (Kar <= 'Z'))
edo ((Kar >= 'a') eta (Kar <= 'z'))
amaia
Funtzio-gorputz batean itzuli izeneko aginduak bi xederi erantzuteko balio
du: (a) funtzio-gorputzaren egikaritzapenari bukaera ematen dio; eta (b) itzuli hitz
erreserbatuaren ondoren datorren adierazpena ebaluatzen du, eta hori izango da
funtzioaren emaitza.
Jo dezagun, adibidez, Alfabetikoa(Iniziala) delako funtzio-deia ebaluatzen ari
garela. Lehenik, Kar parametro formalari dagokion parametro errealaren balioa,
Iniziala-ren balioa, ematen zaio. Suposa dezagun bere balioa '?' dela. Orduan
hasiera eta amaia hitzen arteko aginduak egikaritzen dira. Hain zuzen, itzuli
aginduaren adierazpena Faltsua da, eta beraz, funtzio-deiak Faltsua emaitza
itzuliko du. Parametro errealaren balioa 'K' izango balitz, emaitza Egiazkoa izango
litzateke.
Orokorki esanda, funtzio-gorputz batek agindu asko eduki ditzake eta, again,
barne-erazagupen batzuk ere bai.
ZKH funtzioa era askotara inplementa daiteke. Hemen duzu beste aukeretako
bat:
funtzio ZKH (Zenb1, Zenb2 : Osoko) itzuli Osoko
M, N, R : Osoko;
hasiera
M := Zenb1
N := Zenb2
R := M mod N
bitartean R/=0 egin
M := N
N := R
R := M mod N
ambitartean
itzuli N
amaia
38 Oinarrizko programazioa. Ariketa bilduma
Funtzio-gorputza M, N eta R aldagaiak aurkezten dituen erazagupenarekin
hasten da, funtzio-gorputzaren barnean aldagai moduan erabiliko direnak dira
horiek. Funtzioaren emaitza, algoritmo euklidearra inplementatzeko M, N eta R
erabiltzen dituen begizta baten bidez kalkulatzen da. Halako batean, itzuli
sententzia egikarituko da, M, N-ren multiplo zehatza denean, funtzioaren emaitza
gisa N-ren azken balioa itzuliz.
Funtzio-gorputz batean itzuli agindu bat edo gehiago egon daitezke. Horre-
lakoetan ere, itzuli agindu bakoitzak funtzioaren emaitzaren motako adierazpen bat
izan behar du. Beharrezkoa da itzuli agindu hauetako bat momenturen batean
egikaritzea. Hau gertatzen denean, itzuli-ren ondoren dagoen adierazpena ebalua-
tzen da funtzioaren emaitza zehazteko, eta funtzio-gorputzaren egikaritzapena
bukatu egiten da. Balioak emaitzaren motakoa behar du izan.
Zenb1 eta Zenb2 parametro formalak ez dira aldagai modura erabili behar
funtzio barruan, konstante bezala baizik; eta beraz, ezin dira eguneratu. Algoritmo
euklidearrak bi zenbakiak beste zenbaki batzuez ordezkatu behar ditu behin eta be-
rriz, zenbaki bat bestearen multiplo dela ikusi arte, beraz, ZKH funtzio-gorputzak
nahi denean egunera daitezkeen aldagai lokaletan kopiatzen ditu bi zenbakiak.
II.5.2. Prozedurak
Funtzioak emaitza bakarra itzuli behar du. Emaitza asko dituen (edo emaitza-
rik ez duen) modulu bat idatzi nahi badugu, prozedura batera joko dugu.
Prozedura-dei bat agindu modura erabiltzen da.
Funtzioetan bezala, prozeduren definizioan ere, erazagupena eta gorputza
bereizten ditugu. Erazagupenak prozeduraren izena eta bere parametro formalen
izena eta mota zehazten ditu. Gorputzak prozedura inplementatzen duten aginduak
eta aldagai lokalak ditu.
Hemen duzu zuriune-kopuru jakin bat idatzi behar duen prozedura baten
erazagupen egokia:
algoritmo Zuriuneak_Idatzi (Zuriune_Kop : Natural)
Prozedura honi horrelako sententzien bidez dei dakioke:
Zuriuneak_Idatzi (10); Zuriuneak_Idatzi (N-1);
Hona hemen gorputz posible bat prozedura honentzat:
Eredu algoritmikoa. Algoritmoen osagaiak 39
algoritmo Zuriuneak_Idatzi (Zuriune_Kop : Natural)
hasiera
egin Kont guztietarako 1 tik Zuriune_Kop raino
Idatzi_Karakterea (' ')
amguztietarako
amaia
Funtzio-gorputz bateko itzuli aginduak funtzioaren emaitza zehaztu eta
funtzio-gorputzaren egikaritzapena bukatzeko balio du. Prozedura-gorputz batean
lehenengo xedea ez da beharrezkoa; beraz, ez da egongo jarraian adierazpenik
duen itzuli agindurik. Gainera, itzulketa inplizitu bat dago prozedura-gorputza
bakoitzaren azken amaia baino lehen.
Modulu bat exekutatu ondoren, modulu barruan erazagututako parametro eta
objektu formal guztiak desagertzen dira. (Horrela, hauek betetzen zuten memoria
libre uzten da beste xede batzuetarako)
II.5.3. Moduluen parametroak
Hiru parametro klase daude: sarrerakoak, irteerakoak eta sarrera-irteerakoak.
Diferentzia, datuak modulutik atera ala sartzeko erabiliko diren zehaztean datza.
II.5.3.1. Sarrera-parametroak
Orain arte ikusi ditugun moduluetan parametroak moduluari balioak emateko
erabiltzen direla ikusi dugu. Balioa moduluan sartzen dutenez, horrelako parame-
troei sarrera-parametroak deritzegu.
Sarrera-parametroen mekanismoa ondorengo hau da. Sarrera-parametro for-
mal bakoitzak, bere balioa dagokion parametro errealetik hartzen duen konstante
lokal gisa jokatzen du (beraz, parametro errealak parametro formalaren mota
berekoa behar du izan).
Parametro formalak esplizituki zehaztu behar dira sarrera-parametro gisa,
parametro-espezifikazioan bi puntuen ondoren datu hitza ipiniz. Hala ere, hitz hau
aukerakoa da; beraz, ondoko bi prozedura-erazagupen hauek baliokideak dira:
algoritmo Zuriuneak_Idatzi (Zuriune_Kop : Osoko)
algoritmo Zuriuneak_Idatzi (Zuriune_Kop : datu Osoko)
Parametro errealak adierazpen baten bidez erabiliko dira. Adibidez:
Zuriuneak_Idatzi (7)
Zuriuneak_Idatzi (2*N+4)
40 Oinarrizko programazioa. Ariketa bilduma
II.5.3.2. Irteera-parametroak
Balioak kalkulatzea ere posiblea da prozeduretan; hau da, posiblea da para-
metroak zehaztea balioak prozeduraz kanpo erabili ahal izateko edo gerora erabiliko
diren aldagaietan gordetzeko. Horrelako parametroei irteera-parametro deritzegu,
eta beren parametro-espezifikazioan, bi puntuen ondoren emaitza hitza ipiniz
zehazten dira. Horrelako parametroekin, emaitza bat baino gehiago duten moduluak
idatz ditzakegu (gogoratu funtzioek balio bakarra itzultzen dutela).
algoritmo Zatiketa_Moztua (M, N: datu Osoko;
Zatidura, Hondarra: emaitza Osoko)
hasiera
Zatidura := M / N
Hondarra := M mod N
amaia
Zatiketa_Moztua prozedurak bi datu jasotzen ditu eta bi emaitza itzuliko ditu.
Parametro erreala aldagai bat izan beharko da. Adibidez:
Zatiketa_Moztua (107, 7, N1, N2)
Zatiketa_Moztua (107*33, 7, Z, H)
Irteera-parametroen mekanismoak horrela jokatzen du: irteera-parametro
formal bakoitzak aldagai lokal baten gisa jokatzen du. Prozedura-gorputzak balioa
emango dio aldagai honi. Moduluaren exekuzioa bukatutakoan, parametro
formalak duen balioa parametro errealari pasako zaio (beraz, parametroak
aldagaiaren mota bera izan behar du). Kontuan har ezazu, prozedura-gorputzak
ezin duela irteera-parametro formal baten balioa erabili.
II.5.3.3. Sarrera-irteera parametroak
Sarrera-parametro batek balio bat prozedura batera sartzea eta irteera-para-
metro batek bertatik balio bat ateratzea ahalbidetzen dute. Batzuetan, prozedura
batek parametro erreal moduan pasatutako aldagai bat eguneratzea nahiko dugu;
beste modu batera esanda, bere balioa prozedurari pasatu, eguneratu eta, hau egin
ondoren, balioa prozeduratik kanpo bueltatzea nahiko dugu. Xede hau betetzeko,
sarrera-irteera erako parametroa erabiliko dugu. Parametro-espezifikazioan, bi
puntuen ondoren datu-emaitza hitza ipiniz zehazten da hau.
Hemen duzu sarrera-irteera parametroa duen prozedura sinple bat:
algoritmo Gehitu (Kont : datu emaitza Osokoa)
hasiera
Kont := Kont + 1;
amaia Gehitu;
Eredu algoritmikoa. Algoritmoen osagaiak 41
Horrela dei diezaiokegu prozedura honi:
Gehitu (N)
Sarrera-irteera erako parametroen funtzionamendua honako hau da: sarrera-
-irteera erako parametro formal bakoitzak prozedurako aldagai lokal baten moduan
jokatzen du. Prozedura-gorputzean sartzean, aldagai lokalaren balioa berari
dagokion parametro errealaren balioa da. Prozedura-gorputza egikaritzen ari den
bitartean honi esleitzen zaion edozein balio, dagokion parametro errealari pasatuko
zaio.
Irteera-parametroekin bezala, parametro errealak parametro formalaren mota
bereko aldagaia behar du izan.
Funtzioek sarrera-parametroak bakarrik eduki ditzakete. Honek arrazoi on bat
du: irteera- edo sarrera-irteera erako parametroa duen funtzio batek, deitzen zaio-
nean, bere barrukoa ez den aldagai baten balioa alda dezake. Horrelako fenomenoari
albo-ondorio deritzo. Funtzioetan, albo-ondorio hauek ez dira gomendagarriak,
algoritmoen irakurgarritasuna zailtzen baitute.
II.6. ALGORITMOEN IDAZKERA
II.6.1. Formatu orokorra
Hau da algoritmoak idazteko jarraituko dugun eredua:
algoritmo
hasiera
*
amaia
non agindu bakoitza ondoko bat den:
· Asignazioa
· Idazketa
· Irakurketa
· Baldin kontrol-egitura
· Bitartean kontrol-egitura
· Guztietarako kontrol-egitura
· Prozedura-deia
42 Oinarrizko programazioa. Ariketa bilduma
Batzuek nahiago dute aldagaiak esplizituki erazagutzea (gure ariketa-
bilduman ez dugu horrela egingo):
algoritmo
[ : ]*
hasiera
*
amaia
II.6.2. Programazio-estiloa
Programak irakurterrazak izan daitezen :
· Erabil itzazu iruzkinak lasai, programaren funtzioa adierazi eta zati ba-
koitzaren funtzionamendua azaltzeko. Iruzkinak "-" gidoi-parearen ondoan
idatziko ditugu. Lerro bukaeraraino dauden gainontzeko karaktereak, ohar
gisa hartuko dira.
· Aukera itzazu ahalik eta identifikadore deskriptiboenak.
· Erabil maiuskulak edo minuskulak identifikadoreetan, baina beti era berean!
Liburu honetan minuskulaz idatzi ditugu baina lehenengo letra beti maius-
kulaz. Objektuen identifikadoreak izenak izaten dira; prozedurenak, aditzak.
· Ez idatzi algoritmo luzeegiak. Saia zaitez problema nagusia azpiproblema
errazagotan banatzen eta, geroago, hauek aparte definitzen.
Programatzaile askok sententziak bikoiztea ekiditeko tresna erabilgarri huts
gisa ikusten dituzte moduluak. Ikuspegi honek, ordea, moduluak erabiliz lortzen
diren onurak gutxiesten ditu. Hemen duzu horien laburpen bat:
· Modulu bat, nola funtzionatzen duen jakin gabe izan daiteke deitua;
moduluaren erabiltzaileak moduluak zer egiten duen bakarrik jakin behar
du. Modulu bat zertan erabiliko den jakin gabe irakur eta uler daiteke. Gai
hauek bereizteari abstrakzio deritzo eta tresna intelektual ahaltsua da
problema konplexuak ebazteko.
· Azpiprogramek zati askeez osatutako programa bat eraikitzeko balio dute,
non modulu bakoitzak xede bakun bat izango duen. Horrela programa luze
baten eraikuntza asko errazten da modulu bakoitza bereizita idatz eta azter
baitaiteke.
· Azpiprogramek izenak ematen dizkiete programen zatiei. Azpiprogramen-
tzako (eta objektu eta datu-motak moduko hainbat entitateentzako) izen
zentzudunak aukeratuz gero, programa "testu" gisa irakur daiteke. Modu-
Eredu algoritmikoa. Algoritmoen osagaiak 43
luarentzat izen egokia aukeratzea errazagoa da, moduluak xede bakun eta
sinpleren bat baldin badu.
· Modulu bati toki desberdin askotatik dei dakioke, nahi izanez gero parame-
tro erreal desberdinekin.

Oinarrizko programazioa: Ariketa bilduma