program TP4MOD31;

uses crt;

const m=50; l=50; (* m, cantidad de ciudades maxima permitida por el programa
, l, cantidad de barrios maxima permitida por el programa*)

type matriz=array [1..m,1..l] of longint;
     vec=array [1..m] of longint;

var h:matriz;v:vec;c,b:integer;s:char;

(*c y b es la cantidad maxima de ciudades y barrios, elejido por el usuario*)




(*procedimientos y funciones*)

procedure cero_matriz(var hm:matriz);
var i,j:integer;
begin
  for i:=1 to m do
   for j:=1 to l do
   begin       (*cero matriz*)
   hm[i,j]:=0;
   end;
end;


procedure ingreso_de_datos(var hm:matriz);
var cc,cb:integer;ch:longint; (*cc es codigo de ciudad, cb es codigo de barrio
y ch es cantidad de habitantes*)
begin
  clrscr;
  writeln('INGRESO DE DATOS');
  writeln('La cantidad maxima de ciudades es ',c);
  writeln('y, la cantidad maxima de barrios por ciudad es ',b);
  writeln('finalizar el ingreso de datos con un -1 o excediendose');
  writeln('en la cantidad maxima de ciudades o barrios permitidos.');
  writeln('');
  writeln('Ingresar el codigo de la ciudad, el codigo del barrio');
  writeln('y la cantidad de habitantes en el barrio,');
  writeln('seguido cada uno de un enter.');
  readln(cc);
  readln(cb);
  readln(ch);
  while (cc>0) and (cc<=c) and (cb>0) and (cb<=b) do
   begin
      hm[cc,cb]:=ch;
      writeln('');
      writeln('Ingresar el codigo de la ciudad, el codigo del barrio');
      writeln('y la cantidad de habitantes en el barrio,');
      writeln('seguido cada uno de un enter.');
      readln(cc);
      readln(cb);
      readln(ch);
   end;
end;

procedure mostrar_matriz(hm:matriz);
var i,j,cond:integer;s:char;
begin
  clrscr;
  writeln('PARTE 1: IMPRIMIR LA INFORMACION LEIDA');
  writeln('Se mostraran los datos ingresados, si desea ver uno en particular');
  writeln('presione 1, si desea ver todos los datos ingresados presione 2, ');
  writeln('si no desea ver ninguno presione cualquier otro numero.');
  readln(cond);
  while (cond=1) or (cond=2) do
  begin
   if (cond=1) then
   begin
   clrscr;
   writeln('Ingrese el codigo de ciudad y el codigo de barrio que desea ver,');
   writeln('cada uno seguido de un enter, y se mostrara la cantidad de habitantes.');
   readln(i);
   readln(j);
   writeln('');
   writeln('La cantidad de habitantes en el barrio es: ',hm[i,j]);
   writeln('Para seguir apretar una tecla y un enter.');
   readln(s);
   clrscr;
   writeln('Se mostraran los datos ingresados, si desea ver uno en particular');
   writeln('presione 1, si desea ver todos los datos ingresados presione 2, ');
   writeln('si no desea ver ninguno presione cualquier otro numero.');
   readln(cond)
   end
    else
    begin
    clrscr;
    writeln('Los datos Ingresados son:');
     for i:=1 to c do                (*mostrar matriz*)
     begin
      for j:=1 to b do
      begin
      writeln('El codigo de ciudad es ',i,' y el codigo de barrio es ',j);
      writeln('La cantidad de habitantes en el barrio es: ',hm[i,j]);
      writeln('Para seguir apretar una tecla y un enter.');
      readln(s);
      end;
     end;
    clrscr;
    writeln('Se mostraran los datos ingresados, si desea ver uno en particular');
    writeln('presione 1, si desea ver todos los datos ingresados presione 2, ');
    writeln('si no desea ver ninguno presione cualquier otro numero.');
    readln(cond);
    end;
  end;
end;

procedure habitantes(var vi:vec;hm:matriz);
var i,j,cont:integer;menor:longint;s:char;
begin
 for i:=1 to c do
 begin
 vi[i]:=0;
  for j:=1 to b do
  vi[i]:=vi[i]+hm[i,j];
 end;
 clrscr;
 writeln('PARTE 2: CIUDADES CON MENOR CANTIDAD DE HABITANTES');
 writeln('Se mostrara a continuacion la ciudad o ciudades con menor cantidad');
 writeln('de habitantes y cuantos son estos.');
 writeln('Cual es el maximo de habitantes posibles de las ciudades?');
 readln(menor);
  for i:=1 to c do
  begin
   if (vi[i]< menor) then
   menor:=vi[i];
  end;
    writeln('');
    writeln('La menor cantidad de habitantes que tienen las ciudades es de: ',menor);
    cont:=0;
     for i:=1 to c do
     begin
      if (vi[i]=menor) then
      cont:=cont+1;
     end;
          if (cont=1) then      (* para una sola ciudad*)
          begin
           for i:=1 to c do
           begin
            if (vi[i]=menor) then
            writeln('El codigo de la ciudad que tiene esa cantidad de habitantes es: ',i);
           end;
          end

          else                 (* para mas ciudades *)
          begin
          writeln('Los codigos de las ciudades que tienen esa cantidad de habitantes son: ');
           for i:=1 to c do
           begin
            if (vi[i]=menor) then
            writeln(i);
           end;
          end;
         writeln('Para continuar presione cualquier tecla y enter.');
         readln(s);
end;

procedure parte3(hm:matriz);
var i,j,cond,cont:integer;max:longint;

begin
max:=0;
clrscr;
writeln('PARTE 3: MAYOR CANTIDAD DE HABITANTES EN UN BARRIO DE LA CIUDAD QUE ELIJA EL USUARIO');
writeln('Si desea ver cual es el barrio que mayor cantidad de habitantes tiene');
writeln('de la ciudad que ud. elija, presione 1 y enter, si no cualquier otro numero.');
readln(cond);
 while (cond=1) do
 begin
 max:=0;
 clrscr;
 writeln('Ingrese el codigo de la ciudad que desea ver y presione enter.');
 readln(i);
  for j:=1 to b do
  begin
   if (hm[i,j]>max) then
   begin
   max:=hm[i,j];
   end;
  end;
  writeln('');
  writeln('La mayor cantidad de habitantes que tienen los barrios de la ciudad ',i);
  writeln('es de: ',max);
  cont:=0;
   for j:=1 to b do
   begin
    if (hm[i,j]=max) then
    cont:=cont+1;
   end;
          if (cont=1) then      (* para un solo barrio*)
          begin
           for j:=1 to b do
           begin
            if (hm[i,j]=max) then
            writeln('El codigo del barrio que tiene esa cantidad de habitantes es: ',j);
           end;
          end

          else                 (* para mas barrios *)
          begin
          writeln('Los codigos de los barrios que tienen esa cantidad de habitantes');
          writeln('en la ciudad ',i,' son:');
           for j:=1 to b do
           begin
            if (hm[i,j]=max) then
            writeln(j);
           end;
          end;
          writeln('');
          writeln('Si desea ver cual es el barrio que mayor cantidad de habitantes tiene');
          writeln('de la ciudad que ud. elija, presione 1 y enter, si no cualquier otro numero.');
          readln(cond);
 end;
end;


procedure parte4(hm:matriz);
var i,j,cond,cont:integer;max:longint;

begin
clrscr;
writeln('PARTE 4: MAYOR CANTIDAD DE HABITANTES EN UNA CIUDAD DEL BARRIO QUE ELIJA EL USUARIO');
writeln('Si desea ver cual es la ciudad que mayor cantidad de habitantes tiene');
writeln('en el barrio que ud. elija, presione 1 y enter, si no cualquier otro numero.');
readln(cond);
 while (cond=1) do
 begin
 max:=0;
 clrscr;
 writeln('Ingrese el codigo del barrio que desea ver y presione enter.');
 readln(j);
  for i:=1 to c do
  begin
   if (hm[i,j]>max) then
   begin
   max:=hm[i,j];
   end;
  end;
  writeln('');
  writeln('La mayor cantidad de habitantes que tienen las ciudades del barrio ',j);
  writeln('es de: ',max);
  cont:=0;
   for i:=1 to c do
   begin
    if (hm[i,j]=max) then
    cont:=cont+1;
   end;
          if (cont=1) then      (* para una sola ciudad*)
          begin
           for i:=1 to c do
           begin
            if (hm[i,j]=max) then
            writeln('El codigo de la ciudad que tiene esa cantidad de habitantes es: ',i);
           end;
          end

          else                 (* para mas ciudades *)
          begin
          writeln('Los codigos de las ciudades que tienen esa cantidad de habitantes');
          writeln('en el barrio ',j,' son:');
           for i:=1 to c do
           begin
            if (hm[i,j]=max) then
            writeln(i);
           end;
          end;
          writeln('');
          writeln('Si desea ver cual es la ciudad que mayor cantidad de habitantes tiene');
          writeln('del barrio que ud. elija, presione 1 y enter, si no cualquier otro numero.');
          readln(cond);
 end;
end;


function total(hm:matriz;c,b:integer):longint;
var i,j:integer;parcial:longint;
begin
parcial:=0;
 for i:=1 to c do
 begin
  for j:=1 to b do
  begin
  parcial:=parcial+hm[i,j];
  end;
 end;
total:=parcial;
end;









(*Programa Principal*)

begin
clrscr;
writeln('TP4');
writeln('Se ingresan los datos de M ciudades de provincia y dentro de cada ciudad');
writeln('se tiene L barrios, segun el siguiente esquema: Codigo de ciudad, Codigo');
writeln('de barrio, Cantidad de habitantes. La informacion viene desordenada y');
writeln('termina de leerse cuando el codigo de ciudad es de -1.');
writeln('1. Imprimir la informacion leida.');
writeln('2. Cuales son las ciudades que tienen menos habitantes y cuantos son estos?');
writeln('3. Cual es el barrio de mayor cantidad de habitantes de la ciudad k1?');
writeln('4. Cual es la ciudad que tiene mas habitantes en el barrio k2?');
writeln('5. Imprimir los resultados.');
writeln('Emplear por lo menos un procedimiento y una funcion.');
writeln('');
writeln('Ademas se calculara al final, la cantidad maxima de habitantes para');
writeln('hacer uso de una funcion como lo pide el ejercicio.');
writeln('');
writeln('Para comenzar con el programa presionar una tecla y luego enter.');
readln(s);
cero_matriz (h);
writeln('');
writeln('Cual es el maximo de ciudades que desea ingresar?');
readln(c); (*c es ciudad*)
writeln('Cual es el maximo de barrios por ciudad que desea ingresar?');
readln(b); (*b es barrio*)
ingreso_de_datos(h);
mostrar_matriz(h);
habitantes(v,h);
parte3(h);
parte4(h);
clrscr;
writeln('La cantidad total de habitantes en las ciudades es de: ');
writeln(total(h,c,b));

writeln('');
writeln('Fin del Programa');
writeln('Apretar una tecla y luego enter para salir.');
readln (s)
end.















