Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - castrokin

Páginas: [1]
1
Hola Chicos espero puedan ayudarme con esta asignación.

Se me pide saber la ruta más corta desde el nodo O al nodo T. Los números que se muestran en las aristas representan la distancia entre los nodos.



Debo elaborar un programa en C++ que encuentre la ruta más corta entre los nodos O y T utilizando el algoritmo de Dijkstra.

Este es mi código

Código: [Seleccionar]
#include <iostream>
#include <queue>
#include <vector>
#define MAXV 100 // Maxima cantidad de vertices.
#define oo 0x3f3f3f3f // Nuestro valor infinito.
using namespace std;


struct Edge
{
int node; // El nodo destino de la arista.
int cost; // El costo de la arista.
Edge(int _node, int _cost) : node(_node), cost(_cost) {} // Constructor parametrizado.
Edge() : node(-1), cost(-1) {} // Constructor por defecto.
};

struct Graph
{
vector<Edge> G[MAXV]; // Lista de adyacencias.
int V; // Cantidad de vertices.
int E; // Cantidad de aristas.
};

struct State
{
int node; // El nodo actual.
int cost; // El costo del camino.
State(int _node, int _cost) : node(_node), cost(_cost) {} // Constructor parametrizado.
bool operator <(const State &b) const // Sobrecarga del operador de prioridad <.
{
return cost > b.cost;
}
};

int algoritmo(const int begin, const int end, const Graph graph)
{
priority_queue<State> pq; // La cola de prioridad.
vector<int> Dist(graph.V, oo); // La distancia hacia todos los vertices. Inicialmente para cada vertice su valor es infinito.
vector<bool> mark(graph.V, false); // Este arreglo nos permitira determinar los nodos procesados.

Dist[begin] = 0; // Valor inicial del vertice de partida.
pq.push(State(begin, 0)); // Agregamos el primer elemento, que no es mas que el vertice de partida.
while(!pq.empty()) // Mientras existan vertices por procesar.
{
State st = pq.top(); pq.pop(); // Se desencola el elemento minimo.
mark[st.node] = true; // Se marca el nodo como visitado.
if (st.node == end)
return st.cost; // Retornamos el valor del camino, hemos llegado al vertice destino.

int T = (int)graph.G[st.node].size();
for(int i = 0; i < T; ++i) // Se recorren las adyacencias de "a".
{
// Si no ha sido procesado el vertice "vi" y la distancia hacia "vi" es menor a la distancia
// en Dist entonces hemos encontrado un camino mas corto a "vi".
if (!mark[graph.G[st.node][i].node] && ((Dist[st.node] + graph.G[st.node][i].cost) < Dist[graph.G[st.node][i].node]))
{
Dist[graph.G[st.node][i].node] = st.cost + graph.G[st.node][i].cost;
pq.push(State(graph.G[st.node][i].node, st.cost + graph.G[st.node][i].cost));
}
}
}
return -1; // Si no se puede llegar al destino, retornar -1.
}

struct Programa
{
int V, E;
int comienzo, fin;
void definirGrafo(Graph& graph)
{
cout << "Ingrese Cantidad de Vertices: " << endl;
cin >> V;
cout << "Ingrese Cantidad de Aristas: " << endl;
cin >> E;

graph.V = V;
graph.E = E;
}
void cargarGrafo(Graph & graph)
{
for (int i = 0; i < E; ++i)
{
int Origen, Destino, Peso;
cout << "Ingrese Origen: " << endl;
cin >> Origen;
cout << "Ingrese Destino: " << endl;
cin >> Destino;
cout << "Ingrese Peso de la Arista: " << endl;
cin >> Peso;

// Insertamos la arista dos veces, ya que nuestro grafo es un grafo no dirigido.
graph.G[Origen].push_back(Edge(Destino, Peso));
graph.G[Destino].push_back(Edge(Origen, Peso));
}
}
void Dijkstra(Graph graph)
{
cout << "Ingrese Vertice Inicial: " << endl;
cin >> comienzo;
cout << "Ingrese Vertice Final: " << endl;
cin >> fin;
int n = algoritmo(comienzo, fin, graph);
cout << "Longitud del Camino mas Corto: " << n << endl;
}
};

int main()
{
bool out=false;
char salir;

Programa programa; //TAD
Graph graph; // Grafo.

cout << "Algoritmo de Dijkstra en C++" << endl;

while (!out)
{
programa.definirGrafo(graph); //Se define cantidad de vertices y cantidad de aristas del grafo
programa.cargarGrafo(graph); //Se cargan las aristas del Grafo
programa.Dijkstra(graph); //Se aplica el algoritmo de Dijkstra

//Desea Salir?
cout << "Salir? (S/N)" << endl;
cin >> salir;
if (salir == 'S')
{
out = true;
}
}
}

Mi duda es

Sera este el mejor enfoque para darle o ustedes creen que se puede cambiar algo

Muchas gracias a todos

2
Muchas gracias ya estoy entendiendo. he creado 2 funciones mas para agregar al código.

una para validar el nombre y apellido del trabajador

Código: [Seleccionar]
function validarNombre(nombre:string):boolean;

var
valorAscii: integer;

i: integer;

begin

validarNombre := true;

for i:= 1 to length(nombre) do

begin

valorAscii := ord(nombre[i]);

if (valorAscii < 48) or (valorAscii > 57) then
validarNombre := false;

end;

if not validarNombre then

begin

writeln('El nombre solo puede contener letras');

writeln('Intente de nuevo...');

writeln();

end;

end;

el compila pero al ejecutar el programa y se escribe una secuencia de numeros igual las acepta.

y la otra para validar que el salario sea en números y no letras

Código: [Seleccionar]
function validarSalario(salario:real):boolean;

var
valorAscii: integer;

i: integer;

begin

validarSalario := true;

for i:= 1 to length(salario) do

begin

valorAscii := ord(salario[i]);

if (valorAscii < 48) or (valorAscii > 57) then
validarSalario := false;

end;

if not validarSalario then

begin

writeln('El salario solo puede contener numeros');

writeln('Intente de nuevo...');

writeln();

end;

end;

este me da los siguientes errores de codificacion:

GestionTrabajador.pas(183,15) Error: Type mismatch
GestionTrabajador.pas(187,29) Error: Illegal qualifier

quizás cambiando el valor ascii por otro que desconozca.

ademas me gustaria saber si de la misma maneras en que se hace en geany

Citar
No. No tienes que unir los archivos.
El programa ahora tendrá dos archivos separados: prom.pas y GestionTrabajadores.pas

Cuando compilas el de los trabajadores, como es una UNIT, se genera un archivo .ppu

Luego, cuando compiles el programa principal, se genera el archivo .exe, o sea, el archivo ejecutable, que ya contiene convertido en código máquina, tanto el programa como la UNIT.

se puede hacer usando el programa free pascal ya que al enviarle el codigo a la profesora debo enviarle los 2 el .exe y el .pas

muchas gracias.


3
muchas gracias lo probare y cualquier duda te las hare llegar. he decidido, como ya te comente, cambiar el programa geany ya que me presentaba ciertos fallos. he decidido cambiar a lazaruz.

una pregunta como debo unir los dos archivos el gestion trabajadores y el prom

Citar
Te adjunto un archivo .zip con todos los archivos de este proyecto, menos el .exe ejecutable.

ya que al unirlos en uno solo

Código: [Seleccionar]
program ACME;

UNIT GestionTrabajador;

{
* En la interfaz declaramos estructuras, constantes, variables y
* nombres de procedimientos/funciones que seran visibles para otros
* programas}

INTERFACE

uses crt; {Opcionalmente, podemos importar otras units}

type
 
    tipoPersona = record
 
        nombre: string;
 
        salario: real;
 
sal_anual: real;
 
sal_mensual: real;
 
utilidades: real;

vacaciones: real;
 
bono: real;
 
cedula: string;
 
    end;
 
const
 
capacidad = 1000;

cesta = 200;
 
var
 
tra: array[1..capacidad] of tipoPersona;

trabajadorMenor: tipoPersona;
 
    cantidad: integer;
 
    opcion: integer;
 
    i, j: integer;
 
    textoBuscar: string;
 
    encontrado: boolean;
 
bono: real;
 
seBorro:boolean;
 
acumMedia :real;
 
contMedia: integer;


{Ahora procedimientos y funciones, solo su firma/cabecera. Su codigo se escribira despues}

function validarCedula(cedula:string):boolean;

procedure agregarTrabajador;

procedure mostrarTodos;

procedure buscarTrabajador;

procedure reporte1;

procedure reporte2;

procedure borrarTrabajador;

procedure promedioNominaMayor;

procedure promedioNominaMenor;

procedure promedioGeneral;

procedure listaTrabajadoresGananMasQueMayores;

 
{En la implementacion es donde se escribe el codigo de cada funcion y procedimiento}

IMPLEMENTATION

function validarCedula(cedula:string):boolean;

var
valorAscii: integer;

i: integer;

begin

validarCedula := true;{Si se encuentra un caracter que no es numero, pasara a ser false}

for i:= 1 to length(cedula) do

begin

valorAscii := ord(cedula[i]);

if (valorAscii < 48) or (valorAscii > 57) then
validarCedula := false;

end;

if not validarCedula then

begin

writeln('La cedula solo puede contener numeros');

writeln('Intente de nuevo...');

writeln();

end;

end;

procedure agregarTrabajador;

begin

if (cantidad < capacidad) then
 
begin

clrscr;
 
inc(cantidad);

WriteLn('Introduciendo al trabajador ', cantidad);

repeat

Write('Introduzca Cedula del trabajador: ');

ReadLn(tra[cantidad].cedula);

until validarCedula(tra[cantidad].cedula);{Hasta que la funcion devuelva true}

Write('Introduzca el nombre del trabajador: ');

ReadLn(tra[cantidad].nombre);

Write('Introduzca Salario: ');

ReadLn(tra[cantidad].salario);
   
with tra[cantidad] do begin
   
if salario > 1500 then begin

utilidades := salario * 2;{2 meses de utilidades}

vacaciones := salario;{1 mes de bono vacacional}

bono := salario * 0.1;{10% productividad, se paga mensual}

sal_mensual := salario + bono;

sal_anual := sal_mensual * 12 + utilidades + vacaciones;

end

else begin {salario es <= a 1500}

utilidades := salario * 4;{4 meses de utilidades}

vacaciones := salario;{1 mes de bono vacacional}

sal_mensual := salario  + cesta;{cesta ticket mensual}

sal_anual := sal_mensual * 12 + utilidades + vacaciones;

end;
   
end;

writeln('Trabajador registrado. Pulse una tecla para continuar');

repeat until keypressed;

end;

end;

procedure mostrarTodos;

begin

clrscr;

if cantidad = 0 then

WriteLn('No hay datos')

else

for i := 1 to cantidad do

WriteLn(i,' ',tra[i].cedula,' ',tra[i].nombre,' ',tra[i].salario:4:2);

WriteLn;

writeln('Pulse una tecla para continuar');

repeat until keypressed;

end;

procedure buscarTrabajador;

begin

clrscr;

Write('Escriba cedula del trabajador ');

ReadLn( textoBuscar );

encontrado := false;

for i := 1 to cantidad do

if pos (textoBuscar, tra[i].cedula) > 0 then

begin

encontrado := true;

WriteLn( i,' - Cedula: ', tra[i].cedula,',Nombre: ', tra[i].nombre,', Salario: ', tra[i].salario:4:2);

end;

if not encontrado then

WriteLn('No se ha encontrado.');

WriteLn;

writeln('Pulse una tecla para continuar');

repeat until keypressed;

end;

procedure reporte1;

begin

clrscr;

for i := 1 to cantidad do

begin

if tra[i].salario > 1500 then

begin

writeln('Nombre del trabajador: ', tra[i].nombre);

WriteLn('Salario: ', tra[i].salario:4:2);

WriteLn('Bono: ', tra[i].bono:4:2);

WriteLn('Total: ', tra[i].sal_mensual:4:2);

end;

end;

writeln('Pulse una tecla para continuar');

repeat until keypressed;

end;

procedure reporte2;

begin

clrscr;

for i := 1 to cantidad do

begin

if tra[i].salario <= 1500 then

begin

writeln('Nombre del trabajador: ', tra[i].nombre);

WriteLn('Salario: ', tra[i].salario:4:2);

WriteLn('Cestaticket: ', cesta);

WriteLn('Total: ', tra[i].sal_mensual:4:2);

end;

end;

writeln('Pulse una tecla para continuar');

repeat until keypressed;

end;

procedure borrarTrabajador;

begin

clrscr;

write('Nombre a buscar: ');

readln(textoBuscar);

seBorro := false;

for i := 1 to cantidad do begin

{ReadLn(tra[cantidad].nombre);}

if (textoBuscar = tra[i].nombre) then

begin

seBorro := true;
dec(cantidad);

with tra[i] do begin

nombre:='';

salario:=0;

sal_anual:=0.0;

sal_mensual:=0.0;

utilidades:=0;

vacaciones:=0;

bono:=0;

end;

end;

end;

writeln('Pulse una tecla para continuar');

repeat until keypressed;

end;

procedure promedioNominaMayor;

begin

clrscr;

acumMedia:= 0; contMedia:= 0;

for i := 1 to cantidad do

if tra[i].salario > 1500 then

begin

acumMedia := acumMedia + tra[i].salario;

inc(contMedia);

end;

if (contMedia = 0) then

writeln('No hay trabajadores con salario mayor de 1500')

else

writeln('Promedio Nomina Mayor es: ', acumMedia/contMedia:4:2);

writeln('Pulse una tecla para continuar');

repeat until keypressed;

end;

procedure promedioNominaMenor;

begin

clrscr;

acumMedia:= 0; contMedia:= 0;

for i := 1 to cantidad do

if tra[i].salario <= 1500 then

begin

acumMedia := acumMedia + tra[i].salario;

inc(contMedia);

end;

if (contMedia = 0) then

writeln('No hay trabajadores con salario menor o igual a 1500')

else

writeln('Promedio Nomina Menor es: ', acumMedia/contMedia:4:2);

writeln('Pulse una tecla para continuar');

repeat until keypressed;

end;

procedure promedioGeneral;

begin

clrscr;

if (cantidad = 0) then

writeln('No hay trabajadores registrados')

else

begin

acumMedia:= 0;

contMedia:= 0;

for i := 1 to cantidad do

begin

acumMedia := acumMedia + tra[i].salario;

inc(contMedia);

end;

writeln('Promedio general es: ', acumMedia/contMedia:4:2);

end;

writeln('Pulse una tecla para continuar');

repeat until keypressed;

end;

procedure listaTrabajadoresGananMasQueMayores;

begin

clrscr;

writeln('Trabajadores Menores que ganan mas que Mayores:');

for i:= 1 to cantidad do {Bucle principal busca trabajadores menores}

if tra[i].salario <= 1500 then

begin

trabajadorMenor := tra[i];

for j:= 1 to cantidad do {Bucle anidado busca empleados mayores para comparar salario anual}

if (tra[j].salario > 1500) and (tra[j].sal_anual < trabajadorMenor.sal_anual) then
{trabajador menor gana mas que un trabajador mayor, mostramos sus datos}
begin

writeln();

write('El trabajador menor con Nombre: ', trabajadorMenor.nombre);

writeln(' y Salario Anual: ', trabajadorMenor.sal_anual:4:2);

write('Gana mas que el trabajador mayor con Nombre: ', tra[j].nombre);

writeln(' cuyo Salario Anual es: ', tra[j].sal_anual:4:2);

break; {Cerramos bucle anidado, no es necesario seguir buscando para este trabajador Menor}

end;

end;

writeln('Pulse una tecla para continuar');

repeat until keypressed;

end;

{
* La siguiente seccion es opcional.
* Podemos poner código que queremos que se ejecute
* al iniciarse el programa, como inicializar variables.}

begin

cantidad := 0;

end.


uses GestionTrabajador, crt;

var

opcion: integer;
 
{Cuerpo del programa principal}
 
begin
 
    repeat

clrscr;

        WriteLn('***BIENVENIDO A ACME***');
 
        WriteLn;
 
        WriteLn('1- Agregar Trabajador');
 
        WriteLn('2- Todos los trabajadores');
 
        WriteLn('3- Buscar a un trabajador');
 
        WriteLn('4- Reporte 1');
 
        WriteLn('5- Reporte 2');
 
WriteLn('6- Eliminar trabajador');
 
WriteLn('7- Promedio Nomina Mayor');
 
WriteLn('8- Promedio Nomina Menor');
 
WriteLn('9- Promedio General');

writeln('10- Trabajadores de Nomina Menor que ganan mas que algunos de Nomina Mayor');
 
        WriteLn('0- Salir');
 
        Write('Escoja una opcion: ');
 
        ReadLn(opcion);
 
        WriteLn;
 
 
 
        case opcion of
 
1:
agregarTrabajador;
 
            2:
mostrarTodos;
 
            3:
buscarTrabajador;
 
            4:
reporte1;
 
            5:
reporte2;
 
            6:
borrarTrabajador;
 
            7:
promedioNominaMayor;
 
            8:
promedioNominaMenor;
 
            9:
promedioGeneral;

10:

listaTrabajadoresGananMasQueMayores;
 
0: { salir}
 
begin
 
WriteLn;
 
WriteLn('Saliendo...');
 
WriteLn;
 
                end;
 
             else
 
                begin
 
WriteLn;
 
WriteLn('Opción incorrecta!');
 
WriteLn;
 
                end;
 
        end;  { Fin de "case" }
 
    until opcion = 0;
 
end.

me dan errores de compilacion. quizas no estoy entendiendo muy bien la situacion.

quizas deberia agregarlos a pascal en la direccion que has escrito

Citar
C:\FPC\3.0.4\units\x86_64-win64\rtl-console

en mi caso la direccion en mi computadora.

muchas gracias y disculpa

4
este es parte de un programa en pascal anterior. para tener una referencia de lo que quizas se pudiese hacer.

Código: [Seleccionar]
program turismotoursven;

uses

 

  sysutils,dateutils,crt;

  {las bibliotecas,sysutils y dateutilis,}

  {solucionan de una manera sencilla}

  {rutinas relacionadas con fechas}

 

const

  archivo  = 'DATOS.dat';

  temporal = 'TEMPO.dat';

 

type

  TElturista = record

  Numeropas : longint;       {numero de pasaporte}

  Nombreape : string[60];    {nombre y apellido}

  origenpas : char;          {origen de pasaporte}

    fechapas,                {Fecha Exp. pasaporte}

   fechavac,                 {Fecha Exp. certificado vacuna}

   fechadec: TDate;          {Fecha Exp. declaracion de impuestos}

end;

 

var

  f : file of TElturista;                 {Archivo maestro}

  datos,aux,cop: TElturista;              {auxiliares para guardar los datos}

  Rmarcado,registro,registro2 :integer;   {variables indice}

 

function existearchivo : boolean;

  begin

    assign(f,archivo);

    {$I-} reset(f); {$I+}

    if ioresult = 0 then

      existearchivo := true

    else

      existearchivo := false;

  end;

 

function Expedicion(fecha:TDate) : integer;

  begin

    DaysBetween(Date,fecha);

  end;

 

  {para la solucionar el problema de la vigencia de las fechas}

  {se utiliza daysbetween,date and Incyear recordando que }

  {un anho tiene 365 o 366 dias y dos anhos tiene 730 o 731 dias}

 

function anhos(ano:byte) : integer;

  begin

    DaysBetween(Date,Incyear(Date,-ano));

  end;

 

function existeregistro(var num:longint) : boolean;

  var

    encontrado: boolean;     {Determina la existencia de un registro}

  begin

    encontrado := false;

    for Registro := 0 to filesize(f) - 1 do

      begin

        seek(f,Registro);

        read(f,aux);

        if aux.Numeropas = num then

          begin

            encontrado := true;

            Rmarcado := Registro;

            break;

          end;

      end;

    if encontrado = true then

      existeregistro := true

    else

      existeregistro := false;

  end;

 

procedure guardardatos(var aux:TElturista);

  begin

          if existearchivo then

            begin

              seek(f,filesize(f));

            end

          else

            begin

              rewrite(f);

              seek(f,0);

            end;

              write(f,aux);

              close(f);

              clrscr;

              writeln(' Datos guardado Pulse una tecla');

              readkey;

  end;

 

procedure mensaje;

  begin

    writeln(' Nota: Antes de continuar es importante que lea esto: ');

    writeln;

    textcolor(11);

    writeln('   -El campo 1:Nombre y apellido, admite solo letras y espacios. ');

    writeln('   -El campo 2:Numero de pasaporte, admite solo numeros. ');

    writeln('   -El campo 3:Origen de pasaporte, admite solo una letra V/E. ');

    writeln('   -El formato de fecha en los campos 4,5 y 6 es: DD/MM/AAAA .  ');

    if Monthof(date) in [1..9] then

      writeln('           Alternativa 1: DD/','0', MonthOf(date),'/',YearOf(date)      )

    else

      writeln('           Alternativa 1: DD/','', MonthOf(date),'/',YearOf(date)      );

      writeln('           Alternativa 2: DD/MM/',YearOf(date),'      ');

      writeln('           Alternativa 3: DD/MM/20AA                 '     );

      textcolor(white);

      writeln;

      writeln('    Pulse [S] continuar [N] Volver al menu  ');

    end;

 

procedure pasaportevalido(var num:longint);

  var

    strnum:string;             {auxiliar del numero de pasaporte}

    valido : boolean;   {Booleano para validar el campo}

 

  begin

    repeat

      repeat

        readln(strnum);

        val(strnum,num);

        if num < 1 then

          begin

            textcolor(yellow);

            write('        *Por favor,introduzca solo numeros*       : ');

            textcolor(white);

          end;

       until num >= 1;

       valido := true;

       if existearchivo then

         begin

           if existeregistro(num) then

             begin

               valido := false;

               textcolor(yellow);

               writeln('        Este numero ya esta en el sistema,         ');

               write('          *vuelva a introducirlo*                 : ');

               textcolor(white);

             end;

           close(f);

         end;

    until (valido = true);

  end;

 

procedure origenvalido(var opcion:char);

  begin

         repeat

           opcion:= upcase(readkey);

         until opcion in['E','V'];

         writeln(opcion);

  end;

 

procedure fechavalida( var fecha:TDate);

  var

     valido:boolean;  {Booleano para validar el campo}

     strfecha:string;

  begin

      repeat

        ReadLn(strfecha);

        valido:=TryStrToDate(strfecha,fecha);

        if valido = false then

          begin

                         textcolor(12);

            writeln('       *por favor,fecha en formato DD/MM/AAAA*     ');

            if Monthof(date) in [1..9] then

              writeln('           Alternativa 1: DD/','0', MonthOf(date),'/',YearOf(date)      )

            else

              writeln('           Alternativa 1: DD/','', MonthOf(date),'/',YearOf(date)      );

              writeln('           Alternativa 2: DD/MM/',YearOf(date),'      ');

              writeln('           Alternativa 3: DD/MM/20AA                 '     );

            textcolor(yellow);

              Write('      Introduzca nuevamente  la fecha             : ');

            textcolor(white);

          end;

      until valido=true ;

      if fecha > incyear(date,50) then

        fecha := incyear(fecha,-100);

  end;

 

procedure mostrardatos(var aux:TElturista);

  begin

    with aux do

      begin

        writeln('   Nombre y Apellido               = ',upcase(Nombreape));

        writeln('   Numero de pasaporte             = ',numeropas);

        writeln('   Origen de pasaporte             = ',origenpas);

        writeln('   Fecha del pasaporte             = ',DatetoStr(fechapas));

        writeln('   Fecha Certificado de vacuna     = ',DatetoStr(fechavac));

        writeln('   Fecha Declaracion de impuestos  = ',DatetoStr(fechadec));

        writeln;

        if (((Expedicion(fechapas)> anhos(1)) and (Origenpas='V')) or

           ((Expedicion(fechapas) > anhos(2)) and (Origenpas='E')))

          or (Expedicion(fechavac) > anhos(1))

          or (Expedicion(fechadec) > anhos(1)) then

            writeln('  "RECAUDOS NO VIGENTES"');

      end;

  end;

 

procedure NombreYapellidovalido(var nomb:string);

type

  TAscii = set of #1..#255;

  var

    alfabeto,espacio:TAscii;

    valido : boolean;           {Booleano para validar el campo}

    caracter  : byte;

 

  begin

        alfabeto:=[#65..#90,#97..#122,#165..#166];

        espacio :=[#32];

        repeat

          valido := true;

          readln(nomb);

          for caracter := 1 to length(nomb) do

            begin

              if nomb[caracter] in alfabeto+espacio then

                 begin

                 end

              else

                begin

                  valido := false;

                  break;

                end;

              end;

              if valido = false then

                begin

                  textcolor(yellow);

                  write('     *Por favor,introduzca solo letras y espacio* : ');

                  textcolor(white);

                end;

         until valido = true;

  end;

 

 

procedure entradadatos;

  var

    opcion : char;         {tecla de opciones}

 

  begin

    clrscr;

    with datos do

      begin

        writeln('                                                   ',datetostr(Date));

        writeln('    ****** Entrada Datos turista ******');

        writeln;

        write('  1) Ingrese    Nombre    y    Apellido           : ');

        {En este campo solo se admiten letras y/o espacios}

        NombreYapellidovalido(nombreape);

 

         write('  2) Ingrese   Numero   pasaporte                 : ');

         {En este campo solo se admiten numeros}

         {Este campo no admitira 2 numeros de pasaporte iguales}

         pasaportevalido(numeropas);

 

         write('  3) Ingrese   Origen   del   pasaporte   [V/E]   : ');

         {V= Venezolano  E=Extranjero}

         origenvalido(origenpas);

 

         Write('  4) Ingrese   fecha   del   Pasaporte            : ');

         {La fecha debe ser en formato D/M/AA}

         fechavalida(fechapas);

 

         Write('  5) Ingrese fecha del certificado de vacuna      : ');

         {La fecha debe ser en formato D/M/AA}

         fechavalida(fechavac);

 

         Write('  6) Ingrese fecha de la declaracion de impuestos : ');

         {La fecha debe ser en formato D/M/AA}

         fechavalida(fechadec);

       end;

 

    clrscr;

    writeln('   Ha introducido los siguientes datos: ');

    writeln;

    mostrardatos(datos);

    writeln;

    writeln('   Desea Guardar Los Datos? ');

    writeln;

    writeln('    Pulse [S/N]');

      repeat

      opcion := upcase(readkey);

      until opcion in['S','N'];

      if opcion = 'S' then

         guardardatos(datos);

  end;

 

procedure busqueda;

  var

    num:longint;

  begin

    if not existearchivo  then

      begin

        writeln('  Error De Archivo O No Existe Pulse Una Tecla');

        readkey;

        exit;

      end

    else

      begin

        write('   Entre numero de pasaporte : ');

        readln(num);

        if existeregistro(num) then

          begin

            writeln;

            mostrardatos(aux);

          end

        else

          begin

            writeln;

            writeln('   No se encuentran datos del turista ');

          end;

        writeln;

        writeln('   Pulse una tecla   ');

        readkey;

        close(f);

      end;

  end;

 

procedure ordenar;

  {Existe un famoso metodo llamado Burbuja}

  {Con este metodo se ordenaran los datos por el numero de pasporte}

  begin

    if not existearchivo then

      begin

        writeln('  Error De Archivo O No Existe Pulse Una Tecla');

        readkey;

        exit;

      end

    else

      begin

       for registro := 0 to filesize(f) - 1 do

        for registro2 := registro + 1 to filesize(f) - 1 do

          begin

            seek(f,registro);

            read(f,datos);

            seek(f,registro2);

            read(f,Cop);

            if datos.Numeropas > Cop.Numeropas then

              begin

                Aux := datos;

                datos := Cop;

                Cop := Aux;

                seek(f,registro);

                write(f,datos);

                seek(f,registro2);

                write(f,Cop);

              end;

          end;

        close(f);

      end;

  end;

 

procedure modificacion;

   var

     opcion : char;           {tecla de opciones}

     num:longint;

 

    begin

     clrscr;

     if not existearchivo then

       begin

         writeln('  Error De Archivo O No Existe Pulse Una Tecla');

         readkey;

         exit;

       end

     else

       begin

         write('   Entre numero de pasaporte : ');

         readln(num);

         if existeregistro(num) then

           begin

             repeat

               clrscr;

               with aux do

                 begin

                   writeln('                                       ',Datetostr(Date));

                   writeln('  **** Modificacion De Datos ****');

                   writeln;

                   writeln('  Numero de pasaporte    ' ,numeropas);

                   writeln;

                   write(' [1] = Nombre y Apellido               ') ;textcolor(11);writeln(upcase(Nombreape));textcolor(white);

                   write(' [2] = Origen del pasaporte            ') ;textcolor(11);writeln(origenpas);textcolor(white);

                   write(' [3] = Fecha del pasaporte             ') ;textcolor(11);writeln(DatetoStr(fechapas));textcolor(white);

                   write(' [4] = Fecha Certificado vacuna        ') ;textcolor(11);writeln(DatetoStr(fechavac));textcolor(white);

                   write(' [5] = Fecha declaracion de impuestos  ') ;textcolor(11);writeln(DatetoStr(fechadec));textcolor(white);

                   writeln(' [6] = finalizar');

                   writeln;

                 end;

               repeat

                 opcion := readkey;

               until opcion in[#49..#54];

               with aux do

               case opcion of

                 #49 : begin

                         write('  Ingrese    Nombre    y    Apellido              : ');

                         NombreYapellidovalido(Nombreape);

                       end;

                 #50 : begin

                         write('  Ingrese   Origen   del   pasaporte   [V/E]      : ');

                         origenvalido(origenpas);

                       end;

                 #51 : begin

                         Write('  Ingrese   fecha   del   Pasaporte               : ');

                         fechavalida(fechapas);

                       end;

                 #52 : begin

                         Write('  Ingrese fecha del certificado de vacuna         : ');

                         fechavalida(fechavac);

                       end;

                 #53 : begin

                         Write('  Ingrese fecha de la declaracion de impuestos    : ');

                         fechavalida(fechadec);

                       end;

               end;

             until opcion = #54;

             seek(f,Rmarcado);

             write(f,aux);

           end

         else

           begin

             writeln('   Dato No Encontrado Pulse Una Tecla');

             readkey;

           end;

       close(f);

       end;

    end;

 

procedure anularegistro;

  var

           faux: file of TElturista; {Archivo auxiliar}

            opcion : char;             {tecla de opciones}

            num: longint;

 

  begin

    if not existearchivo  then

      begin

writeln(' Error de Archivo o no existe Pulse Una Tecla');

        readkey;

        exit;

      end

    else

      begin

           write('   Entre numero de pasaporte : ');

           readln(num);

   if existeregistro(num) then

     begin

               writeln;

               mostrardatos(aux);

               writeln;

               writeln('  <<< Esta Seguro Que Desea Eliminar Este registro? [S/N] >>>');

       repeat

opcion := upcase(readkey);

       until opcion in['S','N'];

       if opcion = 'S' then

         begin

   assign(faux,temporal);

   rewrite(faux);

   for registro := 0 to filesize(f) - 1 do

     begin

       seek(f,registro);

       if registro <> Rmarcado then

begin

   read(f,aux);

   seek(faux,filesize(faux));

   write(faux,aux);

end;

     end;

   close(f);

   close(faux);

   erase(f);

   rename(faux,archivo);

                   clrscr;

                   writeln(' Datos eliminado Pulse una tecla');

                   readkey;

end;

       if opcion = 'N' then

begin

   close(f);

end;

     end

   else

     begin

               writeln(' Datos no encontrado Pulse una tecla');

               readkey;

       close(f);

     end;

       end;

  end;

 

procedure mostrar;

  begin

   if not existearchivo  then

      begin

        exit;

      end

     else

      begin

        writeln('    <<< Listado Ordenado  >>> ');

        writeln;

        While not EOF(f) do

          begin

            read(f,datos);

            if datos.Numeropas <> 0 then

                begin

                writeln('    ',datos.Numeropas,' ',upcase(datos.Nombreape));

                end;

           end;

           close(f);

         writeln;

         writeln(' <<< Pulse Una Tecla Para Regresar >>>');

         readkey;

        end;

  end;

 

procedure contador;

  var

            vene,          {Contador de turistas venezolanos}

           extra,          {contador de turistas extranjeros}

           vacun,          {contador de turistas con fecha de vacuna vencida}

           impue,          {contador de turistas con fecha de declaracion vencida}

           recau:integer;  {contador de turistas con recaudos vigentes}

  begin

    if not existearchivo then

      begin

        writeln('  Error De Archivo O No Existe Pulse Una Tecla  ');

        readkey;

        exit;

      end

     else

      begin

        vene := 0;

        extra := 0;

        vacun := 0;

        impue := 0;

        recau := 0;

        While not EOF(f) do

          begin

            read(f,datos);

            with datos do

            if (Numeropas <> 0) then

              begin

               if (origenpas='V') then

                  inc(vene);

                if (origenpas='E') then

                  inc(extra);

                if (Expedicion(fechavac)>anhos(1)) then

                  inc(vacun);

                if (Expedicion(fechadec)>anhos(1)) then

                  inc(impue);

                if (((Expedicion(fechapas)<=anhos(1)) and (Origenpas='V')) or

                   ((Expedicion(fechapas)<=anhos(2)) and (Origenpas='E')))

                  and (Expedicion(fechavac)<=anhos(1))

                  and (Expedicion(fechadec)<=anhos(1)) then

                    inc(recau);

               end;

         end;

         clrscr;

         writeln('    <<< Datos>>>');

         writeln;

         WriteLn('  turistas venezolanos                  ',vene);

         WriteLn('  turistas extranjeros                  ',extra);

         WriteLn('  turistas con c. de vacuna vencido     ',vacun);

         WriteLn('  turistas con d. de impuestos vencido  ',impue);

         WriteLn('  turistas con Recaudos  vigentes       ',recau);

         close(f);

         writeln;

         writeln(' <<< Pulse Una Tecla Para Regresar >>>');



Muchas gracias

5
muchas gracias ya descargo el archivo y te indico mis dudas

ahora


Una forma que se me ocurre para por ejemplo evitar que se ingrese una cédula con caracteres no admitidos (letras, símbolos, etc...) es crear una función booleana.
No se si ya has trabajado con procedimientos y funciones.


esa era una des las preguntas que te iba a realizar si no se podria hacer todo el programa con diferentes procedimientos y funciones ya que como bien dices es muy limitado

Me he guiado en varios trabajos anteriores de ejemplos y he visto que han usado estos procedimientos. ya le he preguntado a la profesora si se puede hacer, pero si se pudiese habria que realizar el programa desde cero otra vez o habria alguna forma de usar lo que ya se tiene.

muchas gracias

6
Gracias por tu respuesta. no he podido escribir ya que mi internet me ha causado muchos problemas.

No he podido hablar con la profesora ya que las clases en la universidad se encuentran suspendidas por el coronavirus, pero le he enivado un correo electronico con el programa y las dudas que se tienen.

pero me gustaria que me pudieses ayudar con respecto a el case 1 en especial el apartado cedula y nombre del trabajador

si el nombre y la cedula del trabajador estan en string como podriamos evitar que se coloquen caracteres que no deberian ir por ejemplo la cedula deberia ser solo numero y el nombre solo letras.

como se solventaria esta situacion

tambien he cambiado de heany a notepad++ ya que geany me ha presentado fallos.

muchisimas gracias por tu ayuda y en lo que tenga respuesta de la profesora te las hare saber

7
Muchas gracias amigo me has ayudado mucho le he enviado a la profesora y me ha dado ciertos tips que decido compartirlos

1 me sugirio que no solo aparecieran los trabajadores menor ganan mas si no que aparecieran en pantalla cuales son los trabajadores mayores haciendo la comparacion. Por ejemplo si el trabajador menor 2 gana mas que el trabajador mayor 1 entonces deben aparecer los dos en pantalla

2. he agregado el valor cedula al codigo por sugerencia de la profesora pero este lo he puesto de forma string ya que no me compilaba como integer. Como podria hacer para que fuera solo integer y que no reconociera otra cosa si no numeros.

3. le he colocado al codigo el comando clrscr para hacer el programa mas amigable pero este no me deja compilarlo me gustaria saber porque ocurre este error.

Esperando tu pronta respuesta.

Muchas gracias por tu ayuda.

inserto el codigo como esta ahora

Código: [Seleccionar]
program ACME;

type
 
    tipoPersona = record
 
        nombre: string;
 
        salario: real;
 
sal_anual: real;
 
sal_mensual: real;
 
utilidades: real;

vacaciones: real;
 
bono: real;
 
cedula: string;
 
    end;
 
const
 
capacidad = 1000;

cesta = 200;
 
var
 
tra: array[1..capacidad] of tipoPersona;

trabajadorMenor: tipoPersona;
 
    cantidad: integer;
 
    opcion: integer;
 
    i, j: integer;
 
    textoBuscar: string;
 
    encontrado: boolean;
 
bono: real;
 
seBorro:boolean;
 
acumMedia :real;
 
contMedia: integer;
 
 
 
 
 
{Cuerpo del programa principal}
 
begin
 
cantidad := 0;
 
    repeat

clrscr;

        WriteLn('***BIENVENIDO A ACME***');
 
        WriteLn;
 
        WriteLn('1- Agregar Trabajador');
 
        WriteLn('2- Todos los trabajadores');
 
        WriteLn('3- Buscar a un trabajador');
 
        WriteLn('4- Reporte 1');
 
        WriteLn('5- Reporte 2');
 
WriteLn('6- Eliminar trabajador');
 
WriteLn('7- Promedio Nomina Mayor');
 
WriteLn('8- Promedio Nomina Menor');
 
WriteLn('9- Promedio General');

writeln('10- Trabajadores de Nomina Menor que ganan mas que algunos de Nomina Mayor');
 
        WriteLn('0- Salir');
 
        Write('Escoja una opcion: ');
 
        ReadLn(opcion);
 
        WriteLn;
 
 
 
        case opcion of
 
1: { Agregar trabajador }

clrscr;
 
if (cantidad < capacidad) then
 
                begin
 
inc(cantidad);
 
                    WriteLn('Introduciendo al trabajador ', cantidad);
 
                    Write('Introduzca Cedula del trabajador: ');
 
                    ReadLn(tra[cantidad].cedula);

Write('Introduzca el nombre del trabajador: ');
 
                    ReadLn(tra[cantidad].nombre);
 
                    Write('Introduzca Salario: ');
 
                    ReadLn(tra[cantidad].salario);
                   
                    with tra[cantidad] do begin
                   
if salario > 1500 then begin

utilidades := salario * 2;{2 meses de utilidades}

vacaciones := salario;{1 mes de bono vacacional}

bono := salario * 0.1;{10% productividad, se paga mensual}

sal_mensual := salario + bono;

sal_anual := sal_mensual * 12 + utilidades + vacaciones;

end

else begin {salario es <= a 1500}

utilidades := salario * 4;{4 meses de utilidades}

vacaciones := salario;{1 mes de bono vacacional}

sal_mensual := salario  + cesta;{cesta ticket mensual}

sal_anual := sal_mensual * 12 + utilidades + vacaciones;

end;
                   
                    end;
 
end;
 
            2: {Todos los trabajadores}

clrscr;

begin

if cantidad = 0 then
 
WriteLn('No hay datos')
 
else
 
for i := 1 to cantidad do
 
WriteLn(i,' ',tra[i].cedula,' ',tra[i].nombre,' ',tra[i].salario:4:2);
 
WriteLn;
 
end;
 
            3:  {Buscar a un trabajador}

clrscr;
 
                begin
 
Write('Escriba cedula del trabajador ');
 
ReadLn( textoBuscar );
 
encontrado := false;
 
for i := 1 to cantidad do
 
if pos (textoBuscar, tra[i].cedula) > 0 then
 
begin
 
encontrado := true;
 
WriteLn( i,' - Cedula: ', tra[i].cedula,',Nombre: ', tra[i].nombre,', Salario: ', tra[i].salario:4:2);
 
end;
 
if not encontrado then
 
WriteLn('No se ha encontrado.');
 
WriteLn;
 
                end;
 
            4:  {Reporte 1 }

clrscr;
 
for i := 1 to cantidad do
 
                begin
 
if tra[i].salario > 1500 then
 
begin
 
writeln('Nombre del trabajador: ', tra[i].nombre);
 
WriteLn('Salario: ', tra[i].salario:4:2);
 
WriteLn('Bono: ', tra[i].bono:4:2);
 
WriteLn('Total: ', tra[i].sal_mensual:4:2);
 
end;
 
                end;
 
            5: { Reporte 2}

clrscr;
 
for i := 1 to cantidad do
 
                begin
 
if tra[i].salario <= 1500 then
 
begin
 
writeln('Nombre del trabajador: ', tra[i].nombre);
 
WriteLn('Salario: ', tra[i].salario:4:2);
 
WriteLn('Cestaticket: ', cesta);
 
WriteLn('Total: ', tra[i].sal_mensual:4:2);
 
end;
 
                end;
 
            6: {Borra un trabajador}
 
begin
 
write('Nombre a buscar: ');
 
readln(textoBuscar);
 
seBorro := false;
 
for i := 1 to cantidad do begin
 
{ReadLn(tra[cantidad].nombre);}
 
if (textoBuscar = tra[i].nombre) then
 
begin
 
seBorro := true;
dec(cantidad);
 
with tra[i] do begin
 
nombre:='';
 
salario:=0;
 
sal_anual:=0.0;
 
sal_mensual:=0.0;
 
utilidades:=0;
 
vacaciones:=0;
 
bono:=0;
 
end;
 
end;
 
end;
end;
 
            7: {Promedio Nomina Mayor}
 
clrscr;

begin

acumMedia:= 0;

contMedia:= 0;
 
for i := 1 to cantidad do
 
if tra[i].salario > 1500 then
 
begin
 
acumMedia := acumMedia + tra[i].salario;

inc(contMedia);
 
end;

if (contMedia = 0) then

writeln('No hay trabajadores con salario mayor de 1500')

else
 
writeln('Promedio Nomina Mayor es: ', acumMedia/contMedia:4:2);
end;
 
            8: {Promedio Nomina Menor}
 
clrscr;

begin

acumMedia:= 0;

contMedia:= 0;
 
for i := 1 to cantidad do
 
if tra[i].salario <= 1500 then
 
begin
 
acumMedia := acumMedia + tra[i].salario;

inc(contMedia);
 
end;

if (contMedia = 0) then

writeln('No hay trabajadores con salario menor o igual a 1500')

else

writeln('Promedio Nomina Menor es: ', acumMedia/contMedia:4:2);
end;
 
            9: {Promedio general}
 
clrscr;

begin

if (cantidad = 0) then

writeln('No hay trabajadores registrados')

else

begin

acumMedia:= 0;

contMedia:= 0;

for i := 1 to cantidad do

begin

acumMedia := acumMedia + tra[i].salario;

inc(contMedia);

end;

writeln('Promedio general es: ', acumMedia/contMedia:4:2);

end;
end;

10: {Trabajadores Menores que ganan mas que Mayores}

clrscr;

begin

writeln('Trabajadores Menores que ganan mas que Mayores:');

for i:= 1 to cantidad do {Bucle principal busca trabajadores menores}

if tra[i].salario <= 1500 then

begin

trabajadorMenor := tra[i];

for j:= 1 to cantidad do {Bucle anidado busca empleados mayores para comparar salario anual}

if (tra[j].salario > 1500) and (tra[j].sal_anual < trabajadorMenor.sal_anual) then
{trabajador menor gana mas que un trabajador mayor, mostramos sus datos}
begin

writeln();

writeln('Nombre:', trabajadorMenor.nombre);

writeln('Salario Anual:', trabajadorMenor.sal_anual:4:2);

break; {Cerramos bucle anidado, no es necesario seguir buscando para este trabajador Menor}

end;

end;

end;

 
0: { salir}
 
begin
 
WriteLn;
 
WriteLn('Saliendo...');
 
WriteLn;
 
                end;
 
             else
 
                begin
 
WriteLn;
 
WriteLn('Opción incorrecta!');
 
WriteLn;
 
                end;
 
        end;  { Fin de "case" }
 
    until opcion = 0;
 
end.

8
Muchas gracias amigo me has ayudado mucho. adjunto al final el enunciado para que lo puedas verificar con el código. Le he cambiado algunas cosas al código como agregarle la cédula de identidad al trabajador pero me surge una duda uno de los puntos es que el programa deberia escribir que trabajador de la nomina menor gana mas que uno de la nomina mayor (salario anual).

He incluido el numero de cedula de identidad ya que la profesora me ha sugerido para resolver este problema usar el metodo de ordenamiento de la burbuja he investigado algo por internet y los ejemplos que aprecen son para las listas y no para arrays como el del programa.

mi pregunta seria si seria igual o hay que hacer algo extra

muchisimas gracias por tu ayuda aqui dejo el codigo hasta ahora

P.D: la cedula es el numero de identificacion personal en mi pais y la cestaticket es un bono de alimentacion que se le da a cada trabajador.

Código: [Seleccionar]
program ACME;
 
type
 
    tipoPersona = record
 
        nombre: string;
 
        salario: real;
sal_anu: real;
sal_anual: real;
sal_men: real;
sal_mensual: real;
utili, utilidades, vaca, vacaciones: real;
bono: real;
cedula :string;
    end;
 
const
 
capacidad = 1000;
 
var
 
tra: array[1..capacidad] of tipoPersona;
 
    cantidad: integer;
    opcion: integer;
    i: integer;
    textoBuscar: string;
    encontrado: boolean;
bono: real;
cesta: integer;
seBorro:boolean;
acumMedia :real;
contMedia: integer;
 
 
{Cuerpo del programa principal}
 
begin
cantidad := 0;
 
    repeat
        WriteLn('***BIENVENIDO A ACME***');
        WriteLn;
        WriteLn('1- Agregar Trabajador');
        WriteLn('2- Todos los trabajadores');
        WriteLn('3- Buscar a un trabajador');
        WriteLn('4- Reporte 1');
        WriteLn('5- Reporte 2');
WriteLn('6- Eliminar trabajador');
WriteLn('7- Promedio Nomina Mayor');
WriteLn('8- Promedio Nomina Menor');
WriteLn('9- Promedio General');
        WriteLn('0- Salir');
        Write('Escoja una opcion: ');
        ReadLn(opcion);
        WriteLn;
 
 
 
        case opcion of
1: { Agregar trabajador }
 
if (cantidad < capacidad) then
 
                begin
 
inc(cantidad);
 
                    WriteLn('Introduciendo al trabajador ', cantidad);
                    Write('Introduzca Cedula del trabajador: ');
                    ReadLn(tra[cantidad].cedula);
Write('Introduzca el nombre del trabajador: ');
                    ReadLn(tra[cantidad].nombre);
                    Write('Introduzca Salario: ');
                    ReadLn(tra[cantidad].salario);
for i:=1 to cantidad do
begin
if tra[i].salario > 1500 then begin
 
with tra[i] do begin
 
       bono:=tra[i].salario*0.1;
utilidades:=tra[i].salario*2;
vacaciones:=tra[i].salario;
sal_mensual:=tra[i].salario+tra[i].bono;
 
sal_anual:=tra[i].sal_mensual*12+tra[i].vacaciones+tra[i].utilidades;
 
end;
 
end;
 
if tra[i].salario <= 1500 then
 
begin
cesta:=20;
with tra[i] do begin
vaca:=salario;
utili:=salario*4;
sal_men:=salario+cesta;
sal_anu:=sal_men*12+tra[i].vaca;
end;
end;
end;
end;
 
            2: begin {Todos los trabajadores}
 
if cantidad = 0 then
 
WriteLn('No hay datos')
 
else
 
for i := 1 to cantidad do
 
WriteLn(i, ' ',tra[i].cedula, tra[i].nombre, tra[i].salario:4:2);
 
WriteLn;
 
end;
 
            3:  {Buscar a un trabajador}
 
                begin
 
Write('Escriba cedula del trabajador ');
ReadLn( textoBuscar );
encontrado := false;
for i := 1 to cantidad do
if pos (textoBuscar, tra[i].cedula) > 0 then
begin
encontrado := true;
WriteLn( i,' - Cedula: ', tra[i].cedula,',Nombre: ', tra[i].nombre,', Salario: ', tra[i].salario:4:2);
end;
 
if not encontrado then
WriteLn('No se ha encontrado.');
WriteLn;
 
                end;
 
            4:  {Reporte 1 }
for i := 1 to cantidad do
 
                begin
 
if tra[i].salario > 1500 then
begin
writeln('Nombre del trabajador: ', tra[i].nombre);
WriteLn('Salario: ', tra[i].salario:4:2);
WriteLn('Bono: ', tra[i].bono:4:2);
WriteLn('Total: ', tra[i].sal_mensual:4:2);
 
end;
 
                end;
 
            5: { Reporte 2}
 
for i := 1 to cantidad do
 
                begin
 
if tra[i].salario <= 1500 then
 
begin
 
writeln('Nombre del trabajador: ', tra[i].nombre);
WriteLn('Salario: ', tra[i].salario:4:2);
WriteLn('Cestaticket: ', cesta);
WriteLn('Total: ', tra[i].sal_men:4:2);
end;
 
                end;
 
            6: {Borra un trabajador}
 
begin
 
write('Nombre a buscar: ');
readln(textoBuscar);
seBorro := false;
for i := 1 to cantidad do begin
{ReadLn(tra[cantidad].nombre);}
if (textoBuscar = tra[i].nombre) then
 
begin
 
seBorro := true;
dec(cantidad);
 
with tra[i] do begin
 
nombre:='';
salario:=0;
sal_anu:=0.0;
sal_anual:=0.0;
sal_men:=0.0;
sal_mensual:=0.0;
utili:=0;
utilidades:=0;
vaca:=0;
vacaciones:=0;
bono:=0;
 
end;
 
end;
 
end;
end;
 
            7: {Promedio Nomina Mayor}
 
begin

acumMedia:= 0;

contMedia:= 0;
 
for i := 1 to cantidad do
 
if tra[i].salario > 1500 then
 
begin
 
acumMedia := acumMedia + tra[i].salario;

inc(contMedia);
 
end;

if (contMedia = 0) then

writeln('No hay empleados con salario mayor de 1500')

else
 
writeln('Promedio Nomina Mayor es: ', acumMedia/contMedia:4:2);
end;
 
            8: {Promedio Nomina Menor}
 
begin

acumMedia:= 0;
contMedia:= 0;
 
for i := 1 to cantidad do
if tra[i].salario <= 1500 then
begin
acumMedia := acumMedia + tra[i].salario;
inc(contMedia);
end;

if (contMedia = 0) then

writeln('No hay empleados con salario menor o igual a 1500')

else

writeln('Promedio Nomina Menor es: ', acumMedia/contMedia:4:2);
end;
 
            9: {Promedio general}
 
begin
if (cantidad = 0) then
writeln('No hay trabajadores registrados')
else
begin

acumMedia:= 0;

contMedia:= 0;
for i := 1 to cantidad do
begin

acumMedia := acumMedia + tra[i].salario;

inc(contMedia);

end;

writeln('Promedio general es: ', acumMedia/contMedia:4:2);

end;
end;
 
           0: { salir}
 
begin
 
WriteLn;
WriteLn('Saliendo...');
WriteLn;
 
                end;
 
             else
 
                begin
 
WriteLn;
WriteLn('Opción incorrecta!');
WriteLn;
 
                end;
 
        end;  { Fin de "case" }
 
    until opcion = 0;
 
end.

ENUNCIADO O RÚBRICA DEL EJERCICIO

La empresa ACME C.A. quiere llevar un control de los sueldos de sus empleados. Existen 2 tipos de nómina: nómina mayor y nómina menor.
Los empleados que tienen nómina mayor deben tener un sueldo mensual superior a Bs 1.500.000, adicional se les paga 2 meses de utilidades, 1 mes de bono vacacional y un bono de productividad igual al 10% del sueldo (este bono se paga mensual)

Los empleados con nómina menor deben tener suelo igual o menor a Bs 1.500.000, adicional se les paga 4 meses de utilidades, 1 mes de bono vacacional y cesta ticket (Bs 200.000 mensual)

Para el control se requiere de un programa que pueda:

- Agregar empleado
- Consultar empleado
- Eliminar empleado
- Generar un listado de los empleados de la nómina mayor con datos de sueldo mensual y bono de productividad y que al final sean sumados
- Generar un listado de los empleados de la nómina menor que incluya el sueldo mensual y el cesta ticket y que al final sean sumados

Adicionalmente se pide:
- El promedio de sueldo por cada nómina y el promidio general
- Lista de empleados de nómina menor que ganan más que cualquier empleado de nómina mayor en cómputo anual

9
muchas gracias me ha ayudado mucho y he logrado resolver los errores de compilacion antes mencionados pero al compilar los codigos para el promedio de la nomina mayor y menor

Código: [Seleccionar]
7: {Promedio Nomina Mayor}

begin

for i := 1 to capacidad do begin

if tra[i].salario > 1500 then

begin

acum:=0;

acum:=acum+tra[i].sal_anual;

writeln('Promedio Nomina Mayor es:');

writeln('tra[i].acum/tra:4.2');

end;

end;

end;

           8: {Promedio Nomina Menor}

begin

for i := 1 to capacidad do begin

if tra[i].salario <= 1500 then

begin

acum2:= acum+ tra[i].sal_anu;

writeln('Promedio Nomina Menor es:');

writeln('tra[i].acum2/tra:4:2');

end;

end;

end;

y el promedio general

Código: [Seleccionar]
9: {Promedio general}

begin

for i := 1 to capacidad do begin

begin

sum:=0;

sum:=acum2+ acum;

writeln('Promedio general es:');

writeln('tra[i].sum/tra:4:2');

end;

end;

end;

me aparecen las siguientes notas:


Compiling prueba7.pas
prueba7.pas(45,2) Note: Local variable "bono" not used
prueba7.pas(49,2) Note: Local variable "seBorro" is assigned but never used
prueba7.pas(55,2) Note: Local variable "sum" is assigned but never used
Linking prueba7.exe
405 lines compiled, 0.5 sec, 44928 bytes code, 3332 bytes data
3 note(s) issued
La compilación ha terminado con éxito.

no entiendo porque aparecen.

ademas al ejecutar el programa cuando eligo las opciones de los promedios me aparece lo siguiente

Código: [Seleccionar]
promedio nomina mayor es
tra[i].acum/tra:4.2
promedio nomina mayor es
tra[i].acum/tra:4.2


Y no está calculando dichos promedios, me gustaria saber por qué no ocurre esto

Esperando su pronta respuesta muchas gracias

10
Buenas amigos me gustaría que me pudiesen ayudar con este programa en Pascal que debo crear y me está dando bastantes quebraderos de cabeza

Se me pide crear un programa que permita ingresar el nombre y el salario de los trabajadores de una empresa. así como también poder consultarlos y eliminarlos. También se me pide crear un promedio de sueldos entre trabajadores que ganen mas de 1500 y menos o igual a 1500 respectivamente.

este seria el código

Código: [Seleccionar]
program ACME;
 
type
 
    tipoPersona = record
 
        nombre: string;
 
        salario: real;
 
sal_anu: real;
 
sal_anual: real;
 
sal_men: real;
 
sal_mensual: real;
 
utili, utilidades, vaca, vacaciones: real;
 
bono: real;
 
cedula :integer;
 
    end;
 
const
 
capacidad = 1000;
 
var
 
tra: array[1..capacidad] of tipoPersona;
 
    cantidad: integer;
 
    opcion: integer;
 
    i: integer;
 
    textoBuscar: string;
 
    encontrado: boolean;
 
bono: real;
 
cesta: integer;
 
seBorro:boolean;
 
acum :real;
 
acum2 :real;
 
sum : real;
 
 
 
 
 
{Cuerpo del programa principal}
 
begin
 
cantidad := 0;
 
    repeat
 
        WriteLn('***BIENVENIDO A ACME***');
 
        WriteLn;
 
        WriteLn('1- Agregar Trabajador');
 
        WriteLn('2- Todos los trabajadores');
 
        WriteLn('3- Buscar a un trabajador');
 
        WriteLn('4- Reporte 1');
 
        WriteLn('5- Reporte 2');
 
WriteLn('6- Eliminar trabajador');
 
WriteLn('7- Promedio Nomina Mayor');
 
WriteLn('8- Promedio Nomina Menor');
 
WriteLn('9- Promedio General');
 
        WriteLn('0- Salir');
 
        Write('Escoja una opcion: ');
 
        ReadLn(opcion);
 
        WriteLn;
 
 
 
        case opcion of
 
1: { Agregar trabajador }
 
if (cantidad < capacidad) then
 
                begin
 
inc(cantidad);
 
                    WriteLn('Introduciendo al trabajador ', cantidad);
 
                    Write('Introduzca el nombre: ');
 
                    ReadLn(tra[cantidad].nombre);
 
                    Write('Introduzca Salario: ');
 
                    ReadLn(tra[cantidad].salario);
 
for i:=1 to cantidad do
 
begin
 
if tra[i].salario > 1500 then begin
 
with tra[i] do begin
 
bono:=tra[i].salario*0.1;
 
utilidades:=tra[i].salario*2;
 
vacaciones:=tra[i].salario;
 
sal_mensual:=tra[i].salario+tra[i].bono;
 
sal_anual:=tra[i].sal_mensual*12+tra[i].vacaciones+tra[i].utilidades;
 
end;
 
end;
 
if tra[i].salario <= 1500 then
 
begin
 
cesta:=20;
 
with tra[i] do begin
 
vaca:=salario;
 
utili:=salario*4;
 
sal_men:=salario+cesta;
 
sal_anu:=sal_men*12+tra[i].vaca;
 
end;
 
end;
 
end;
 
end;
 
            2: begin {Todos los trabajadores}
 
if cantidad = 0 then
 
WriteLn('No hay datos')
 
else
 
for i := 1 to cantidad do
 
WriteLn(i, ' ', tra[i].nombre, tra[i].salario:4:2);
 
WriteLn;
 
end;
 
            3:  {Buscar a un trabajador}
 
                begin
 
Write('Escriba el nombre del trabajador ');
 
ReadLn( textoBuscar );
 
encontrado := false;
 
for i := 1 to cantidad do
 
if pos (textoBuscar, tra[i].nombre) > 0 then
 
begin
 
encontrado := true;
 
WriteLn( i,' - Nombre: ', tra[i].nombre,', Salario: ', tra[i].salario:4:2);
 
end;
 
if not encontrado then
 
WriteLn('No se ha encontrado.');
 
WriteLn;
 
                end;
 
            4:  {Reporte 1 }
 
for i := 1 to cantidad do
 
                begin
 
if tra[i].salario > 1500 then
 
begin
 
writeln('Nombre del trabajador: ', tra[i].nombre);
 
WriteLn('Salario: ', tra[i].salario:4:2);
 
WriteLn('Bono: ', tra[i].bono:4:2);
 
WriteLn('Total: ', tra[i].sal_mensual:4:2);
 
end;
 
                end;
 
            5: { Reporte 2}
 
for i := 1 to cantidad do
 
                begin
 
if tra[i].salario <= 1500 then
 
begin
 
writeln('Nombre del trabajador: ', tra[i].nombre);
 
WriteLn('Salario: ', tra[i].salario:4:2);
 
WriteLn('Cestaticket: ', cesta);
 
WriteLn('Total: ', tra[i].sal_men:4:2);
 
end;
 
                end;
 
            6: {Borra un trabajador}
 
begin
 
write('Nombre a buscar: ');
 
readln(textoBuscar);
 
seBorro := false;
 
for i := 1 to capacidad do begin
 
{ReadLn(tra[cantidad].nombre);}
 
if (textoBuscar = tra[i].nombre) then
 
begin
 
seBorro := true;
 
with tra[i] do begin
 
nombre:='';
 
salario:=0;
 
sal_anu:=0.0;
 
sal_anual:=0.0;
 
sal_men:=0.0;
 
sal_mensual:=0.0;
 
utili:=0;
 
utilidades:=0;
 
vaca:=0;
 
vacaciones:=0;
 
bono:=0;
 
end;
 
end;
 
end;
 
            7: {Promedio Nomina Mayor}
 
begin
 
for i := 1 to capacidad do begin
 
if tra[i].salario > 1500 then
 
begin
 
acum := acum+ tra[i].sal_anual:4:2;
 
end;
 
writeln('Promedio Nomina Mayor es: ' acum/tra[cantidad].nombre:4:2);
end;
end;
 
            8: {Promedio Nomina Menor}
 
begin
 
for i := 1 to capacidad do begin
 
if tra[i].salario <= 1500 then
 
begin
 
acum := acum+ tra[i].sal_anu:4:2;
 
end;
 
writeln('Promedio Nomina Menor es: ' acum/tra[cantidad].nombre:4:2)
 
            9: {Promedio general}
 
begin
 
for i := 1 to capacidad do begin
 
begin
 
sum := acum2+ acum;
 
end;
 
writeln('Promedio general es: ' sum/tra[cantidad].nombre:4:2);
 
end;
 
           0: { salir}
 
begin
 
WriteLn;
 
WriteLn('Saliendo...');
 
WriteLn;
 
                end;
 
             else
 
                begin
 
WriteLn;
 
WriteLn('Opción incorrecta!');
 
WriteLn;
 
                end;
 
        end;  { Fin de "case" }
 
    until opcion = 0;
 
end.

El problema ocurre es cuando escribo los promedios de sueldos anuales para los trabajadores que ganan mas de 1500

Código: [Seleccionar]
7: {Promedio Nomina Mayor}
 
begin
 
for i := 1 to capacidad do begin
 
if tra[i].salario > 1500 then
 
begin
 
acum := acum+ tra[i].sal_anual:4:2;
 
end;
 
writeln('Promedio Nomina Mayor es: ' acum/tra[cantidad].nombre:4:2);
end;
end;

el código para el promedio de salario anual para trabajadores que ganan menos o igual a 1500

Código: [Seleccionar]
8: {Promedio Nomina Menor}
 
begin
 
for i := 1 to capacidad do begin
 
if tra[i].salario <= 15 then
 
begin
 
acum := acum+ tra[i].sal_anu:4:2;
 
end;
 
writeln('Promedio Nomina Menor es: ' acum/tra[cantidad].nombre:4:2)
end;
end;


y para el promedio de sueldos de todos los trabajadores.

al compilar aparecen los siguientes errores

Compiling prueba7.pas
prueba7.pas(309,5) Error: Label used but not defined "7"
prueba7.pas(309,5) Fatal: Syntax error, ";" expected but "BEGIN" found
Fatal: Compilation aborted

y no puedo saber si el resto del código compila correctamente.

mi pregunta es porque me ocurre ese error y como poder solucionarlo

esperando su pronta respuesta

muchas gracias

Páginas: [1]

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".