MOPT - Lògica i programacio / Pseudocodi: Solucions Exercicis Pseudocodi

De wikiserver
Dreceres ràpides: navegació, cerca

Exercicis Seqüencials

1. Escriu un programa que demani al usuari el seu nom, i a continuació escrigui una salutació.

Anàlisi
Hem de demanar un nom per teclat i després escriure un missatge de salutació
Dades d'entrada: nom (cadena)
Variables: nom (cadena)
Disseny
1. Llegir nom
2. Escriure missatge de salutació
Proceso Saludar
	Definir nom como Cadena;
	Escribir "Diguem el teu nom:";
	Leer nom;
	Escribir "Hola ",nom;
FinProceso

2. Calcular el perímetre i l'àrea d'un rectangle atesa la base i l'alçada.

Anàlisi
Hem de llegir la base i l'alçada del triangle i calcular el perímetre i el àrea
Dades d'entrada: base(real), alçada(real)
Informació de sortida: perímetre(real) i àrea(real)
Variables: base, alçada, perímetre i àrea (real)
Disseny
1. Llegir base i altura
2. Calcular perímetre(2*base + 2*alçada)
3. Calcular àrea (base * altura
4. Mostrar perímetre i àrea
Proceso Rectangle
	Definir base,alçada,perimetre,area como Real;
	Escribir "Introdueix la base:";
	Leer base;
	Escribir "Introdueix la alçada:";
	Leer alçada;
	perimetro <- 2 * base + 2 * alçada;
	area <- base * alçada;
	Escribir "El perí­metre és ",perimetre," y el àrea es ",area;
FinProceso


3. Calcular la hipotenusa d'un triangle rectangle a partir dels seus catets.

Anàlisi
Hem de llegir la longitud dels dos catets i calcular la hipotenusa.
(Teorema de Pitàgores)
Variables d'entrada: catet1(real), catet2(real)
Variables de sortida: hipotenusa(real)
Disseny
1. Llegir la longitud dels catets
2. Calcular hipotenusa (En un triangle rectangle el quadrat de la hipotenusa és igual a la suma dels quadrats dels catets.)
Per tant la hipotenusa és igual a l'arrel quadrada de la suma dels quadrats dels catets (funció raiz).
3. Mostrar la hipotenusa
Proceso CalcularHipotenusa
	Definir catet1,catet2,hipotenusa como Real;
	Escribir "Introdueix el catet 1:";
	Leer catet1;
	Escribir "Introdueix la catet 2:";
	Leer catet2;
	hipotenusa <- raiz(catet1 ^ 2 + catet2 ^ 2);
	Escriure "La hipotenusa és", hipotenusa;
FinProceso

4. Escriu un algoritme amb pseudocodi que demani dos valors numèrics, intercanviï els valors de les variables, i mostri les variables amb els valors intercanviats.

Anàlisi
Es demanen el valor de dues variables (el tipus pot ser el que vulguem).
Cal intercanviar els valors de les variables
Dades d'entrada: dos números en dues variables (enters).
Informació de sortida: Les dues variables però amb les dades canviades (enter)
Variables: num1, num2 (enters).
Disseny
1. Llegir els dos números
2. Intercanvio els valors. Necessito una variable auxiliar (aux).
Assigno "num1" a "aux", "num2" a "num1" i "aux" a "num2"
3. Mostra "num1" i "num2"
Proceso IntercanviarVariables
	Definir num1,num2,aux  como Entero;
	Escribir "Introdueix valor de la variable num1:";
	Lleer num1;
	Escribir "Introdueix valor de la variable num2:";
	Lleer num2;
	aux <- num1;
	num1 <- num2;
	num2 <- aux;
	Escrbir "Nou valor de num1:", num1;
	Escribir "Nou valor de num2:", num2;
FinProceso


Exercicis estructura alternativa

1. Escriu un algorisme que demani un número i digui si és positiu, negatiu o 0.

Anàlisi
Hem de demanar un número per teclat, comparar-lo amb 0, i indicar si és igual, major o menor que 0.
Dades d'entrada: número (enter)
Informació de sortida: Un missatge de text indicant si el número és igual, major o menor que 0.
Variables: num (enters)
Disseny
1. Llegir el número
2. Si el nombre és igual 0 escriviu "És igual a 0"
3. En cas contrari si és més gran que 0 escriure "És més gran que 0"
4. En altre cas escriure "És menor que 0"
Proceso CalcularPositiuNegatiuZero
	Definir num como Entero;
	Escribir "Digue'm el número :";
	Leer num;
	Si num=0 Entonces
		Escribir "És igual a 0";
	SiNo
		Si num>0 Entonces
			Escribir "És positiu";
		SiNo
			Escribir "És negatiu";
		FinSi
	FinSi
FinProceso

2. Escriu un algorisme en pseudocodi que demani un nom d'usuari i una contrasenya i si s'ha introduït "pcarbonell" i "pc1673" s'indica "Has entrat al sistema", sinó hi ha un error.

Anàlisi
Demanem per teclat nom i contrasenya
si coincideixen amb les correctes indiquem que s'ha entrat al sistema.
en cas contrari indiquem que el nom o la clau són incorrectes
Dades d'entrada: usuari, password (cadena)
Informació de sortida: Missatges d'encert o error.
Variables: usuari, password (cadena)
Disseny
1. Llegir l'usuari
2. Llegir el password
3. Si l'usuari és igual a "pcarbonell" i el password és igual a "pc1673"
escriure "Has entrat al sistema"
4. En cas contrari mostrar el missatge "Usuari/password incorrecte"
Procéso Login
	Definir usuari, password como Cadena;
	Escribir Sin Saltar "Introdueix l'usuari:";
	Leer usuari;
	Escribir Sin Saltar "Introdueix el password:";
	Leer password;
	Si usuari="pcarbonell" Y password="pc1673" Entonces
		Escribir "Has entrat al sistema";
	SiNo
		Escribir "Usuari/password incorrecte";
	FinSi
FinProceso

3. Algorisme que demani dos números 'nota' i 'edat' i un caràcter 'sexe' i mostri el missatge 'ACCEPTADA' si la nota és major o igual a cinc, l'edat és més gran o igual a divuit i el sexe és 'F'. En cas que es compleixi el mateix, però el sexe sigui 'M', heu d'imprimir 'POSSIBLE'. Si no es compleixen aquestes condicions cal mostrar 'NO ACCEPTADA'.

Anàlisi
Demanem per teclat dos números: nota i edat i un caràcter sexe.
Es mostra "ACCEPTADA" si nota>=5, edat>=18 i el sexe és femení.
Si es compleix les mateixes condicions però amb el sexe masculí -> "POSSIBLE" en cas contrari es mostra "NO ACCEPTADA"
Dades d'entrada: nota, edat (enter) i sexe (cadena)
Informació de sortida: Missatge d'informació
Variables: nota, edat (enter) i sexe (cadena)
Disseny
1. Llegir la nota, l'edat i el sexe
2. si nota>=5, edat>=18
3. si sexe="F" mostrar "ACCEPTADA" -> funció Mayusculas()
4. si sexe="M" mostrar "POSSIBLE"
5. En cas contrari, mostrar "NO ACCEPTADA"
Proceso ComprovarNotaEdatSexe
	Definir nota,edat como Entero;
	Definir sexe como Cadena
	Escribir Sin Saltar "Introdueix la nota:";
	Leer nota;
	Escribir Sin Saltar "Introdueix l'edat:";
	Llegir edat;
	Escribir Sin Saltar "Introdueix el sexe (F/M):";
	Leer sexe;
	Si nota>=5 Y edat>=18 Entonces
		Si Mayusculas(sexe)="F" Entonces
			Escribir "Acceptada";
		Sinó
			Si Mayusculas(sexe)="M" Entonces
				Escribir "Possible";
			SiNo
				Escribir "No Acceptada";
			FinSi
		FinSi
	SiNo
		Escribir "No Acceptada";
	FinSi
FinProceso

4. L'associació de vinicultors té com a política fixar un preu inicial al quilo de raïm, la qual es classifica en tipus A i B, i a més en mides 1 i 2. Quan es realitza la venda del producte, aquesta és d'un sol tipus i mida, es requereix determinar quant rebrà un productor pel raïm que lliura en un embarcament, considerant el següent:

  • Si és de tipus A, se li carreguen 20 cèntims al preu inicial quan és de mida 1; i 30 cèntims si és de mida 2.
  • Si és de tipus B, es rebaixen 30 cèntims quan és de mida 1, i 50 cèntims quan és de mida 2.
  • Realitzeu un algorisme per determinar el guany obtingut.
Anàlisi
El preu final del raïm es calcula multiplicant els quilos recollits pel preu de cada quilo. El preu per quilo es calcula a partir del preu inicial sumant o restant una quantitat determinada segons la mida i el tipus del raïm.
Dades d'entrada: tipus, mida (caràcter), preu inicial en cèntims i quilos (enter)
Informació de sortida: Preu final en euros (real) o missatge d'error
Variables: preu_inicial (enter), quilos (enter), mida (caràcter), tipus (caràcter), preu_final (real)
Disseny
1. Llegir preu_inicial, quilos
2. Llegir tipus
3. Si tipus no és "A" o "B" tornar missatge d'error.
4. Llegir la mida
5. Si la mida no és "1" o "2" tornar missatge d'error.
6. Si tipus és "A" i mida és "1" summe a preu_inicial 20 cèntims.
7. Si tipus és "A" i mida és "2" summe a preu_inicial 30 cèntims.
8. Si tipus és "B" i grandària és "1" resta a preu_inicial 20 cèntims.
9. Si tipus és "B" i grandària és "2" resta a preu_inicial 30 cèntims.
10. El preu_final = preu_inicial * quilos
11. Mostra preu final/100 euros
Proceso PreuUva
	Definir tipus como Caracter;
	Definir mida como Caracter;
	Definir preu_inicial,preu_final como Real;
	Definir quilos como Entero;
	Escribir Sin Saltar "Introdueix el preu inicial per quilos del UVA (cèntims):";
	Leer preu_inicial;
	Escribir Sin Saltar "Introdueix quants quilos has venut:";
	Leer quilos;
	Escribir Sin Saltar "Introdueix el tipus de l'UVA (A/B):";
	Leer tipus;
	
	Si Mayusculas(tipus)<>"A" Y Mayusculas(tipus)<>"B" Entonces
		Escribir "Tipus incorrecte";
	SiNo
		Escribir Sin Saltar "Introdueix la mida del UVA (1/2):";
		Leer mida;
		Si mida<>"1" Y mida<>"2" Entonces
			Escribir "Mida incorrecte";
		SiNo
			Si Mayusculas(tipus)="A" Entonces
				Si mida="1" Entonces
					preu_inicial<-preu_inicial+20;
				SiNo
					preu_inicial<-preu_inicial+30;
				FinSi
			SiNo
				Si mida="1" Entonces
					preu_inicial<-preu_inicial-20;
				SiNo
					preu_inicial<-preu_inicial-30;
				FinSi
			FinSi
			preu_final<-preu_inicial * quilos;
			Escribir "El guany és",preu_final/100, "euros.";
			
		FinSi
	FinSi
FinProceso

5. Utilitzant l'estructura Segun ..., fes un algorisme en pseudocodi que demani el nom i preu original d'un article i el codi de descompte (si el codi és 1 els descompte és del 10%, si el codi és 2 el descompte és del 15%, si el codi és 3 el descompte és del 20%, altrament el descompte és del 0%. Cal mostrar l'article, el preu original, el descompte i el preu final.

Proceso DescompteComercial

	Definir nom como Cadena;
	Definir preuOriginal, descompte, preuFinal como Real;
	Definir codiDescompte como Entero;
	
	Escribir "Introdueix el nom de l'article: ";
	Leer nom
	Escribir "Introdueix el preu original: ";
	Leer preuOriginal
	Escribir "Introdueix el codi de descompte: ";
	Leer codiDescompte;
	
	Segun codiDescompte Hacer
		1: descompte <- preuOriginal * 0.10;
		2: descompte <- preuOriginal * 0.15;
                3: descompte <- preuOriginal * 0.20;
		De Otro Modo: descompte <- 0;
	FinSegun
	
	preuFinal <- preuOriginal - descompte;
	
	Escribir "Article: ", nom
	Escribir "Preu original: ", preuOriginal
	Escribir "Descompte: ", descompte
	Escribir "Preu final: ", preuFinal

FinProceso

6. Utilitzant l'estructura Segun ..., fes un algorisme en pseudocodi per calcular l'àrea de qualsevol de les següents figures geomètriques: Quadrat, Rectangle, Triangle i Cercle.

Proceso Area

        Definir figura Como Cadena; 
        Definir area, costat, ample, llarg, base, alçada, radi Como Real;
	
	Escribir "Escull la figura geomètrica"
	Escribir "Quadrat , Rectangle , Triangle , Cercle"
	Leer figura 
	
	Segun figura Hacer
		"Quadrat" : 
			Escribir "Introdueix la mida d'un costat del quadrat"
			Leer costat
			area <- costat * costat
			
		"Rectangle" :
			Escribir "Introdueix l'ample del rectangle"
			Leer ample
			Escribir "Introdueix el llarg del rectangle"
			Leer llarg
			area <- ample * llarg
			
		"Triangle" :
			Escribir "Introdueix la alçada del triangle";
			Leer alçada;
			Escribir "Introdueix la base del triangle";
			Leer base;
			area <- (base * alçada) / 2;
			
		"Cercle" :
			Escribir "Ingrese el radio del circulo";
			Leer radi:
			area <- PI * radi * radi;
	FinSegun
	
	Escribir "l'àrea de la figura és: " , area;	

FinProceso

Exercicis estructura repetitiva

Para

1. Crea una algorisme amb pseudocodi que demani un número i calculi el seu factorial (El factorial d'un nombre és el producte de tots els enters entre 1 i el mateix nombre i es representa pel nombre seguit d'un signe d'exclamació. Per exemple 5! = 1x2x3x4x5=120)

Anàlisi
Necessito acumular les successives multiplicacions, començant per 2 fins al número indicat.
Dades d'entrada: número per calcular el factorial comptador per in comptant els números des de 2 al nombre.
Informació de sortida: El resultat del factorial
Variables: num, comptador (enter), resultat (real)
Disseny
1. Llegir nombre
2. Inicialitza variables: resultat = 1
3. Per a comptador=2 fins num
4. resultat=resultat*comptador
5. Mostrar resultat
Proceso Factorial
	Definir num,comptador como Entero;
	Definir resultat como Real;
	resultat <- 1;
	Escribir Sin Saltar "Digue'm un número:";
	Leer num;
	Para comptador<-2 Hasta num Hacer
		resultat <- resultat * comptador;
	FinPara
	Escribir "El resultat és", resultat;
FinProceso

2. Feu un algorisme que imprimeixi tots els números parells entre dos números que se li demanin a l'usuari.

Anàlisi
Llegim un nombre. Si és senar, li sumo 1 i ja és parell. Llegim el segon número.
Escric el número des del primer fins al segon de dos en dos.
Dades d'entrada: dos números
Informació de sortida: Els nombres parells que hi ha entre els dos anteriors
Variables: num, num1, num2 (enter)
Disseny
1. Llegir num1,num2
2. Si num1 és senar -> num1=num1+1
3. Des de num1 fins a num2 de 2 en 2
4. Escriure el número
Proceso NumerosParells
	Definir num,num1,num2 Como Entero;
	Escribir Sin Saltar "Introdueix el número 1:";
	Leer num1;
	Escribir Sin Saltar "Introdueix el número 2:";
	Leer num2;
	Si num1 % 2 = 1 Entonces
		num1<-num1+1;
	FinSi
	Para num<-num1 Hasta num2 Con Paso 2 Hacer
			Escribir Sin Salta saltar num," ";
	FinPara
FinProceso

3. Realitzar un algorisme que demani números (es demanarà per teclat la quantitat de números a introduir). El programa ha d'informar de quants números introduïts són més grans que 0, menors que 0 i iguals a 0.

Anàlisi
Es demana la quantitat de números que es llegiran. Anem introduint números.
Hem de comptar els positius, negatius i zeros.
Dades d'entrada: Quantitat de números, els números.
Informació de sortida: Quantitat de positius, de negatius i de zeros.
Variables: quantitat_num,num,cont_positius,cont_negatius,cont_zeros(enters)
Disseny
1. Inicialitzo els comptadors
2. Llegir quantitat de números
3. Des d'1 fins a quantitat de números
4. Llegir num
5. Si num> 0-> increment cont_positius
6. Si num< 0-> increment cont_negatius
7. Si num = 0-> increment cont_zeros.
8Mostra cont_postius, cont_negatius, cont_zeros
Proceso ComptarNumerosPositiusNegatiusIZeros
	Definir num Como Entero;
	Definir quantitat_num,i Como Entero;
	Definir cont_negatius,cont_positius,cont_zeros omo Entero;
	cont_negatius <- 0;
	cont_positius <- 0;
	cont_zeros <- 0;
	Escribir "Quants números introduiràs?:";
	Leer quantitat_num;
	Para a i<-1 Hasta quantitat_num Hacer
		Escribir "Nombre ",i,":" ;
		Leer num;
		Si num>0 Entonces
			cont_positius <- cont_positius + 1;
		SiNo
			Si num<0 Entonces
				cont_negatius <- cont_negatius + 1;
			Sinó
				cont_zeros <- cont_zeros + 1;
			FinSi
		FinSi
	FinPara
	Escribir "Números positius:",cont_positius;
	Escribir "Números negatius:",cont_negatius;
	Escribir "Nombre igual a 0:",cont_zeros;
FinProceso

4. Feu un algorisme que mostri la taula de multiplicar d'un número introduït per teclat.

Anàlisi
Llegim el número del que volem mostrar la taula
Necessitem un comptador per comptar d'1 a 10
.Hem de repetir 10 vegades -> A cada volta hem de mostrar: el comptador * el número = resultat de la multiplicació
Dades d'entrada: El número de la taula i un comptador d'1 a 10.
Informació de sortida: Les 10 operacions de la taula de multiplicació
Variables: taula,num (enters)
Disseny
1. Llegir taula
2. Des de nombre d'1 a 10
3. Mostrar num * taula = (num*taula)
Proceso TaulaMultiplicar
	Definir taula i Como Entero;
	Escribir Sin Saltar "De quin número vols mostrar la taula de multiplicar?:";
	Leer taula;
	Para num<-1 Hasta 10 Hacer
		Escribir num," * ",taula," = ",num*taula;
	FinPara
FinProceso

5. Feu un algorisme que mostri les taules de multiplicar del 1 al 10.

Anàlisi
He de repetir 10 vegades (des del número 1 fins al 10) mostrar la taula de multiplicar d'aquest número.
Com hem vist en l'exercici 4, per fer una taula de multiplicar hem de repetir 10 vegades per mostrar cada línia de la taula.
Per tant necessito dos bucles imbricats.
Dades d'entrada: Res
Informació de sortida: Les deu taules de multiplicar
Variables: taula,num (enters)
Disseny
1. Per a taula des d'1 fins a 10
2. Per num des d'1 fins a 10
3. Mostrar taula * num = (taula*num)
Proceso TaulesDeMultiplicar
	Definir taula,num Como Entero;
	Para taula<-1 Hasta 10 Hacer
		Para num<-1 Hasta 10 Hacer
			Escribir taula," * ",num," = ", taula*num;
		FinPara
		Esperar Tecla;
	FinPara
FinProceso

6. Una empresa té el registre de les hores que treballa diàriament un empleat durant la setmana (sis dies) i requereix determinar-ne el total, així com el sou que rebrà per les hores treballades.

Anàlisi
Calcular el sou i les hores treballades dun empleat en una setmana (6 dies).
Cal anar introduint la quantitat d'hores que treballa cada dia.
Hem de saber quant es paga l'hora treballada.
Cal anar acumulant les hores treballades cada dia, per poder calcular el sou.
Dades d'entrada: Sou per hora, hores.
Informació de sortida: Les hores acumulades, i el sou de la setmana.
Variables: sou_per_hora (Real),hores, hores_acum, dia(enter)
Disseny
1.- Inicialitzo les hores acumulades
2.- Llegir sou per hora (sou)
3.- Des del dia 1 al 6
4.- Llegir hores treballades
5.- Acumular les hores treballades
6.- Mostrar Les hores acumulades
7.- Mostrar el sou -> hores acumulades * sou per hora
Proceso CalcularSou
	Definir sou_per_hora Como Real;
	Definir hores, hores_acum Como a Entero;
	Definir dia Como Entero;
	hores_acum<-0;
	Escribir sin saltar "Introdueix el sou per hora:";
	Leer sou_per_hora;
	Para dia<-1 hasta 6 Hacer
		Escribir "Quantes hores has treballat el dia "dia,"?:";
		Leer hores;
		hores_acum <- hores_acum + hores;
	FinPara
	Escribir "Hores acumulades a la setmana:",hores_acum;
	Escribir "Sou:",sou_per_hora*hores_acum;
FinProceso

7. Una empresa paga als seus empleats amb base a les hores treballades a la setmana.

Realitzeu un algorisme per determinar el sou setmanal de N treballadors i, a més, calculeu quant va pagar l'empresa pels N empleats.
Anàlisi
Cal calcular el sou d'un nombre de treballadors, per tant necessitem el nombre de treballadors que té lempresa. També necessitem saber el sou per hora, i per cada treballador cal demanar les hores que ha treballat a la setmana.
Per cada treballador cal mostrar el sou setmanal i en finalitzar el programa mostrem el total de sous pagats.
Dades d'entrada: Nombre de treballadors, sou per hora, hores treballades per cada treballador.
Informació de sortida: Sou de cada treballador, total pagat.
Variables: hores_per_setmana, hores_acum (enter), sou_per_hora (real), treballadors, treballador (enters)
Disseny
1. Inicialitzo l'acumulador d'hores
2. Llegir el nombre de treballadors
3. Llegir sou per hora
4. Per cada treballador
5. Llegir hores treballades per setmana
6. Mostrar sou (hores_per_setmana*sou_per_hora
7. Acumular hores treballades
8. Mostrar total de pagament (hores_acum*sou_per_hora)
Proceso CalcularSalari
	Definir hores_per_setmana, hores_acum Como Entero;
	Definir sou_per_hora Como Real;
	Definir treballadors, treballador Como Entero;
	hores_acum<-0;
	Escribir Sin Saltar "Quants treballadors té l'empresa?:";
	Leer treballadors;
	Escribir Sin Saltar "Sou per hora:";
	Leer sou_per_hora;
	Para treballador<-1 Hasta treballadors Hacer
		Escribir Sin Saltar "Quantes hores ha treballat el treballador, treballador, ?";
		Leer hores_per_setmana;
		hores_acum<-horas_acum+hores_per_setmana;
		Escribir "El treballador ",treballador," té de sou ",hores_per_setmana*sou_per_hora; 
	FinPara
	Escribir "El pagament als "treballadors," treballadors és: ",hores_acum*sou_per_hora;
FinProceso

Mientras

1, Crea un algoritme amb pseudoci que permeti endevinar un número. L'aplicació genera un número aleatori de l'1 al 100. A continuació va demanant números i va responent si el nombre a endevinar és més gran o més petit que l'introduït, a més dels intents que et queden (tens 10 intents per encertar-ho).

El programa acaba quan s'encerta el número (a més et diu quants intents ho has encertat), si s'arriba al límit d'intents et mostra el número que havia generat.

Anàlisi
Hem de generar un nombre aleatori (funció aleatori) de l'1 al 100.
Necessitem un comptador per comptar els 10 intents. Al principi val 10 i anirà decrementant.
Mentre no encerti el número i em quedin intents:
Llegeixo un número
Ho comparo amb el nombre generat (dic si és més gran o més petit)
Demano un altre nombre
Puc acabar el bucle per dues raons: si he endevinat el número (he guanyat) i mostro els intents que he necessitat.
sinó he perdut, he utilitzat els 10 intents i mostro el número generat.
Dades d'entrada: número demanat a l'usuari.
Informació de sortida: Has guanyat i els intents, o has perdut i el número.
Variables: num_scret, num_ingressat, intents (enters)
Disseny
1. Genero un nombre aleatori de l'1 al 100 (num_secret)
2. intents = 10
3. Llegir num
4. Mentre num<> num_secret i intents>1
5. Si num_screto>num -> Escriure "Molt baix"
6. Si num_screto<num -> Escriure "Molt alt"
7. intents=intents-1
8. Escriure intents
9. Llegir num
10. Si num_secreo=num -> Escriure "Has guanyat", intents
11. SiNo -> Escriure "Has perdut, num_secret
Proceso Adivina_Numero
    Definir intents,num_secret,num_ingressat Como Entero;
    intents <- 10;
    num_secret <- Aleatorio(1,100);
    
    Escribir "Endevineu el nombre (d'1 a 100):";
    Leer num_ingressat
    Mientras num_secret<>num_ingressat Y intents>1 Hacer
        Si num_secret>num_ingressat Entonces
            Escribir "Molt baix";
        Sino 
            Escribir "Molt alt";
        FinSi
        intents <- intents-1;
        Escribir "Li queden ",intents," intents:";
        Leer num_ingressat;
    FinMientras
    
    Si num_secret=num_ingressat Entonces
        Escribir "Exacte! Vostè endevino a ",11-intents," intents.";
    Sino
        Escribir "El nombre era: ",num_secret;
    FinSi
    
FinProceso

2.Algorisme que demani números fins que s'introdueixi un zero. Heu d'imprimir la suma i la mitjana de tots els números introduïts.

Anàlisi
Anem demanant números fins a introduir un 0.
Necessitem un acumulador per anar fent les sumes intermèdies.
A més necessitem un comptador, per calcular la mitjana (suma/quantitat)
Dades d'entrada: números, un acumulador per sumar i un comptador
Informació de sortida: La suma i la mitjana
Variables:num, suma, cont enters)
Disseny
1. Inicialitzat: suma = 0, cont = 0
2. Llegir num
3. Mentre num<>0
4. Acumul: suma = suma + num
5. Conte si num<>0: cont=cont+1
. 6. Llegir num
7. Si cont=0 (No hem introduït cap número)-> mitjana=0
8. SiNo -> mitjana=suma/cont;
9. Mostrar suma i mitjana
Proceso CalcularSumaMitjana
	Definir num Como Entero;
	Definir suma,cont como Entero;
	Definir mitjana Como Real;
	suma <- 0;
	cont <-0;
	//Amb el mentre si el primer número és 0 no entrarà al bucle
	Escribir "Nombre (0 per sortir):"
	Leer num;
	Mientras num<>0 Hacer
		suma <- suma + num;
		cont <- cont + 1;
		Escribir "Nombre (0 per sortir):";
		Leer num;
	FinMientras
	//Si cont=0 no puc fer la divisió
	Si cont>0 Entonces
		mitjana <- suma / cont;
	SiNo
		mitjana <-0;
	FinSi
	
	Escribir "Suma:",suma;
	Escribir "Mitjana:",mitjana;
FinProceso

3. Crea una aplicació que demani un número i calculi el seu factorial (El factorial de un nombre és el producte de tots els enters entre 1 i el mateix nombre i es representa pel nombre seguit d'un signe d'exclamació.

Per exemple 5! = 1x2x3x4x5=120
Anàlisi
Necessito acumular les successives multiplicacions, començant per 2 fins al número indicat.
Dades d'entrada: número per calcular el factorial comptador per in comptant els números des de 2 al nombre
Informació de sortida: El resultat del factorial
Variables: num, comptador (entero), resultat (real)
Disseny
1. Llegir nombre
.2. Inicials variables
comptador = 2
resultat = 1
3. Mentre comptador<=num fer
4. resultat=resultat*comptador
5. comptador=comptador+1
. 6. Mostrar resultat
Proceso Factorial
	Definir num,comptador Como Entero;
	Definir resultat Como Real;
	resultat <- 1;
	Escribir Sin Saltar "Digue'm  un número:";
	Leer num;
	comptador <- 2;
	Mientras comptador<=num Hacer
		resultat <- resultat * comptador;
		comptador <- comptador + 1;
	FinMientras
	Escribir "El resultat és ", resultat;
FinProceso

4. Feu una algorisme amb pseudocodi que digui si un número introduït per teclat és primer o no.

Un nombre primer és aquell que només és divisible entre ell mateix i la unitat.
Nota: N'hi ha prou amb provar fins a l'arrel quadrada del número per veure si és divisible per algun altre número.
Anàlisi
Llegim un número i anem comprovant si és divisible entre 2 fins a l'arrel quadrada del nombre. Si és divisible per algun número no és primer.
Si no és divisible per cap nombre és primer.
Per saber si és divisible fem servir l'operador mòdul.
Dades d'entrada: el número a comprovar si és primer o no
Informació de sortida: Un missatge dient si és primer o no
Variables: numero_es_primer (entero), num (entero) comptador des de 2 fins arrel quadrada del num_es_primer, es_primer (lógico)
Disseny
1. Suposo que el nombre és primer -> és_primer<-Verdadero
2. Llegir num_ces_primer
3. Mentre no final (num < número primer?) i el número primer? no sigui divisible pel num
4. Incrementem el num
5. Si es_primer -> Mostra "És primer"
6. Si no -> Mostra "No és primer"
Proceso EsPrimo
	Definir numero_es_primer,num Como Entero;
	Escribir Sin Saltar "Introdueix un número per comprovar si és primer:";
	Leer numero_es_primer;
        mum <- 2;
	Mientras num<-numero_es_primer Y numero_es_primer % num = 0 Hacer
		num <- num +1;
	FinMientras
	Si num = numero_es_primer Entonces
		Escribir "És Primer";
	SiNo
		Escribir "No és Primer";
	FinSi
FinProceso

5. Escriviu un algoritme amb pseudocodi que demani el límit inferior i superior d'un interval.

Si el límit inferior és més gran que el superior ho ha de tornar a demanar.
A continuació es van introduint números fins que introduïm el 0.
Quan acabi el programa donarà les informacions següents:
  • La suma dels números que estan dins de l'interval (interval obert).
  • Quants números estan fora de l'interval.
  • He informat si hem introduït algun nombre igual als límits de l'interval.
Anàlisi
Demanem un interval (límit inferior i superior)
Ens hem d'assegurar que el límit inferior sigui menor que el superior.
Es van demanant números fins que s'introdueixi el 0.
Si el nombre pertany a l'interval -> ho vaig sumant (necessito un acumulador)
Si el número no pertany a l'interval, ho explico (necessito un comptador)
Si el nombre és igual a algun límit, allò índic (necessito un indicador)
Al final mostro la suma dels números que pertanyen a l'interval.
Mostreu el comptador de número que no pertanyen a l'interval.
Indico si hem introduït un número igual a algun límit
Dades d'entrada: límit superior i inferior de l'interval i els números.
Informació de sortida: La suma dels que pertanyen a l'interval, el comptador dels números que no pertanyen a l'interval i indico si un nombre ha estat igual a algun interval
Variables: lim_inf, lim_sup, num, suma_dins_interval, cont_fora_interval (enters), igual_limits (Lògic)
Diseny
1. Inicialitzo l'acumulador, el comptador i l'indicat
2. Repetir -> llegir lim_inf i lim_sup fins que lim_inf<lim_sup
3. Llegir núm
4. Mentre num sigui diferent de 0
5. Si num pertany a l'interval -> acumula la suma
6. Sinó -> increment comptador
7. Si és igual a algun interval -> Ho indico (indicador a cert)
8. Llegir núm
9. Mostra la suma dels números pertanyents a l'interval
10. Mostra el comptador de números no pertanyents a l'interval
11. Si l'indicador = Veritable -> Mostra "Un nombre = a interval"
12. SiNo -> Mostra "No has introduït un número igual a l'interval


Proceso Interval
	Definir lim_inf, lim_sup como Entero;
	Definir num como Entero;
	Definir suma_dins_interval Como Entero;
	Definir cont_fora_interval Como Entero;
	Definir igual_limits Como Logico;
	suma_dins_interval <- 0;
	cont_fora_interval <- 0;
	igual_limits <- Falso;
	//M'asseguro que el lim_inf és menor que el lim_sup
	Repetir
		Escribir "Introdueix el límit inferior de l'interval:";
		Leer lim_inf;
		Escribir "Introdueix el límit superior de l'interval:";
		Leer lim_sup;
		Si lim_inf>lim_sup Entonces
			Escribir "ERROR: El límit inferior ha de ser menor que el superior.";
		FinSi
	Hasta Que lim_inf<=lim_sup;
	
	Escribir Sin Saltar "Introdueix un número (0, per sortir):";
	Leer num;
	Mientras num<>0 Hacer
		//Pertany a l'interval
		Si num>lim_inf Y num<lim_sup Entonces
			suma_dins_interval<- suma_dins_interval + num;
		SiNo
			//No pertany a l'interval
			cont_fora_interval <- cont_fuera_intervalo + 1;
		FinSi
		//Nombre igual a algun dels límits
		Si num=lim_inf O num=lim_sup Entonces
			igual_limits <- Verdadero;
		FinSi
		Escribir Sin Saltar "Introdueix un número (0, per sortir):";
		Leer num;
	FinMientras
	Escribir "La suma dels números dins de l'interval és ",suma_dins_interval;
	Escribir "La quantitat de números fora de l'interval és ",cont_fora_interval;
	Si igual_limits Entonces
		Escribir "S'ha introduït algun nombre igual als límits de l'interval.";
	SiNo
		Escribir "No s'ha introduït cap número igual als límits de l'interval.";
	FinSi
FinProceso



Exercicis prova

Prova 1

1. Demana un número enter positiu per teclat. Si el número és senar, el multipliquem per 3 i li sumem 1, si és parell el dividim per 2. Repetim aquest procés amb el nou valor acabant quan el número és 1. Per exemple, la següent seqüència és generada quan N=22:

22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

Fes un programa que fent aquests passos ens digui la quantitat de números generats fins a aconseguir arribar a l'1. A l'exemple anterior seria 16.

Proceso TresN
	Definir num, cont Como Entero;

	Escribir "Escriu un numero enter i positiu: "
        
        Leer num;
	
        Si num > 0  Entonces 
            cont <- 1;

            Mientras num != 1 Hacer
                Si num % 2 = 0 Entonces
                    num <- num / 2;
                SiNo 
                    num <- (num * 3) + 1;
                
                cont <- cont + 1;
                Escribir Sin Saltar num, " ";
            FinMientras

            Escribir "Ha donat ",cont," voltes.";
        SiNo
            Escribir "El número ha de ser positiu!!");
        
FinProceso

2. Llegirem dos números que representaran una data, el primer representa el dia i el segon representa el mes. Cal dir quina data serà després de cinc dies (suposarem que febrer té sempre 28 dies)

Exemples:

Entrada: 28 3 Sortida: 2/4
Entrada: 27 12 Sortida: 1/1
Entrada: 26 2 Sortida: 2/3
Proceso Data
	Definir dia, mes, diesPerMes, diaSeguent, mesSeguent Como Entero;
 
	Escribir "Introdueix el dia: ";
        Leer dia;
	Escribir "Introdueix el mes: ";
        Leer mes;
	
        diesPerMes <- 0;

        Segun Mes Hacer
            1, 3, 5, 7, 8, 10, 12: diesPerMes <- 31;
            4, 6, 9, 11: diesPerMes <- 30;
            2: diesPerMes <- 28;
        FinSegun

        diaSeguent <- dia+5;
        
        Si diaSeguent>diesPerMes Entonces
            diaSeguent <- diaSeguent-diesPerMes;
            mes <-- mes + 1;
            Si mes>12 Entonces
                mes <-- 1;
            FinSi
        FinSi

        Escribir diaSeguent, " ", mes;

FinProceso

3. Donat un missatge secret de 10000 caràcters cal saber si dins aquest missatge apareix la seqüència “XY” (els dos caràcters seguits). Només cal dir si apareix o si no apareix.

Proceso XY
	Definir carActual, carAnterior Como Caracter;
        Definir cont Como Entero;
 
	carAnterior=" ";
	Escribir "Introdueix un caràcter: ";
        Leer carActual;
	
        cont <- 1;
            
        Mientras (cont < 10000 && (carAnterior != 'X' O carActual != 'Y')) Hacer
                
            carAnterior = carActual;
	    Escribir "Introdueix un caràcter: ";
            Leer carActual;
            cont <- cont + 1;

        FinMientras

	Si (carAnterior != 'X' Y carActual != 'Y') Entonces
		Escribir "Apareix la seqüència XY";
	SiNo
		Escribir "No apareix la seqüència XY";
	FinSi
     
FinProceso

4. Donat un número entrat per teclat cal escriure el primer divisor d’aquest número. Aquest ha de ser diferent de 1 i del mateix número. Si no hi hagués cap, sortirà un missatge que informi d'això.

Proceso Divisor
        Definir divisor, numero Como Entero;

	Escribir "Introdueix el número: ";
        Leer numero;
	
        divisor <- 2;
            
        Mientras (divisor < numero Y numero % divisor != 0) Hacer
                
            divisor <- divisor + 1;

        FinMientras

	Si divisor = numero Entonces
	    Escribir "No té cap divisor";
	SiNo
	    Escribir "El primer divisor és: ", divisor;
	FinSi
     
FinProceso


5. Una línia horitzontal la definim per les dues coordenades x dels dos extrems. Un punt es troba a la mateixa línia horitzontal i s'estableix amb la seva coordenada x.

El programa llegirà tres números, els dos primers seran els extrems de la línia (no tenen perquè estar ordenats) i el tercer serà la coordenada del punt. El programa ha de respondre si el punt està dins la línia i la distància a l’extrem més proper.

Exemples:

Entrada: 10 5 7
5        7            10
|--------o------------|
Sortida: Dins. Distància 2
Entrada: 8 10 5
5             8        10
o------------|--------|
Sortida: Fora. Distància 3
Proceso Divisor
        Definir x1, x2, punt, min, max, distanciaDreta, distanciaEsquerra  Como Entero;

	Escribir "Introdueix la primera coordenada de la línia: ";
        Leer x1;
	Escribir "Introdueix la segona coordenada de la línia: ";
        Leer x2;
	Escribir "Introdueix el punt: ";
        Leer punt;
	
	Si x1 < x2 Entonces
           min <- x1;
           max <- x2;
	SiNo
           min <- x2;
           max <- x1;
	FinSi

        distanciaDreta = max - punt;  
        Si (distanciaDreta < 0) Entonces
            distanciaDreta = distanciaDreta * -1;
        FinSi

        distanciaEsquerra = min - punt;
        Si (distanciaEsquerra < 0) Entonces
            distanciaEsquerra = distanciaEsquerra * -1;
        FinSi

        Si (punt >= min Y punt <= max) {
            Escribir "Dins";
        SiNo
            Escribir "Fora";
        FinSi

        Si (distanciaEsquerra <= distanciaDreta) {
            Escribir "Distància: ", distanciaEsquerra;
        SiNo
            Escribir "Distància: ", distanciaDreta;
        FinSi
      
     
FinProceso


Prova 2

1. Càlcul de nòmines en una empresa

En una empresa, hi ha tres tipus de treballadors: administratius, operaris i directius. Cada tipus de treballador té una tarifa horària diferent: els administratius cobren 12 € per hora, els operaris 15 € per hora i els directius 25 € per hora. A més, els directius reben un bonus fix de 500 € si treballen més de 160 hores mensuals. També es consideren els dies de baixa durant el mes, aplicant una penalització del 10% al sou final si aquests superen els cinc dies.

Dissenya un programa que llegeixi contínuament el tipus de treballador, el nombre d'hores treballades i els dies de baixa, calculi el sou corresponent i indiqui si s'ha aplicat alguna penalització.

El programa finalitzarà quan s'introdueixi un tipus de treballador no vàlid o bé un valor de sortida especificat.

Proceso CalculNomines
	Definir tipus, hores, diesBaixa, sou Como Entero;

	Escribir "Introdueix el tipus de treballador (1=Administratiu, 2=Operari, 3=Directiu, 0 per sortir):";
	Leer tipus;

	Mientras tipus <> 0 Hacer
    	   Si tipus < 1 O tipus > 3 Entonces
        	Escribir "Tipus no vàlid. Torna a intentar-ho.";
    	   Sino
        	Escribir "Introdueix el nombre d'hores treballades:";
        	Leer hores;
        	Escribir "Introdueix el nombre de dies de baixa:";
        	Leer diesBaixa;

        	Segun tipus Hacer
            	1:
                	sou <- hores * 12;
            	2:
                	sou <- hores * 15;
            	3:
                	sou <- hores * 25;
                	Si hores > 160 Entonces
                    	   sou <- sou + 500;
                	FinSi
        	FinSegun

        	Si diesBaixa > 5 Entonces
            	   sou <- sou * 0.9;
            	   Escribir "Penalització aplicada per dies de baixa.";
        	FinSi

        	Escribir "El sou del treballador és:", sou, "€";
    	   FinSi

    	   Escribir "Introdueix el tipus de treballador (1=Administratiu, 2=Operari, 3=Directiu, 0 per sortir):";
    	   Leer tipus;
	FinMientras        
FinProceso

2. Control de passatgers en un aeroport

Un aeroport vol gestionar la informació sobre els passatgers dels seus vols, diferenciant entre passatgers nacionals i internacionals. Es tracta de dissenyar un programa que permeti introduir el codi de cada vol, el nombre de passatgers nacionals i internacionals, i que calculi el total de passatgers del vol i el percentatge de passatgers internacionals. A més, el programa ha de ser capaç de determinar quin vol té el percentatge més alt de passatgers internacionals entre tots els registrats.

El programa s'ha de repetir per diversos vols fins que es detecti un codi de vol de sortida especificat.

Proceso ControlPassatgers
        Definir codiVol, nacionals, internacionals, total, volMaxInternacionals Como Entero;
	Definir percentatgeInternacionals, maxPercentatge Como Real
	maxPercentatge <- 0;
	volMaxInternacionals <- 0;

	Escribir "Introdueix el codi del vol (0 per acabar):";
	Leer codiVol;

	Mientras codiVol <> 0 Hacer
    	   Escribir "Introdueix el nombre de passatgers nacionals:";
    	   Leer nacionals;
    	   Escribir "Introdueix el nombre de passatgers internacionals:";
    	   Leer internacionals;

    	   total <- nacionals + internacionals;
    	   Escribir "El vol", codiVol, "té un total de", total, "passatgers.";

    	   Si total > 0 Entonces
        	percentatgeInternacionals <- (internacionals / total) * 100;
        	Escribir "Percentatge de passatgers internacionals:", percentatgeInternacionals, "%";

        	Si percentatgeInternacionals > maxPercentatge Entonces
            	   maxPercentatge <- percentatgeInternacionals;
            	   volMaxInternacionals <- codiVol;
        	FinSi
    	   Sino
        	Escribir "El vol no té passatgers.";
    	   FinSi

    	   Escribir "Introdueix el codi del vol (0 per acabar):";
    	   Leer codiVol;
	FinMientras

	Escribir "El vol amb més percentatge de passatgers internacionals és el vol", volMaxInternacionals, "amb un", maxPercentatge, "% de passatgers internacionals.";
FinProceso

3. Seguiment d'atletes en una competició

En una competició d’atletisme, es volen analitzar els resultats de diversos atletes. Cada atleta participa en tres curses i es registra el temps (en segons) de cadascuna. Es necessita un programa que, per a cada atleta, llegeixi el número de dorsal i els temps de les tres curses, calculi la mitjana dels temps i indiqui si ha superat els 10 segons de mitjana o no. A més, el programa ha de mantenir un registre del dorsal de l'atleta amb la millor mitjana i el de l'atleta amb la pitjor mitjana.

La introducció de dades continuarà fins que s'introdueixi un número de dorsal específic per finalitzar.

Proceso SeguimentAtletisme
        Definir dorsal, temps1, temps2, temps3, millorDorsal, pitjorDorsal Como Entero;
	Definir millorMitjana, pitjorMitjana, mitjana Como Real;
	millorMitjana <- 999999;
	pitjorMitjana <- 0;

	Escribir "Introdueix el dorsal de l'atleta (-1 per acabar):";
	Leer dorsal;

	Mientras dorsal <> -1 Hacer
    	   Escribir "Introdueix el temps de la primera cursa:";
    	   Leer temps1;
    	   Escribir "Introdueix el temps de la segona cursa:";
    	   Leer temps2;
    	   Escribir "Introdueix el temps de la tercera cursa:";
    	   Leer temps3;

       	   mitjana <- (temps1 + temps2 + temps3) / 3;
    	   Escribir "La mitjana de temps per l'atleta amb dorsal", dorsal, "és:", mitjana, "segons.";
    	   Si mitjana < millorMitjana Entonces
        	millorMitjana <- mitjana;
        	millorDorsal <- dorsal;
     	   FinSi

    	   Si mitjana > pitjorMitjana Entonces
        	pitjorMitjana <- mitjana;
        	pitjorDorsal <- dorsal;
    	   FinSi

    	   Si mitjana > 10 Entonces
        	Escribir "L'atleta amb dorsal", dorsal, "no ha superat els 10 segons.";
    	   Sino
        	Escribir "L'atleta amb dorsal", dorsal, "ha superat els 10 segons.";
    	   FinSi

    	   Escribir "Introdueix el dorsal de l'atleta (-1 per acabar):";
    	   Leer dorsal;
	FinMientras

	Escribir "L'atleta amb millor mitjana és el dorsal", millorDorsal, "amb una mitjana de", millorMitjana, "segons.";
	Escribir "L'atleta amb pitjor mitjana és el dorsal", pitjorDorsal, "amb una mitjana de", pitjorMitjana, "segons.";
FinProceso

Exercicis Arrays

1. Realitzar un programa que defineixi un vector anomenat "vector_numeros" de 10 enters, a continuació ho inicialitzi amb valors aleatoris (de l'1 al 10) i posteriorment mostri en pantalla cada element del vector juntament amb el seu quadrat i el seu cub.

Proceso QuadratCubVector
	Definir vector_numeros Como Entero;
	Dimension vector_numeros[10];
	Definir index Como Entero;
	//Primer recorregut per llegir el vector
	Para index<-0 hasta 9 hacer
		vector_numeros[index]<-aleatorio(1,10);
	FinPara
	//Segon recorregut per mostrar el resultat
	Para index<-0 hasta 9 hacer
		Escribir vector_numeros[index]," ",vector_numeros[index]^2," ",vector_numeros[index]^3;
	FinPara
FinProceso

2. Crear un vector de 5 elements de cadenes de caràcters, inicialitza el vector amb dades llegides pel teclat. Copia els elements del vector en un altre vector però en ordre invers, i mostra-ho per la pantalla.

Anàlisi

Recorro el vector1 i llegeixo els seus elements per teclat. recorro de forma inversa el vector1 i vaig guardant els elements al vector2 (s'inverteixen).
Recorro el vector2 per mostrar els elements.
Dades d'entrada: 5 cadenes de caràcters
Informació de sortida: Les cinc cadena però mostrar donin ordre invers.
Variables:
vector1,vector2 (vector de 5 cadenes)
tam_vector1,tam_vector2(enter)
indicador1, indicador2 (enter)
Proceso VectorInvers
	Definir vector1,vector2 Como Cadenas;
	Dimension vector1[5],vector2[5];
	Definir indicador1,indicador2 Como Entero;
	Definir tam_vector1,tam_vector2 Como Entero;
	//Defineixo la mida dels vectors per utilitzar-los en els recorreguts
	tam_vector1<-5;
	tam_vector2<-5;
	//RRecorro el vector1 i llegeixo cada element per teclat
	Para indicador1<-0 hasta tam_vector1-1 hacer
		Escribir Sin Saltar "Dóna'm la cadena ",indicador1+1,":";
		Leer vector1[indicador1];
	FinPara
	
	indicador2<-0;
	//Recorro el vector1 des del final al principi
	//Cada element el guardo al vector2
	Para indicador1<-tam_vector1-1 hasta 0 con paso -1 hacer
		vector2[indicador2]<-vector1[indicador1];
		indicador2<-indicador2+1;
	FinPara
	//Recorro el vector2 per mostrar-lo
	Para indicador2<-0 hasta tam_vector2-1 hacer
		Escribir "La cadena ",indicador2+1,": ",vector2[indicador2];
	FinPara
FinProceso

3. Es vol realitzar un programa que llegeixi per teclat les 5 notes obtingudes per un alumne (compreses entre 0 i 10). A continuació indiqui la nota mitjana, la nota més alta que ha tret i la menor.

Anàlisi

Llegeixo 5 notes (valido que siguin >=0 i <=10). guardant-les en un vector.
Recorro de nou el vector per acumular les notes, calcular la nota màxima i la nota mínima.
Finalment calculo la mitjana i mostro els valors.
Dades d'entrada: 5 notes
Informació de sortida: Les notes, la nota mitjana, nota màxima i nota mínima.
Variables:
notes (vector de 10 enters)
tam_notes,index(enter)
nota_mitjana (real), suma, nota_max, nota_min (enter)
Proceso VectorNotes
	Definir notes Como Entero;
	Dimension notes[5];
	Definir tam_notes como Entero;
	Definir nota_mitjana Como Real;
	Definir suma,nota_max,nota_min como Entero;
	Definir index Como Entero;
	
	tam_notas<-5;
	Para index<-0 hasta tam_notas-1 hacer
		//Comprovem que sigui un nombre >=0 i <=10
		Repetir
			Escribir sin saltar "Introdueix la nota ",index+1,": ";
			Leer notes[index];
		Hasta Que notes[index]>=0 Y notes[index]<=10;
	FinPara
	//Suposo que la nota màxima i la mínima és aquesta primera
	nota_max<-notas[0];
	nota_min<-notas[0];
	
	suma<-0;
	Para index<-0 hasta tam_notas-1 hacer
		//Acumulo la nota per calcular la mitjana
		suma<-suma+notes[index];
		//Actualitzo la nota màxima si en trobo una de més gran
		Si notes[index]>nota_max Entonces
				nota_max<-notes[index];
		FinSi
		//Actualitzo la nota mínima si en trobo una de més petita
		Si notes[index]<nota_min Entonces
			nota_min<-notes[index];
		FinSi
	FinPara
	//Calculo la mitjana, tenint en compte la mida del vector
	nota_mitjana<-suma/tam_notas;
	//Mostro resultats
	Escribir "";
	Escribir sin Saltar "Notes:";
	Para index<-0 hasta tam_notas-1 hacer
		Escribir sin Saltar notes[index]," ";
	FinPara
	Escribir "";
	Escribir "Nota mitjana: ",nota_mitjana;
	Escribir "Nota màxima: ",nota_max;
	Escribir "Nota mínima: ",nota_min;
FinProceso

4. Programa que declari un vector de deu elements enters i demani números per omplir-lo fins que s'ompli el vector o s'introdueixi un número negatiu. Llavors cal imprimir el vector (només els elements introduïts).

Anàlisi

Recorro el vector i vaig inicialitzant els seus elements. Si introdueixo un número negatiu sortim del bucle. També acabo el bucle si introdueixo tots els elements de vector. El número negatiu em serveix d'indicador de fins a quina posició el vector té elements.
Recorro fins a la mida del vector o trobi un número negatiu per mostrar els elements del vector.
Dades d'entrada: Llegeixo nombre positius i els guardo al vector, fins que llegiu un nombre negatiu o llegiu tots els elements del vector.
Informació de sortida: Els elements (números positius) guardats al vector.
Variables:
vector (vector de 10 enters)
tam_vector,indice,num enter)
Proceso VectorPositiu
	Definir vector Como Entero;
	Dimension vector[10];
	Definir tam_vector,index,num como Entero;
	index<-0;
	tam_vector<-10;
	//Recorro el vector i vaig inicialitzant els seus elements
	//No faig servir un para, perquè si introdueixo un nombre negatiu sortim del bucle
	//També acabo el bucle si introdueixo tots els elements de vector
	//El nombre negatiu em serveix d'indicador que fins a aquesta posició el vector té element
	Repetir
		Escribir Sin Saltar "Introdueix un número al vector. Número ",index+1;
		Leer vector[index];
		index<-index+1;
	Hasta Que index=tam_vector O vector[index-1]<0;
	index<-0;
	//Recorro fins a la mida del vector o trobi un nombre negatiu
	Escribir "Elements del vector";
	Mientras index<tam_vector-1 Y vector[index]>=0 Hacer
		Escribir sin saltar vector[index]," ";
		index<-index+1;
	FinMientras
FinProceso

5.Fer un programa que inicialitzi un vector de números amb valors aleatoris, i posterior ordeneu els elements de menor a major.

Anàlisi

Inicialitzo el vector amb valors aleatoris. Vaig recorrent el vector e intercanvio els valors de dos elements consecutius si no estan ordenats.
Cada vegada que faig un intercanvi ho compatibilitzo, aquest procés ho repeteixo fins que no hagi fet cap canvi, el vector està ordenat.
Dades d'entrada: Res
Informació de sortida: Números del vector ordenat.
Variables:
vector (vector de 10 enters)
tam_vector,index,aux,canvis (enter)
Proceso OrdenarVector
	Definir vector Como Entero;
	Dimension vector[10];
	Definir canvis,aux Como Entero;
	Definir index Como Entero;
	Definir tam_vector Como Entero;
	tam_vector<-10;
	//Inicialitzo el vector amb valors aleatoris
	Para index<-0 hasta tam_vector-1 hacer
		vector[index]<-aleatorio(1,10);
	FinPara
	//Repetiré l'ordenació fins que no hagi canviat cap número
	Repetir 
		canvis<-0;
		//Recorre fins a l'antepenúltim
		//Intercanvio els valors de dos elements consecutius si no estan ordenats
		Para index<-0 hasta tam_vector-2 Hacer
			Si vector[index]>vector[index+1] Entonces
				aux<-vector[index];
				vector[index]<-vector[index+1];
				vector[index+1]<-aux;
				canvis<-canvis+1;
			FinSi
		FinPara
	Hasta Que canvis=0;
	//Recorro el vector ordenat
	Para index<-0 hasta tam_vector-1 Hacer
		Escribir Sin Saltar vector[index]," ";
	FinPara
FinProceso

6. Crea un programa que demani un número de mes a l'usuari (per exemple, el 4) i indiqui quants dies té (per exemple, 30) i el nom del mes.

Has de fer servir un vector. Per simplificar-ho suposarem que el febrer té 28 dies.

Anàlisi

Guardo en un vector de 12 posicions els dies corresponents a cada mes.
De la mateixa manera guardo en un altre vector els noms dels mesos
Llegeixo el número d'un mes (Comprovo que sigui entre 1 a 12) i faig coincidir el número del mes amb l'índex dels vectors.
Dades d'entrada: Número del mes
Informació de sortida: Dies i nom del mes.
Variables:
dies (vector de 12 enters)
nom_mes (vector de 12 cadenes),
mes (enter)
Proceso DiesDelMes
	Definir dies Como Entero;
	Dimension dies[12];
	Definir nom_mes Como Caracter;
	Dimension nom_mes[12];
	Definir mes como Entero;
	dies[0]<-31;
	dies[1]<-28;
	dies[2]<-31;
	dies[3]<-30;
	dies[4]<-31;
	dies[5]<-30;
	dies[6]<-31;
	dies[7]<-31;
	dies[8]<-30;
	dies[9]<-31;
	dies[10]<-30;
	dies[11]<-31;
	nom_mes[0]<-"Gener";
	nom_mes[1]<-"Febrer";
	nom_mes[2]<-"Març";
	nom_mes[3]<-"Abril";
	nom_mes[4]<-"Maig";
	nom_mes[5]<-"Juny";
	nom_mes[6]<-"Juliol";
	nom_mes[7]<-"Agost";
	nom_mes[8]<-"Setembre";
	nom_mes[9]<-"Octubre";
	nom_mes[10]<-"Novembre";
	nom_mes[11]<-"Desembre";
	
	Repetir
		Escribir Sin Saltar "Introdueix un mes  (1-12):";
		Leer mes;
		Si mes < 1 o mes > 12 Entonces
			Escribir "Error: mes incorrecte.";
		FinSi
	Hasta Que mes>=1 y mes<=12;
	Escribir "El mes de ",nom_mes[mes-1]," té ",dies[mes-1]," dies.";
FinProceso

7. Programa que declari tres vectors 'vector1', 'vector2' i 'vector3' de cinc enters cadascun, demaneu valors per a 'vector1' i 'vector2' i calculeu vector3=vector1+vector2.

Anàlisi

Omple els elements de dos vectors. Posteriorment els recorro per sumar els valors i desar-lo en un tercer vector.
Dades d'entrada: Números per al primer vector, números per al segon vector
Informació de sortida: Els números del tercer vector, que és la suma dels anteriors
Variables:
vector1,vector2,vector3 (vectors de 5 enters),
índex, tam_vector (enter)
Proceso SumarVectors
	Definir vector1,vector2,vector3 Como Entero;
	Dimension vector1[5],vector2[5],vector3[5];
	Definir tam_vector como Entero;
	tam_vector<-5;
	Definir index Como Entero;
	Para index<-0 hasta tam_vector-1 Hacer
		Escribir Sin Saltar "Introdueix l'element ",index+1," del vector1:";
		Leer vector1[indice];
	FinPara
	Para index<-0 hasta tam_vector-1 Hacer
		Escribir sin Saltar "Introdueix l'element ",index+1," del vector2:";
		Leer vector2[index];
	FinPara
	Para index<-0 hasta tam_vector-1 Hacer
		vector3[index]<-vector1[index]+vector2[index];
	FinPara
	Escribir "La suma dels vectors és:";
	Para index<-0 hasta tam_vector-1 Hacer
		Escribir sin Saltar vector3[index]," ";
	FinPara
FinProceso

8. Volem desar els noms i les edats dels alumnes de curs.

Feu un programa que introdueixi el nom i l'edat de cada alumne.
El procés de lectura de dades acabarà quan s'introdueixi com a nom un asterisc (*)
En finalitzar es mostrarà les dades següents:
  • Tots els alumnes majors d'edat.
  • Els alumnes més grans (els que tenen més edat)

Anàlisi

Inicialitzo els vectors fins que introduïu un "*" o arribi a final del vector.
El * em serveix per indicar el final del vector.
Faig un recorregut per mostrar els alumnes majors d'edat.
Faig un recorregut (fins a trobar un * o arriba al final) per calcular l'edat màxima. A continuació recorro els arrays, i mostro el nom dels alumnes amb més edat.
Dades d'entrada: Nom i edat dels alumnes fins a ficar *.
Informació de sortida: Els alumnes majors d'edat, i els alumnes més grans
Variables:
edat (vector de 30 enters), nom (vector de 30 cadenes)
index, tam_vector, edat_max (enter)
Proceso InformacioAlumnos
	Definir edats Como Entero;
	Dimension edats[30];
	Definir noms Como Caracter;
	Dimension noms[30];
	Definir edat_max como Entero;
	Definir index,tam_vector como Entero;
	index<-0;
	tam_vector<-30;
	//Inicialitzo els vectors fins que introdueixi un "*" o arribi a final del vector
	//El * em serveix per indicar el final del vector
	Repetir
		Escribir Sin Saltar "Digue'm el nom d'un alumne:";
		Leer noms[index];
		Si noms[index]<>"*" Entonces
			Escribir sin saltar "Digue'm la seva edat:";
			Leer edats[index];
		FinSi
		index<-index+1;
	Hasta Que noms[index-1]="*" o index=tam_vector;
	index<-0;
	//Calcular la edat màxima
	//El recorrido es hasta que no encuentre un * y no hayamos llegado al final del vector
	edat_max<-edats[0];
	Mientras index<tam_vector Y noms[index]<>"*"  Hacer
		Si edats[index]>edat_max Entonces
			edat_max<-edats[index];
		FinSi
		index<-index+1;
	FinMientras
	// Alumnes majors d'edat
	index<-0;
	Escribir "Alumnes majors d'edat";
	Escribir "=======================";
	Mientras index<tam_vector Y noms[index]<>"*" Hacer
		Si edats[index]>=18 Entonces
			Escribir noms[index];
		FinSi
		index<-index+1;
	FinMientras
	// Alumnes majors 
	index<-0;
	Escribir "Alumnes majors";
	Escribir "===============";
	Mientras index<tam_vector Y noms[index]<>"*" Hacer
		Si edats[index]=edat_max Entonces
			Escribir noms[index];
		FinSi
		index<-index+1;
	FinMientras
FinProceso

9. Volem guardar la temperatura mínima i màxima de 5 dies.

Realitza un programa que proporcioni la següent informació:
  • La temperatura mitjana de cada dia
  • Els dies amb menys temperatura
  • Es llegeix una temperatura per teclat i es mostren els dies la temperatura dels quals màxima coincideix amb ella.Si no hi ha cap dia es mostra un missatge informatiu.

Anàlisi

Recorro la taula llegint per a cada dia la temperatura màxima i mínima.
Recorro la taula per mostrar la temperatura mitjana de cada dia.
Recorro la taula, per calcular la temperatura mínima, i torno a recórrer per mostrar els dies amb aquesta temperatura.
Per últim demano una temperatura i recorro la taula per mostrar el dia del qual temperatura màxima és igual a la temperatura indicada, o un missatge dient que no hi ha dia amb aquesta temperatura.
Dades d'entrada: Al cap de cinc dies introduïm temperatura màxima i mínima. I al final introduïm una temperatura per cercar els dies amb temperatura màxima.
Informació de sortida: La temperatura mitjana de cada dia, els dies amb temperatura mínima, els dies amb temperatures màxima la indicada per teclat o un missatge informant que no hi ha dies amb aquesta temperatura màxima.
Variables:
temperatura (taula de 5 x 2 enters)
existeix_temperatura (logico)
índex, cant_dies (enter)
temp_max, temp_min (enter)
Proceso Temperatures
	Definir temperatures Como Real;
	Dimension temperatures[5,2];
	Definir existeix_temperatura Como Logico;
	Definir index,cant_dies como Entero;
	Definir temp_max, temp_min como Entero;
	cant_dies<-5;
	//Recorregut per emplenar la taula (5 dies amb temp mínima i màxima)
	Para index<-0 Hasta cant_dies-1 Hacer
		Escribir Sin Saltar "Dia ",(index+1),". Temperatura mínima:";
		Leer temperatures[index,0];
		Escribir Sin Saltar "Dia ",(indice+1),". Temperatura màxima:";
		Leer temperatures[index,1];
	FinPara
	//Mostrar temperatura mitjana
	Escribir "Temperatures mitjanes";
	Escribir "===================";
	Para index<-0 Hasta cant_dies-1 Hacer
		Escribir "Dia ",(index+1),". Temperatura mitjana:",(temperatures[index,0]+temperatures[index,1])/2;
	FinPara
	//Calcular temperatura mínima més petita
	temp_min<-temperatures[0,0];
	Para index<-0 Hasta cant_dies-1 Hacer
		Si temperatures[index,0]<temp_min Entonces
			temp_min<-temperatures[index,0];
		FinSi
	FinPara
	//Mostrar els dies amb menys temperatura
	Escribir "Dies amb menys temperatura";
	Escribir "==========================";
	Para index<-0 Hasta cant_dies-1 Hacer
		Si temperatures[index,0]=temp_min Entonces
			Escribir "Dia ",(index+1);
		FinSi
	FinPara
	//Dies amb temperatura màxima
	existeix_temperatura<-Falso;
	Escribir "Dies amb temperatura màxima";
	Escribir "===========================";
	Escribir sin saltar "Introdueix una temperatura:";
	Leer temp_max;
	Para index<-0 Hasta cant_dies-1 Hacer
		Si temperatures[index,1]=temp_max Entonces
			Escribir "Dia ",(index+1);
			existeix_temperatura<-Verdadero;
		FinSi
	FinPara
	Si no existeix_temperatura Entonces
		Escribir "No hi ha cap dia amb aquesta temperatura.";
	FinSi
FinProceso

10. Dissenyar l'algorisme corresponent a un programa, que:

  • Crea una taula bidimensional de longitud 5x5 i nom 'matriu'.
  • Carrega la taula amb valors numèrics enters.
  • Suma tots els elements de cada fila i tots els elements de cada columna visualitzant els resultats en pantalla.

Anàlisi

Recorro la taula (amb dues per) i vaig llegint els elements de cada fila i columna.
Recorro la taula per files i columnes i vaig acumulant el valor dels elements de cada columna.
Recorro la taula per columnes i files i vaig acumulant el valor dels elements de cada fila.
Dades dentrada: Els elements de la taula.
Informació de sortida: La suma per cada columna, i la suma per cada fila
Variables:
matriu (taula de 5 x 5 enter)
fila, col, num_files, num_cols, suma (enter)
Proceso Tabla
	Definir matriz Como Entero;
	Dimension matriz[5,5];
	Definir fila,col como Entero;
	Definir num_files, num_cols Como Entero;
	Definir suma como Entero;
	num_filas<-5;
	num_cols<-5;
	Para fila<-0 hasta num_files-1 Hacer
		Para col<-0 hasta num_cols-1 Hacer
			Escribir Sin Saltar "Introduïu el número de la fila ",fila+1," i columna ",col+1,":";
			Leer matriz[fila,col];
		FinPara
	FinPara
	//Suma les files
	Para fila<-0 hasta num_files-1 Hacer
		suma<-0;
		Para col<-0 hasta num_cols-1 Hacer
			suma<-suma+ matriz[fila,col];
		FinPara
		Escribir "La suma dels elements de la fila ",fila+1," és ",suma;
	FinPara
	//Suma les columnes
	Para col<-0 hasta num_cols-1 Hacer
		suma<-0;
		Para fila<-0 hasta num_files-1 Hacer
			suma<-suma+ matriz[fila,col];
		FinPara
		Escribir "La suma dels elements de la columna ",col+1," és ",suma;
	FinPara
FinProceso

11. Dissenyar l'algorisme corresponent a un programa, que:

  • Crea una taula bidimensional de longitud 5x5 i nom 'diagonal'.
  • Carrega la taula de manera que els components pertanyents a les diagonals de la matriu prenen el valor 1 i la resta el valor 0.
  • Mostra el contingut de la taula en pantalla.

Anàlisi

Recorro la taula: si l'índex de fila = índex de columna (diagonal principal) o índex de fila = nombre de files - 1 - índex de columnes (l'altra diagonal) guardo un 1 sinó guardo un 0.
Recorro la taula per mostrar-la.
Dades d'entrada: Res
Informació de sortida: Els valors de la taula
Variables:
matriu (taula de 5 x 5 enter)
fila, col, num_files, num_cols (enter)
Proceso Diagonal
	Definir matriz Como Entero;
	Dimension matriz[5,5];
	Definir fila,col como Entero;
	Definir num_files, num_cols Como Entero;
	Definir suma como Entero;
	num_files<-5;
	num_cols<-5;
	//Recorro la taula 
	Para fila<-0 hasta num_files-1 Hacer
		Para col<-0 hasta num_cols-1 Hacer
			//Si estic en alguna diagonal inicialitzo a 1
			Si fila=col o fila=(num_files-1)-col Entonces
				matriz[fila,col]<-1;
			//No estic en diagonal, inicialitzo a 0
			SiNo
				matriz[fila,col]<-0;
			FinSi
			
		FinPara
	FinPara
	//Recorro per mostrar la taula
	Para fila<-0 hasta num_files-1 Hacer
		Para col<-0 hasta num_cols-1 Hacer
			Escribir Sin Saltar matriz[fila,col];
		FinPara
		Escribir "";
	FinPara
	
FinProceso

12. Dissenyar l'algorisme corresponent a un programa, que:

  • Crea una taula bidimensional de longitud 5x15 i nom 'marc'.
  • Carrega la taula amb dos únics valors 0 i 1, on el valor un ocuparà les posicions o elements que delimiten la taula, és a dir, les més externes, mentre que la resta dels elements contindran el valor 0.
  • Visualitza el contingut de la matriu a la pantalla.

Anàlisi

Recorro la taula: si l'índex de fila = 0 (extrem esquerre)
o índex de fila = nombre de files -1 (extrem dret)
o índex de columnes = 0 (extrem superior)
o índex de columnes = de columnes columnes -1 (extrem inferior)
inicialitzo a 1, sinó inicialitzo a 0.
Recorro la taula per files i columnes per mostrar els valors.
Dades d'entrada: Res
Informació de sortida: Els valors de la taula
Variables:
matriu (taula de 5 x 5 enter)
fila, col, num_files, num_cols (enter)
Proceso CostatExtern
	Definir matriz Como Entero;
	Dimension matriz[5,15];
	Definir num_files,num_cols como Entero;
	Definir fila,col como Entero;
	num_files<-5;
	num_cols<-15;
	Para fila<-0 hasta num_files-1 Hacer
		Para col<-0 hasta num_cols-1 Hacer
			//Si estic a l'extrem esquerre, dret, superior o inferior
			Si fila=0 o fila=num_filas-1 o col=0 o col= num_cols-1 Entonces
				//Inicialitzo a 1
				matriz[fila,col]<-1;
			SiNo
				//SiNo inicialitzo a 0
				matriz[fila,col]<-0;
			FinSi
			
		FinPara
	FinPara
	//Recorro per mostrar la taula
	Para fila<-0 hasta num_filas-1 Hacer
		Para col<-0 hasta num_cols-1 Hacer
			Escribir Sin Saltar matriz[fila,col];
		FinPara
		Escribir "";
	FinPara
FinProceso

13. D'una empresa de transport es vol guardar el nom dels conductors que té, i els quilòmetres que condueixen cada dia de la setmana.

Per desar aquesta informació s'utilitzaran dos array:
  • Nom: Vector per guardar els noms dels conductors.
  • kms: Taula per guardar els quilòmetres que fan cada dia de la setmana.
Es vol generar un nou vector ("total_kms") amb els quilòmetres totals que realitza cada conductor.
En finalitzar es mostra la llista amb els noms de conductors i els quilòmetres ha realitzat.

Anàlisi

Llegeixo el nombre de conductors. Nombre de dades que guardaré als arrays
El nombre indicat ha de ser menor que la màxima mida dels arrays
Recorro els vectors fins al nombre de conductors indicats (ho guardo en un vector), llegint el nom i els kms per dies (ho guardo en una taula).
Recorro la taula acumulant els quilòmetres realitzats a la darrera columna de la taula.
Finalment torno a recórrer per mostrar els noms i els km acumulats.
Dades d'entrada: El nombre de conductors, els noms i els kms realitzats per dia
Informació de sortida: Els noms dels conductors i el total de kms realitzats
Variables:
kms (taula de 10 x 8 enters), nom (vector de 10 cadenes)
index_cond, index_dies, num_conductors, tam_conductors_max (enter)
Proceso CalcularKilometres
	Definir nom Como Caracter;
	Dimension nom[10];
	Definir kms Como Entero;
	//8 columnes, les set primeres per guardar els km diaris, i l'última per guardar els km acumulats
	Dimension kms[10,8];
	Definir num_conductores,index_cond,index_dias, tam_conductors_max como Entero;
	Definir dias Como Caracter;
	Dimension dias[7];
	
	tam_conductors_max<-10;
	dias[0]<-"Dilluns";
	dias[1]<-"Dimarts";
	dias[2]<-"Dimecres";
	dias[3]<-"Dijous";
	dias[4]<-"Divendres";
	dias[5]<-"Dissabte";
	dias[6]<-"Diumenge";
	//Llegeixo el nombre de conductors. Nombre de dades que guardaré als arrays
	Repetir
		Escribir sin saltar "Quants conductors té l'empresa?:";
		Leer num_conductors;
		//El nombre indicat ha de ser menor que la màxima mida dels arrays
		Si num_conductors>tam_conductors_max Entonces
			Escribir "Com a màxim puc desar la informació de ", tam_conductors_max," conductors";
		FinSi
	Hasta que num_conductors<=tam_conductors_max;
	//Recorro els vectors fins al nombre de conductors indicats
	Para index_cond<-0 hasta num_conductors-1 Hacer
		Escribir sin saltar "Nom del conductor ",index_cond+1,":";
		//Llegeixo el nom
		Leer nom[index_cond];
		//Llegeixo els km realitzats per a cada dia
		Para index_dies<-0 hasta 6 Hacer
			Escribir sin saltar "Quants km ha realitzat el "dies[index_dies],"?:";
			Leer kms[index_cond,index_dies];
		FinPara
	FinPara
	//Recorro els vectors fins al nombre de conductors indicats
	Para index_cond<-0 hasta num_conductors-1 Hacer
		//Inicialitzo l'acumulador per conductor
		kms[index_cond,7]<-0;
		//Acumulo els kms per dia i el guardo en un vector
		Para index_dies<-0 hasta 6 Hacer
			kms[index_cond,7]<-kms[index_cond,7]+kms[index_cond,index_dies];
		FinPara
	FinPara
	//Recorro els vectors fins al nombre de conductors indicats per mostrar la informació de sortida
	Para index_cond<-0 hasta num_conductors-1 Hacer
		Escribir nom[index_cond]," ha realitzat ",kms[index_cond,7]," kms.";
	FinPara
FinProceso

14. Crear un programa que llegeixi els preus de 5 articles i les quantitats venudes per una empresa a les seves 4 sucursals. Informar:

  • Les quantitats totals de cada article.
  • La quantitat d'articles a la sucursal 2.
  • La quantitat de l'article 3 a la sucursal 1.
  • La recaptació total de cada sucursal.
  • La recaptació total de l'empresa.
  • La sucursal de més recaptació.

Anàlisi

Llegeixo els preus dels articles (ho guardo al vector Preu)
Llegeixo les quantitats venudes dels 5 articles a les 4 sucursals (ho guardo a la taula Quantitat)
Recorro la taula per articles, i mostro el que s'ha venut en total (per article)
Recorro la taula per articles i mostro el que s'ha venut a la sucursal 2.
Mostro el que s'ha venut de l'article 3 a la sucursal 1
Recorro la taula acumulant tot el que s'ha venut i el total per sucursal. A més a més en aquest recorregut calculo la sucursal que ha venut més.
Dades d'entrada: preu de 5 articles i la quantitat venuda de cada article a 4 sucursals
Informació de sortida: Les que indica l'enunciat
Variables:
preu (taula de 5 reals), quantitat (taula de 4 x 3 reals)
suma, numMajor, articlesSucursal2, majorRec, totalSucursal, totalEmpresa (real)
Proceso Sucursals
   Definir preu, quantitat, suma, numMajor,articlesSucursal2, majorRec, totalSucursal, totalEmpresa Como Real;
   Definir indexArt, indexSucursal como Entero;
 
   Dimension preu[5], quantitat[4,5];
   
   // Llegir preus
   Para indexArt<-0 Hasta 4 Hacer
      Escribir 'Introdueixi el preu de l'article ',indexArt+1,': ';
      Leer Precio[indexArt];
   FinPara
   
   // Llegir quantitats
   Para indexSucursal<-0 Hasta 3 Hacer
      Para indexArt<-0 Hasta 4 Hacer
         Escribir 'Introdueixi la quantitat de l'article ',indexArt+1,', en Sucursal ',indexSucursal+1,': ';
         Leer quantitat[indexSucursal,indexArt];
      FinPara
   FinPara
   
   // Sumar quantitats per articles
   Escribir 'Quantitats per articles:';
   Para indexArt<-0 Hasta 4 Hacer
      suma <- 0;
      Para indexSucursal<-0 Hasta 3 Hacer
         suma<-quantitat[indexSucursal,indexArt];
      FinPara
      Escribir 'Total article ',indexArt+1,': ' ,suma;
   FinPara
   
   // Informar total articles sucursal 2
   articlesSucursal2<-0;
   Para indexArt<-0 Hasta 4 Hacer
      articlesSucursal2<-articlesSucursal2+quantitat[1,indexAart];
   FinPara
   Escribir 'Total Sucursal 2:',articlesSucursal2;
   
   // Informar Sucursal 1, Article 3:
   Escribir 'Sucursal 1, Article 3: ',quantitat[0,2];
   
   // Acumular total de cada sucursal (totalSucursal) i
   // total de la empresa (totalEmpresa)
   majorRec<-0; 
   numMajor<-0; 
   totalEmpresa<-0;
   Para indexSucursal<-0 Hasta 3 Hacer
      totalSucursal<-0;
      Para indexArt<-0 Hasta 4 Hacer
         totalSucursal<-totalSucursal+(quantidad[indexSucursal,indexArt]*preu[indexArt]);
      FinPara
      Escribir 'Recaudacions Sucursal ',indexSucursal+1,': ',totalSucursal;
	  //Calculo la sucursal amb més recaudació
      Si totalSucursal>mayorRec entonces 
		  majorRec<-totalSucursal; 
		  numMayor<-indexSucursal+1; 
      FinSi
      totalEmpresa<-totalEmpresa+totalSucursal;
   FinPara
   Escribir 'Recaudació total de la empresa: ',totalEmpresa;
   Escribir 'Sucursal de Major Recaudació: ',numMajor;

FinProceso

15. Crear un programa d'ordinador per gestionar els resultats de la travessa de futbol. Per això utilitzarem dues taules:

  • Equips: Que és una taula de cadenes on guardem a cada columna el nom dels equips de cada partit. A la travessa s'indiquen 15 partits.
  • Resultats: És una taula de nombres enters on s'indica el resultat. També té dues columnes, a la primera es guarda el nombre de gols de l'equip que està guardat a la primera columna de la taula anterior, i a la segona els gols de l'altre equip.
El programa anirà demanant els noms dels equips de cada partit i el resultat del partit, a continuació s'imprimirà la travessa d'aquesta jornada.

Anàlisi

Recorro les taules per inicialitzar el nom dels dos equips i el resultat del partit (gols)
Recorro les taules, mostro el nom dels equips i el resultat de la travessa:
  • Un 1 si el que juga a casa ha guanyat (primer equip guanya)
  • Un 2 si el que juga de visitant ha guanyat (segon equip guanya)
  • Una X si hi ha empat
Dades d'entrada: Nom dels dos equips i el resultat del partit (per a cada partit)
Informació de sortida: Els noms dels equips i el resultat de la travessa
Variables:
equips (taula de 15 x 2 cadenes), resultats (taula de 15 x 2 enters)
index, num_equips (enter)
Proceso Travessa
	Definir index, numEquips Como Entero;
	Definir equips Como Caracter;
	Dimension equips[15,2];
	Definir resultats Como Entero;
	Dimension resultats[15,2];
	numEquips<-15;
	//Recorro les taules per inicialitzar el nom dels dos equips i el resultat del partit
	Para index<-0 hasta numEquips-1 Hacer
		Escribir Sin Saltar "Introdueix el nom de l'equip 1 del partit ", index+1,":";
		Leer equips[index,0];
		Escribir Sin Saltar "Introdueix el nom de l'equip 2 del partit ", index+1,":";
		Leer equips[index,1];
		Escribir Sin Saltar "Introdueix els gols ficats per l'equip ",equips[index,0],": ";
		Leer resultats[index,0];
		Escribir Sin Saltar "Introdueix els gols ficats per l'equip ",equips[index,1],": ";
		Leer resultats[index,1];
	FinPara
	Escribir "TRAVESSA";
	Escribir "========";
	
	// Recorro les taules, mostro el nom dels equips i el resultat del partit (per a cada partit)
	// Un 1 si el que juga a casa ha guanyat (primer equip guanya)
	// Un 2 si el que juga de visitant ha guanyat (segon equip guanya)
	// Una X si hi ha empat
	Para index<-0 hasta num_equipos-1 Hacer
		Si resultados[index,0]>resultados[index,1] Entonces
			Escribir equipos[index,0], " - ",equipos[index,0]," -> 1";
		SiNo
			Si resultats[index,0]<resultats[index,1] Entonces
				Escribir equips[index,0], " - ",equips[index,0]," -> 2";
			SiNo
				Escribir equips[index,0], " - ",equips[index,0]," -> X";
			FinSi
		FinSi
	FinPara
FinProceso

Exercicis programació estructurada

1. Fes un programa de conversió entre el sistema decimal i el sistema binari. En concret el programa presentarà un menú i utilitzarà dues funcions: una que ens permeti convertir un nombre sencer a binari, i una altra que ens permeti convertir un nombre binari a decimal.

  • ConvertirABinari: Funció que rep un nombre enter i torna una cadena amb la representació del número en binari.
  • ConvertirADecimal: Funció que rep una cadena amb la representació binària dun nombre i torna el nombre en decimal. Aquesta funció utilitzarà una altra, EsBinari, que rep un nombre enter i torna cert si un nombre binari i fals en cas contrari.

Funcions cadena, emprades en aquest exercici:

  • longitud(cadena): Retorna la quantitat de caràcters de la cadena.
  • subcadena(cadena,pos_ini,pos_fin): Retorna una nova cadena que consisteix a la part de la cadena que va des de la posició pos_ini fins a la posició pos_fin.
  • convertirANumero(cadena): Rep una cadena de caràcters que conté un nombre (caràcters numèrics) i retorna una variable numèrica amb el mateix.
  • convertirATexto(numero): Rep un numero i retorna una variable cadena de caràcters de aquest numero.
/// Programa per convertir nombres entre decimal i binari
Proceso principal
    Definir opcio, nombre Como Entero;
	Definir binari Como Cadena;
    Repetir
        // Mostrar el menú d'opcions
        Escribir "1. Convertir de decimal a binari";
        Escribir "2. Convertir de binari a decimal";
        Escribir "3. Sortir";
        Escribir "Escull una opció: " Sin Saltar;
        Leer opcio;
        Segun opcio Hacer
            Caso 1:
                // Convertir un nombre decimal a binari
                Escribir "Introdueix un nombre enter: " Sin Saltar;
                Leer nombre;
                Escribir "En binari: ", ConvertirABinari(nombre);
            Caso 2:
                // Convertir un nombre binari a decimal
                Escribir "Introdueix un nombre en binari: " Sin Saltar;
                Leer binari;
                Si EsBinari(binari) Entonces
                    Escribir "En decimal: ", ConvertirADecimal(binari);
                Sino
                    Escribir "Error: No és un nombre binari vàlid.";
                FinSi
            Caso 3:;
                Escribir "Adeu!";
            De Otro Modo:
                Escribir "Opció no vàlida.";
        FinSegun
    Hasta Que opcio = 3
FinProceso

// Funció per convertir un nombre decimal a binari
Funcion binari <- ConvertirABinari(nombre)
    Definir binari Como Cadena;
    binari <- "";
    Si nombre = 0 Entonces
        binari <- "0";
    FinSi
    // Aplicar el mètode de divisió successiva per obtenir la representació binària
    Mientras nombre > 0 Hacer
        binari <- Concatenar(ConvertirATexto(nombre mod 2), binari);
        nombre <- trunc(nombre / 2);
    FinMientras
FinFuncion

// Funció per convertir un nombre binari a decimal
Funcion decimal <- ConvertirADecimal(binari)
    Definir decimal, i, pot2 Como Entero;
    decimal <- 0;
    pot2 <- 1;
    i <- longitud(binari) - 1;
    Mientras i >= 0 Hacer
        // Multiplicar cada bit pel seu pes i sumar al resultat
        decimal <- decimal + ConvertirANumero(subcadena(binari, i, i)) * pot2;
        pot2 <- pot2 * 2;
        i <- i - 1;
    FinMientras
FinFuncion

// Funció per verificar si una cadena és un nombre binari vàlid
Funcion esValid <- EsBinari(binari)
    Definir esValid Como Logico;
    Definir i Como Entero;
    esValid <- Verdadero;
    i <- 0;
    // Comprovar que tots els caràcters són '0' o '1'
    Mientras i < longitud(binari) Y esValid Hacer
        Si no (subcadena(binari, i, i) = "0" O subcadena(binari, i, i) = "1") Entonces
            esValid <- Falso;
        FinSi
        i <- i + 1;
    FinMientras
FinFuncion

2.- El DNI (Document Nacional d'Identitat) a Espanya està format per 8 números i una lletra. La lletra ens serveix per verificar que el número és correcte, per tant la lletra es calcula a partir del número.

Per obtenir la lletra, cal dividir el número per 23 i quedar-te amb la resta. La lletra que correspon segons la resta és:

    0 - T    1 - R    2 - W    3 - A    4 - G    5 - M    6 - Y    7 - F    8 - P    9 - D   10 - X   11 - B
   12 - N   13 - J   14 - Z   15 - S   16 - Q   17 - V   18 - H   19 - L   20 - C   21 - K   22 – E

Fes un programa amb les següents opcions: obtenir lletra DNI, validar DNI i Sortir.

Implementa 4 funcions, amb el següent propòsit:

1. validi a partir de un número de DNI, passat com a cadena, té 9 caràcters numèrics.
2. validi que un DNI, passat com a cadena, té 9 caràcters numèrics i una lletra.
3. a partir de un número de DNI passat com a cadena, ens retorni la lletra que li correspon.
4. a partir de un DNI passat com a cadena, ens indiqui si aquest es correcte.
Les funcions 3 i 4 utilitzaran les funcions 1 i 2, per comprovar que les dades introduïdes són correctes.

Funcions cadena, emprades en aquest exercici:

  • longitud(cadena): Retorna la quantitat de caràcters de la cadena.
  • mayusculas(cadena): Retorna una còpia de la cadena amb tots els seus caràcters en majúscules.
  • subcadena(cadena,pos_ini,pos_fin): Retorna una nova cadena que consisteix a la part de la cadena que va des de la posició pos_ini fins a la posició pos_fin.
  • convertirANumero(cadena): Rep una cadena de caràcters que conté un nombre (caràcters numèrics) i retorna una variable numèrica amb el mateix.
// Programa per gestionar DNI: obtenir la lletra, validar un DNI i sortir
Proceso principal
    Definir opcio Como Entero;
	Definir numeroDNI, dni Como Cadena;
    opcio <- 0;
    Repetir
        // Mostrar el menú d'opcions 
        Escribir "1. Obtenir lletra DNI";
        Escribir "2. Validar DNI";
        Escribir "3. Sortir";
        Escribir "Escull una opció: " Sin Saltar;
        Leer opcio;
        Segun opcio Hacer
            Caso 1:
                // Obtenir la lletra corresponent a un número de DNI
                Escribir "Introdueix el número del DNI (8 dígits): " Sin Saltar;
                Leer numeroDNI;
                Si validarNumeroDNI(numeroDNI) Entonces
                    Escribir "La lletra corresponent és: ", obtenirLletraDNI(numeroDNI);
                Sino
                    Escribir "Error: El número de DNI ha de tenir 8 dígits numèrics.";
                FinSi
            Caso 2:
                // Validar si un DNI complet (número i lletra) és correcte
                Escribir "Introdueix el DNI complet (8 dígits i 1 lletra): " Sin Saltar;
                Leer dni;
                Si validarDNI(dni) Entonces
                    Si esDNIValid(dni) Entonces
                        Escribir "El DNI és vàlid.";
                    Sino
                        Escribir "El DNI no és vàlid.";
                    FinSi
                Sino
                    Escribir "Error: El format del DNI no és correcte.";
                FinSi
            Caso 3:
                // Finalitzar el programa
                Escribir "Adeu!";
            De Otro Modo:
                Escribir "Opció no vàlida.";
        FinSegun
    Hasta Que opcio = 3
FinProceso

// Funció per validar si un número de DNI té exactament 8 dígits numèrics
Funcion es_valid <- validarNumeroDNI(numero)
    Definir es_valid Como Logico;
    Definir i Como Entero;
    es_valid <- Verdadero;
    Si longitud(numero) <> 8 Entonces
        es_valid <- Falso;
    Sino
        i <- 0;
        Mientras i < 8 Y es_valid Hacer
            // Comprovar que cada caràcter és un dígit
            Si no (subcadena(numero, i, i) >= '0' Y subcadena(numero, i, i) <= '9') Entonces
				es_valid <- Falso;
            FinSi
            i <- i + 1;
        FinMientras
    FinSi
FinFuncion

// Funció per validar si un DNI complet té el format correcte (8 dígits + 1 lletra)
Funcion es_valid <- validarDNI(dni)
    Definir es_valid Como Logico;
    Definir i Como Entero;
    es_valid <- Verdadero;
    Si longitud(dni) <> 9 Entonces
        es_valid <- Falso;
    Sino
        i <- 0;
        Mientras i < 8 Y es_valid Hacer
            // Comprovar que els primers 8 caràcters són dígits
            Si no (subcadena(dni, i, i) >= '0' Y subcadena(dni, i, i) <= '9') Entonces
                es_valid <- Falso;
            FinSi
            i <- i + 1;
        FinMientras
        // Comprovar que l'últim caràcter és una lletra majúscula
        Si no (Mayusculas(subcadena(dni, 8, 8)) >= 'A') Y (Mayusculas(subcadena(dni, 8, 8)) <= 'Z') Entonces
            es_valid <- Falso;
        FinSi
    FinSi
FinFuncion

// Funció per obtenir la lletra corresponent a un número de DNI
Funcion lletra <- obtenirLletraDNI(numero) 
    Definir lletra Como Cadena;
    Definir lletres Como Cadena;
    lletres <- "TRWAGMYFPDXBNJZSQVHLCKE";
    Definir index Como Entero;
    // Calcular la lletra en base al residu del número de DNI dividit per 23
    index <- ConvertirANumero(numero) mod 23;
    lletra <- subcadena(lletres, index, index);
FinFuncion

// Funció per comprovar si un DNI és vàlid comparant la lletra calculada amb la introduïda
Funcion es_valid <- esDNIValid(dni)
    Definir es_valid Como Logico;
    Definir numero Como Cadena;
    Definir lletra Como Cadena;
    // Separar el número i la lletra del DNI
    numero <- subcadena(dni, 0, 7);
    lletra <- mayusculas(subcadena(dni, 8, 8));
    // Validar el número i comparar la lletra calculada
    es_valid <- lletra = obtenirLletraDNI(numero);
FinFuncion

3.- Dissenyar un programa que permeti endevinar a l'ordinador un determinat nombre enter i positiu, utilitzant cerca binaria, per a això s'han de llegir els límits en què està comprès aquest número. El programa haurà d'anar mostrant números que rebran les respostes següents:

‘S’, si és correcte. ‘A’, si és més alt que el número a endevinar. ‘B’, si és més baix.

En finalitzar el programa, cal escriure el nombre d'intents realitzats per encertar el número.

Consideracions:

Cal comprovar que els límits introduïts són positius i que el límit inferior és menor que el límit superior.
La cerca binaria, consisteix en generar a cada iteració, el valor mig dels límits.

Funcions cadena, emprades en aquest exercici:

  • mayusculas(cadena): Retorna una còpia de la cadena amb tots els seus caràcters en majúscules.
  • trunc(real): Retorna un número enter, eliminat la part decimal.
Proceso EndevinarNumero
	Definir limit_inferior, limit_superior, elmeunumero Como Entero;
	Definir opcio como Caracter;
	Definir intents Como Entero;
	intents<-0;	
	//Es demana el primer interval
	ObtenirLimits(limit_inferior, limit_superior);
	//Es va repetint fins que s'encerti el número
	Repetir
		//Escrivim el número proposat (què serà el número intermedi de l'interval)
		elmeunumero<-generarNumero(limit_inferior,limit_superior);
		Escribir "Has pensant en el número?:", elmeunumero;
		//Incrementem el nombre d'intents
		intents<-intents+1;
		//Llegim l'opció, si no heu encertat es modifica alguns dels límits i es torna a proposar un nou número
		opcio<-LlegirOpcio();
		Si no Mayusculas(opcio)="S" Entonces
			actualitzarLimits(opcio, elmeunumero, limit_inferior, limit_superior);
		FinSi
	Hasta Que Mayusculas(opcio)="S";
	//S'escriu els intents que ha necessitat per encertar-ho
	Escribir "Ho he encertat en ",intents," intents.";
FinProceso

Funcion num <- generarNumero(liminf,limsup)
	Definir num Como Entero;
	num<-Trunc((liminf+limsup)/2);
FinFuncion

Funcion opcio <- llegirOpcio
	Definir opcio Como Caracter;
	Repetir
		Escribir "¿Es correcte?";
		Escribir "S: si es correcte.";
		Escribir "A: si es més alt que el número a endevinar.";
		Escribir "B: si es més baix que el número a enevinar.";
		Leer opcio;
	Hasta Que Mayusculas(opcio)="S" o Mayusculas(opcio)="A" o Mayusculas(opcio)="B";
FinFuncion

Funcion actualitzarLimits(opcio, num, liminf Por Referencia, limsup Por Referencia)
	Si Mayusculas(opcio)="A" Entonces
		liminf<-num + 1;
	FinSi
	Si Mayusculas(opcio)="B" Entonces
		limsup<-num - 1;
	FinSi             
FinFuncion

Funcion  ObtenirLimits(liminf Por Referencia, limsup por Referencia)
Escribir "Pensa un número...";
//Es demana el primer interval
Escribir "Necessito saber linterval on es troba el número:";
	Repetir
		liminf <- llegirLimit("Introdueix el límit inferior: ");
		limsup <- llegirLimit("Introdueix el límit superior: ");	
	Hasta Que liminf < limsup;
FinFuncion

Funcion limit <- llegirLimit(missatge) 
    Definir limit Como Entero;
    Repetir
		Escribir missatge Sin Saltar;
		Leer limit;
    Hasta Que limit > 0;
FinFuncion

4.- Implementa un programa que gestioni l'inici de sessió d'un usuari.

Consideracions:

L'usuari és user1 i la contrasenya és 1@-27
Només es permeten 3 intents.

Implementeu:

  • Funció Login, rep el nom d'usuari introduït per l'usuari, i la contrasenya introduïda per l'usuari i per referència el nombre d'intents. Retorna cert si es corresponen amb l'usuari i contrasenya, i fals en cas contrari. Actualitza el nombre d'intents.
  • Procediment Credencials, té com a paràmetres el nom de l'usuari i la contrasenya (ambdós passats per referència). Demana les dades de l'usuari i actualitza els paràmetres.
  • Procediment MostrarMissatgeFinal, rep com a paràmetre un booleà indicant si s'ha accedit (usuari i contrasenya correctes) o no s'ha pogut accedir (error en usuari i/o contrasenya) i mostra un missatge indicant si s'ha aconseguit l'accés o si s'han superat els intents.
/ Programa que gestiona l'inici de sessió amb un màxim de 3 intents

Proceso GestioLogin
    Definir user, password Como Cadena;
    Definir intents Como Entero;
    Definir accedit Como Logico;
    intents <- 0;  // Inicialitzem el comptador d'intents
    accedit <- Falso;  // Inicialment, l'usuari no ha accedit correctament
	
    // Bucle que permet a l'usuari intentar accedir fins a 3 vegades
    Mientras intents < 3 Y NO accedit Hacer
	LlegirCredencials(user, password);  // Demanem les credencials a l'usuari
	accedit <- Login(user, password, intents);  // Intentem fer login
	
	// Si l'usuari ha fallat, mostrem missatge d'error i intents restants
	Si NO accedit Entonces
		Escribir "Usuari o contrasenya incorrectes. Intents restants: ", 3 - intents;
	FinSi
    FinMientras
	
    // Un cop acabats els intents, mostrem el missatge final
    MostrarMissatgeFinal(accedit);
FinProceso

// Procediment per llegir les credencials de l'usuari
Funcion LlegirCredencials(user Por Referencia, password Por Referencia)
Escribir "Introdueix el nom dusuari:";
    Leer user;
    Escribir "Introdueix la contrasenya:";
    Leer password;
FinFuncion

// Funció que comprova si l'usuari i la contrasenya són correctes
// També incrementa el nombre d'intents si l'autenticació falla
Funcion validar<-Login(user, password, intents Por Referencia)
    Definir validar Como Logico;
    Si user = "user1" Y password = "1@-27" Entonces
        validar <- Verdadero; // Si les credencials són correctes, retornem Cert;
    Sino
        intents <- intents + 1;  // Si són incorrectes, incrementem el comptador d'intents
        validar <- Falso;  // Retornem Fals per indicar que no s'ha pogut iniciar sessió
    FinSi
FinFuncion

// Procediment que mostra un missatge final segons si l'usuari ha accedit correctament o no
Funcion MostrarMissatgeFinal(accedit)
    Si accedit Entonces
        Escribir "Accés concedit!";  // Si l'usuari ha entrat correctament, ho indiquem
    Sino
        Escribir "Has superat el nombre dintents permesos. Accés denegat.";  // Si ha esgotat els intents, deneguem l'accés
    FinSi
FinFuncion

5.- Fes un programa que pseudocodi que permeti calcular:

  • La quantitat de segons en un temps donat en hores, minuts i segons.
  • La quantitat de hores, minuts i segons d'un temps donat en segons.

El programa utilitzarà tres funcions una per presentar un menú en tres opcions (primera: convertir a segons, segona: convertir a hores, minuts i segons i tercera: sortir) i dues funcions una per a cada una dels càlculs a fer.

Proceso Convertir_Temps
	Definir opcio Como Entero;
	Repetir
		opcio <- Menu();
		Segun opcio Hacer
			1:
				Escribir "Total en segons: ", A_Seconds();
			2:
				Definir h, m, s Como Entero;
				A_HMS(h, m, s);
				Escribir "Hores: ", h, " Minuts: ", m, " Segons: ", s;
			3:
				Escribir "Sortint del programa...";
		Fin Segun;
	Hasta Que opcio = 3;
FinProceso

Funcion opcio <- Menu
	Definir opcio Como Entero;
	Repetir
	Escribir "Menú dopcions:";
		Escribir "1. Convertir hores, minuts i segons a segons";
		Escribir "2. Convertir segons a hores, minuts i segons";
		Escribir "3. Sortir";
		Escribir "Selecciona una opció (1-3):";
		Leer opcio;
	Hasta Que opcio >= 1 Y opcio <= 3;
FinFuncion

Funcion segons <- A_Seconds
	Definir h, m, s, segons Como Entero;
	Escribir "Introdueix hores, minuts i segons: ";
	Leer h, m, s;
	segons <- (h * 3600) + (m * 60) + s;
FinFuncion

Funcion A_HMS(h Por Referencia, m Por Referencia, s Por Referencia )
	Definir segons Como Entero;
	Escribir "Introdueix segons: ";
	Leer segons;
	h <- Trunc(segons / 3600);
	m <- Trunc((segons % 3600) / 60);
	s <- (segons % 3600) % 60;
FinFuncion