Pascal/Turbo Pascal - Situación del primer número primo

 
Vista:

Situación del primer número primo

Publicado por Sara Bretón Ruiz-Alejos (1 intervención) el 06/11/2006 18:37:27
Hola me llamo Sara y soy de La Rioja, he llegado a Madrid para hacer ingeniería técnica de informática este curso y me han mandado hacer una práctica de programación que no entiendo, además la profesora es malísima y yo he llegado sin tener ni idea de programar y no sé ni por donde empezar...pero la mayoría de la gente sabe lo que es programar y la he intentado hacer con manuales que me he descargado de internet pero me da errores, no sé por qué. Porfavor si alguien sabe cómo se hace, o me la puede corregir y explicarme la razón, que me conteste, aquí dejo la práctica y lo que he hech. Gacias.

PRÁCTICA 1 A.- Tipos simples y sentencias de control. Subprogramación.

Enunciado:
En el fichero de entrada hay grabada una secuencia de números enteros positivos. Codifíquese un programa Pascal para determinar la posición ocupada por el primer número primo. La posición del número queda definida por dos valores numéricos: el número de línea y el lugar del número primo dentro de la línea.

Si en el fichero no existe el número buscado se grabará el siguiente mensaje: ‘No existen primos en el fichero’.

Resolución:
La solución se ajustará a las siguientes especificaciones:

Especificaciones de entrada:
- Se utilizará un fichero de texto para la entrada de datos que debe llamarse datosp1.txt
En el código Pascal este fichero debe estar direccionado a la unidad a, es decir la sentencia assign
debe ser: assign (nombre_del_fichero, 'a :\datosp1.txt').
- Puede existir más de un número por línea y suponemos que todos los números están grabados correctamente, es decir, son enteros positivos y no existen en el fichero líneas en blanco.

Especificaciones de salida:
- Se utilizará el fichero estándar de salida: Output.
- Se recuerda que en la primera línea del Output aparecerán los datos: número de matrícula, apellidos y nombre del alumno que realiza la práctica.

Especificaciones de diseño:
- No se utilizarán estructuras de datos, salvo los ficheros de entrada y salida.
- No se admite la utilización de variables globales dentro de los subprogramas.
- Se recuerda que no se puede utilizar las unidades del Turbo Pascal ni del FreePascal.
- Se debe utilizar subprogramas. Se realizarán al menos una función que compruebe si un número entero positivo es o no primo.

Pruebas:
Deberá probarse la práctica contemplando distintas situaciones con diferentes juegos de datos.

Recomendaciones de estudio: el objetivo de esta parte es que el alumno pueda ampliar conocimientos comparando situaciones similares a las planteadas en el enunciado. Esta parte no hay que entregarla.
a) Realizar el mismo proceso pero indicando además cuántas líneas y cuántos números hay en el fichero de entrada.
b) Realizar el mismo proceso pero buscando el último número primo del fichero.
c) Realizar el mismo proceso pero indicando las posiciones que ocupan todos los números primos de la secuencia de entrada. Indicar también cuántos números forman la secuencia de entrada y de ellos, cuántos son primos.
d) Realizar el mismo proceso pero cambiando las especificaciones de diseño realizando un procedimiento para comprobar si el número es o no primo.

A continuación va mi solución errónea:

PROGRAM numeros_primos (input,output);
VAR
n:integer;
FUNCTION es_primo (n:integer) : boolean;
VAR
divisor:integer;
BEGIN
divisor:=2;
while ((divisor<=trunc(SQRT(n))) AND ((n mod divisor)<>0) DO
divisor:=divisor+1;
es_primo:=divisor>trunc(SQRT(n)));
END;

BEGIN
writeln('introduce un número');
readln(n);
if es_primo:=true
writeln('es primo')else writeln('no es primo')

END.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Situación del primer número primo

Publicado por Carlos Guimaraenz (265 intervenciones) el 06/11/2006 23:28:20
Hola Sara! En este momento no tengo mucho tiempo de ver todo el ejercicio en detalle, pero a simple vista de tu código, te puedo marcar los errores que encuentro:

PROGRAM numeros_primos (input,output);
VAR
n:integer;
FUNCTION es_primo (n:integer) : boolean;
VAR
divisor:integer;
BEGIN
divisor:=2;
while ((divisor<=trunc(SQRT(n))) AND ((n mod divisor)<>0) DO
divisor:=divisor+1;
es_primo:=divisor>trunc(SQRT(n))); {++ sobra un paréntesis de cierre ++}
END;

BEGIN
writeln('introduce un número');
readln(n);
{++ Cuando realizas el llamado a una función, debes pasar entre paréntesis los parámetros que ésta utilizará, si es que los necesita. Otro punto a tener en cuenta, es que cuando haces una asignación usas := (dos puntos e igual), en cambio cuando haces una comparación, como en este caso intentas hacer, usas sólo el signo = (igual). Cuando preguntas si una variable de tipo boolean es verdadera o falsa, en vez de comparar, por ejemplo, IF (ES_PRIMO = TRUE) THEN, puedes hacer directamente IF (ES_PRIMO) THEN, y en caso de preguntar IF (ES_PRIMO = FALSE) THEN, usas IF NOT (ES_PRIMO) THEN, pero ésto es sólo a modo de sugerencia ya que puedes usar la forma que más cómoda te resulte. Para finalizar con estos errores, recuerda que toda sentencia IF, luego de la expresión a evaluar, lleva la palabra THEN (y si la cantidad de sentencias a ejecutar si ésta se cumple es más de uno, usas BEGIN y END;. Y acuerdate de los punto y coma, que van casi siempre después del END, excepto previo a un ELSE (que no lleva punto y coma) o en el último END del programa que lleva sólo un punto. ++}
if es_primo:=true
writeln('es primo')else writeln('no es primo')
END.

Dicho ésto, el código quedará de la siguiente manera:

PROGRAM numeros_primos (input,output);
VAR
n:integer;
FUNCTION es_primo (n:integer) : boolean;
VAR
divisor:integer;
BEGIN
divisor:=2;
while ((divisor<=trunc(SQRT(n))) AND ((n mod divisor)<>0) DO
divisor:=divisor+1;
es_primo:=divisor>trunc(SQRT(n));
END;

BEGIN
writeln('introduce un número');
readln(n);
if es_primo then
writeln('es primo')else writeln('no es primo');
END.

Espero que me hayas entendido, ya que traté de poner todo junto. En otro momento miro el resto. Un beso!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Situación del primer número primo

Publicado por Diego Romero (996 intervenciones) el 07/11/2006 03:44:58
Carlos:
Te faltó pasar el parámetro a la función es_primo :).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Situación del primer número primo

Publicado por Carlos Guimaraenz (265 intervenciones) el 07/11/2006 03:58:10
Por supuesto Diego que faltaba pasar el parámetro... estaba probando si estabas atento :P jajajaja. Es cierto, Sara, al reescribir el código faltaba pasarle el parámetro a la función ES_PRIMO... mis disculpas.
Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Situación del primer número primo

Publicado por Diego Romero (996 intervenciones) el 07/11/2006 03:54:18
Triste lo que comentas al principio. Y es muy cierto. Hay gente que se mete a estudiar una carrera sin tener la más mínima idea de qué va la misma. Como querer estudiar física y sorprenderse de que haya mucha matemática.

Pero vamos. La programación es sentido común con lógica y un poco de arte. Un problema puede tener más de una solución (como un paisaje puede tener más de una pintura).

Sobre el primer ejercicio, hay algo que no está especificado y es escencial para resolverlo. Cuando dice: "La posición del número queda definida por dos valores numéricos: el número de línea y el lugar del número primo dentro de la línea." no está indicando qué se usa como separador de números. ¿Espacios?, ¿puntos y comas?, ¿otro caracter?...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Situación del primer número primo

Publicado por Intento de aplicado.. (7 intervenciones) el 20/11/2006 22:43:59
Estan separados por un espacio en blanco, es decir, freepascal o turbo pascal lee un dato tras otro y estan separados con espacios y retorno de carro al final de la linea ( eoln(f) donde f es el fichero de entrada)

Lo dice el profesor en clase.. xDDDDDD
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar