Ayúdame a programar!

Buenas, no se si este mensaje va aquí, pero es que estoy tirándome de los pelos.

Es una tontería muy gorda, pero es que me he bloqueado y no me sale aaaaaaaarg [reves] [reves]

Necesito un programa en pascal que yo introducienle un numero (integer) que me diga si es un numero primo o no. La cosa es que yo lo tengo hecho con FOR, que es muy simple, pero si le meto un numero grande se pasa la eternidad para calcular.

Algún alma caritativa con ganas de ayudar a este humilde jovencito a las 12 de la noche [bad] ?

pd - ni con function ni procedure ni nada, el programa más simple que haya [reves]

gracias por adelantado a quien se preste [ginyo]
Buscando un poco con tu amigo gugle se encuentra todo todo y todo :P
a ver yo no se pascal, pero la cosa es mas o menos chapuceramente asi

boolean esPrimo = false; //de mano no es entero
entero objetivo; //el que queremos saber si es primo
for(entero aux = 2; aux < objetivo;aux++)
{
if((objetivo modulo aux) == 0) {
esPrimo = true;
break;
}

}
devolver esPrimo;

La sintaxis es una especie de seudocodigo pero la idea basica es esa

PD: vaya campanilla te me adelantaste ;)
Por cierto, si te tarda cuando metes un numero grande es porque no sales del bucle cuando ya sabes que es primo, para que el bucle se siga ejecutando asegurate que sigue sin ser primo, si ya es primo ¿Para que seguir mirando?
^SlaSh^ escribió:a ver yo no se pascal, pero la cosa es mas o menos chapuceramente asi

boolean esPrimo = false; //de mano no es entero
entero objetivo; //el que queremos saber si es primo
for(entero aux = 2; aux < objetivo;aux++)
{
if((objetivo modulo aux) == 0) {
esPrimo = true;
break;
}

}
devolver esPrimo;

La sintaxis es una especie de seudocodigo pero la idea basica es esa

PD: vaya campanilla te me adelantaste



me has matao tío, me has matao [mad] [mad] [mad]

jeje, en serio, con lo de campa me ha bastado (wow, en 7 minutos una contestación, y el 7 es primo!) Todo esto es una revelación. Campa, eres mi prima 7ª? tendré que investigar...

Gracias a los dos, ahora estoy apañando el programa del guguel!XD

salu2
Es una señal desde luego [tomaaa] XD Investiga investiga...ya me mantendrás al tanto [jaja]
te sigue tardando tanto? no puede ser! algo te hace rarisimo, pon el codigo a ver porque en un pc actual calcular eso es un pincho, para que te hagas una idea acabo de hacer un programilla pa ver cuanto tarda (toy fatal...)

El programa toma del sistema el numero a calcular, eso que pone time es para que lo cronometre, ya ves cuanto tarda :s



victor@ubuntu:~ $ time ./primo 1231245453
El numero 1231245453 NO es primo

real 0m0.001s
lee mi mp slash, que te has montao un cacao por leer mal, jeje [beer]

EDITANDO IN THE NIGHTXD:

Duda de una noche de otoño:

En pascal, yo meto 10 numeros, y quiero que me los lea como caracteres de uno en uno, entonces yo defino la variable como CHAR, pero como hago para que me haga la suma de esos diez numeros?

Es decir, si yo los he definido como char, no puedo ponerlos en ninguna operación con +.

What can I doooooooo... [burla3]
Solo un apunte... para reduir bastante el tiempo de cálculo del for (o while), ponle como límite la raíz cuadrada del número.
Ej si quieres mirar si el 11 es primo las iteraciones harían:
11/2=0 -> NO
11/3=0 -> NO
11/4=0 -> NO
por tanto es primo, y no te hace falta continuar hasta el 10.
Con esto el tiempo de computación se te reduce mucho ;)

Salut
si si, para hacer el programa de primo hago que mire hasta SQRT(num), lo demás está de sobra. Aunque lo de los numeros primos ya lo solucioné el otro día [sati] ,

ahora la duda es la otra, a ver quien me la puede solucionar:

copio y pego del anterior post:

Duda de una noche de otoño:

En pascal, yo meto 10 numeros, y quiero que me los lea como caracteres de uno en uno, entonces yo defino la variable como CHAR, pero como hago para que me haga la suma de esos diez numeros?

Es decir, si yo los he definido como char, no puedo ponerlos en ninguna operación con +.

What can I doooooooo...


salu2 y ayudaaaaaa... [mamaaaaa] jeje XD
En C hay una función llamada ATOI para pasar cadenas de caracteres a enteros¬ ¬...

De todos formas esto se puede hacer con un buclecillo que vaya leyendo los caracteres de la cadena, convirtiéndolos en entero y asignándoles el peso posicional.

Ejemplo:

Imagina que tenemos la cadena--> [4][7][5][2]

cadena_entero[0]='2';
cadena_entero[1]='5';
cadena_entero[2]='7';
cadena_entero[3]='4';

El número es 4752 que tb se puede expresar como 4*10^3 + 7*10^2 + 5*10 + 2

Para pasar una cifra char a entero tienes que restarle 48 a su valor. (Dado que el 0 es 48 en ASCII).

Creo que con esto tienes de sobra para hacerlo tú ;)
Una cosa, para que quieres meterlos en char? si los metes como char solo puedes meter del 0 al 9 no es mas facil declarar la variable como Integer por ejemplo? te ahorras una función.

Para pasar de todas formas de char a entero, hazlo como dice handyman

Un saludo
Si, es más fácil como integer, pero mañana tengo examen de programación y estoy probando todo, y en un ejercicio ponía eso. Leer un número como caracter, y luego hacerle blablabla... [chiu]

Molto grachie y hasta mi próxima duda [beer]

salu2 :cool:
Buenos días a todos!

En el día de hoy os despierto con una nueva dudaXD:

Esta vez lo que necesito es una explicación, nada de ejercicios:).

En un libro tengo este programa, que lo que hace es sacar el máximo común divisor (zatitzaile komunetako handiena en mis apuntesXD):

PROGRAM ejercicio8_13_23;
VAR
a, b, max, min: INTEGER;
FUNCTION mcd (x, y: INTEGER): INTEGER;
BEGIN
IF x>y THEN
BEGIN
max:=x;
min:=y;
END
ELSE
BEGIN
max:=y;
min:=x;
END;
IF x=0 THEN mcd:=y
ELSE IF y=0 THEN mcd:=x
ELSE mcd:=mcd(max mod min,min)
END;
BEGIN
WRITE('Mete un número, baby: ');
READLN(a);
WRITE('Mete otro número: ');
READLN(b);
WRITELN(' El resultado es ',mcd(a,b));
END.

Bien, esa es la forma de hacerlo con el algoritmo de Euclides, que se basa en esto (que es la primera vez que lo veo, pero bueno, habrá que creerseloXD)

mcd(0,n)=n
mcd(n,0)=n
mcd(m,n)=mcd(max(n,m) mod min(n,m), min(n,m)), para m>0, n>0


Funciona muy bien el programa, pero no entiendo que es esto:
mcd:=mcd(max mod min,min);


por que hay que poner el segundo mcd?
mcd:=mcd (max mod min,min);


y que es lo que hace el segundo MIN detrás de la coma?
mcd:=mcd(max mod min,min );


Salu2 y gracias por adelantado a quien me pueda ayudar [bye]
Creo que esto está mejor en el general de PC.
la funcion se llama a si misma, es recursiva.

La función tiene dos parametros mcd(x,y)

x es "max mod min"
y es "min"
oooooooo, el otro día crei entenderlo, pero hoy me estaba dando problemas y según posteaba la duda lo acabo de pillar de donde saca cmd el valor. Se ejecuta hasta que uno de los dos valores es 0 y así el cmd es el que quedaXD

Molto grachie ozora [beer]
Bueno, hoy os comento una nueva duda, bastante urgente, así que agradeceré eternamente quien me la solucione:

El programa parece largo, pero es una tontería (es en pascal):

PROGRAM patata;
CONST max=200;
TYPE zerrendamota= ARRAY [1..max] of CHAR;
VAR
zerrenda: ZERRENDAMOTA;
dim, kont, a, i: INTEGER;

PROCEDURE irakurri (var zerrenda: zerrendamota; var dim: integer);
VAR
n: CHAR;
BEGIN
dim:=0;
read(n);
WHILE (n<>'.') AND (dim BEGIN
dim:=dim+1;
zerrenda[dim]:=(n);
read(n);
END;
END;

PROCEDURE ordenatutxikihandi (var zerrenda: zerrendamota; var dim: integer);
VAR
i, j: INTEGER;
aux: CHAR;
BEGIN
FOR j:=1 TO (dim-1) DO
FOR i:=1 TO (dim-1) DO
If zerrenda[i] > zerrenda[i+1] THEN
BEGIN
aux:=zerrenda[i+1];
zerrenda[i+1]:=zerrenda[i];
zerrenda[i]:=aux;
END;
END;

PROCEDURE errepikatuakkendu (var zerrenda: zerrendamota; var a: integer);
VAR
j, k: INTEGER;
BEGIN
FOR j:=1 TO a-1 DO
BEGIN
IF zerrenda[j]=zerrenda[j+1] THEN
BEGIN
FOR k:=j TO a-1 DO zerrenda[k]:=zerrenda[k+1];
a:=a-1;
END;
END;
END;

BEGIN
WRITELN('Sartu puntuz amaituriko zenbaki zerrenda: ');
irakurri(zerrenda, dim);
FOR i:=1 TO dim DO write(zerrenda[i]);
WRITELN();
ordenatutxikihandi(zerrenda, dim);
FOR i:=1 TO dim DO write(zerrenda[i]);
WRITELN();
a:=dim;
errepikatuakkendu(zerrenda, a);
FOR i:=1 TO a DO write(zerrenda[i]);
END.

Es un semi-programa, está a medias. EL primer procedure lee una lista d enumeros, el segundo los ordena de menor a mayor, y el tercero debería quitar los números repetidos, pero por más vueltas que le doy no consigo saber por que no lo hace:(.

AYUDA PLIIIIIIS!!! [snif] [snif] [snif]

salu2 [angelito]
PROCEDURE errepikatuakkendu (var zerrenda: zerrendamota; var a: integer);
VAR
j, k: INTEGER;
BEGIN
j:=1;
while jBEGIN
IF zerrenda[j]=zerrenda[j+1] THEN
BEGIN
FOR k:=j TO a-1 DO zerrenda[k]:=zerrenda[k+1];
a:=a-1;
END
else j:=j+1;
END;
END;


Ese debería ser el tercer procedure: cambiar el for por un while y subir la j solo cuando los dos numeritos no sean iguales.
Vamos, creo que está bien así (que yo hasta el segundo cuatrimestre no doy arrays X-D).
y volveeeeeeemos a la carga con mis duditasXD

Ahora estoy con la paranoia, pero cual es la diferencia entre un string y un array?
Este hilo era de pascal creo yo, pero esto sera igual en todos lados :P

Un string guarda una cadena, como "perro, "hola", "manueeeeee",xD

un array guarda valores en distintas posiciones.

un array de integer puede contener varios integer, en distintas posiciones, no se como ponertelo ya q no se pascal, pero en cada indice un valor, por ejemplo, en el indice 0 tienes el numero 12, en el indice 1 tienes el valor 40 y asi. Tambien puedes tener un array de string y en cada indice una cadena.

Espero q se entienda :P, un saludo.
Pues basicamente un string es un array de caracteres. En los primeros compiladores de pascal no existia el string, se añadio mas tarde. Al string puedes acceder de la misma forma que al array

var nombre : string[25];
letra : char;
....
letra := nombre[1];

Si tienes mas dudas pregunta que de pascal desde que tuve que hacer un corrector ortografico lo tengo grabado en sangre [qmparto]

Salu2
Usea, digamos que tenemos una lista, | | | | | | |, en cada hueco de esos, el array lo que haría sería guardarme un carácter en cada, y, ¿ con el string podría guardar una frase en cada?

Bueno, si eso es así, mas o menoslo pilloXD (gracias a los 2;)), pero, para que cosas se utiliza uno u otro? (algún ejemplillo vendría de puta madre:P)
digamos que tenemos una lista, | | | | | | |, en cada hueco de esos, el array lo que haría sería guardarme un carácter en cada, y, ¿ con el string podría guardar una frase en cada?


Para hacer eso declara ARRAY OF STRING

Por ejemplo un programa en el que tengas que guardar el nombre de una persona -> STRING

Y un programa en el que tengas que introducir por teclado numeros para despues ordenarlos pues los guardas en un array

Como te dije antes el string es un array, con la ventaja (y creo ke no me ekivoco, sino corregidme) que al string lo puedes llamar entero o por posiciones y el array solo por posiciones, me explico:

'Casa' es la var palabra declarado como un string
'Choza' es la var letra declarada como un array de caracteres

Write(palabra) --> Casa
Write(palabra[3] --> s

Write(letra[2]) --> h
Write(letra) --> error

Juraria q es asi pero no estoi 100% seguro

Salu2
En pascal no trates los strings como arrays es mas facil.

En un String guardas cadenas de caracteres, por ejemplo "hola buenos dias" y en un array guardas listas (limitadas) de lo que sea.

Si es de strings pues guardaras hola buenos dias;hola me llamo daniel;pepe;

Para acceder al array utiliza nombredelarray[indice] en el array se guardarán siempre cosas del mismo tipo, no puedes guardar in integer y un string por ejemplo, para eso y para mas cosas luego están las listas.

Para que te hagas una idea un array es como si fuera un vector
daniel_5 escribió:En pascal no trates los strings como arrays es mas facil.


Hombre pero hay veces que es útil por ejemplo si te mandan escribir solo las iniciales del nombre, accedes a la primera posicion y ya ties la inicial

Salu2
Blame escribió:
Hombre pero hay veces que es útil por ejemplo si te mandan escribir solo las iniciales del nombre, accedes a la primera posicion y ya ties la inicial

Salu2


Substring ;-)
daniel_5 escribió:Substring ;-)

[tomaaa] [oki]
Bueno, ya me llevo medio bien con los string's, pero ahora, tocan fitxeros:P

Tengo este programa donde están unas cuantas cosas (assign, reset, rewrite...), pero me falla algo:

PROGRAM alfabetoa;
TYPE
M_Fitx = file of char;
VAR
fitx: M_Fitx;
fizena: string[25];
kar: CHAR;
BEGIN
WRITELN('Sartu fitxeroaren izena');
READLN(fizena);
ASSIGN(fitx,fizena);
REWRITE(fitx);
FOR kar:= 'A' TO 'Z' DO WRITE(kar);
RESET(fitx);
WHILE NOT EOF(fitx) DO
BEGIN
READ(fitx,kar);
WRITE(kar);
END;
CLOSE(fitx);
END.

Eso debería abrirme un fichero, asignarle el nombre que yo le meta (esta en euskera la frase, por si no la entendéis:P), y me escribe el alfabeto de la a a la z dentro del fichero, pero la cuestión es, que luego lo abro con el notepad, y el fichero está en blanco.

como lo hago para que guarde las cosas'?? [mad] [mad]
FOR kar:= 'A' TO 'Z' DO WRITE(kar);

creo que seria

FOR kar:= 'A' TO 'Z' DO WRITE(fitx, kar);

y si no va es que es asi

FOR kar:= 'A' TO 'Z' DO WRITE(kar, fitx);

Al ejecutar la funcion WRITE tienen que indicarle el string/char/integer o lo que sea que quieres escribir (kar) y donde quieres que se escriba (fitx).
muchas gracias waninkoko;)

Y hoy, como no, seguimos con mas dudasXD

Sigo con ficheros, y acabo de ver un comando, y no se cual es su función.

En teoría lo que tengo entre mis manos es un ejercicio que tienes dos ficheros cada uno con una lista de números, y te los pasa a un solo fichero esos dos, y el comando que usa para hacer una cosa es ODD

if odd(kont) then read(fitx1,num)

que es lo que hace ese odd?

salu2 [oki]
Si loq ue le pasas a ODD es un numero impar te da True si no false

Saludos

P.D: el argumento tiene que ser un iteger ODD(x:integer)
gracias tíu;)

Y esta tarde, os deleito con una nueva dudaXD:

Estaba yo haciendo un programa (de ficheros), que la idea es que me pide los nombres de dos ficheros (que ya están hechos), cada uno con una lista de numeros. Primero me escribe las dos listas, y después, me mira que números de la segunda lista están en la primera, para al final decirle "En la segunda lista hay X números que ya aparecen en la primera". Creo que se entiende, es bastante sencillito:P

Pues tengo este programa hecho, pero me da problema (en msdos al mirarlo error de ejecución:(), y no entiendo por que:'(

PROGRAM zenbakiakbifitxerotan;
TYPE
M_fitx = file of integer;
VAR
fitx1, fitx2: M_fitx;
f1izena, f2izena: string[25];
kont, zenb1, zenb2: integer;
BEGIN
kont:=0;
WRITELN('Mete el nombre del priemr fichero: ');
READLN(f1izena);
WRITELN('Mete el nombre del segundo: ');
READLN(f2izena);
ASSIGN(fitx1,f1izena);
ASSIGN(fitx2,f2izena);
WHILE NOT EOF(fitx1) DO
BEGIN
READ(fitx1,zenb1);
WRITE(zenb1);
END;
WRITELN();
WHILE NOT EOF(fitx2) DO
BEGIN
READ(fitx2,zenb1);
WRITE(zenb1);
END;
RESET(fitx1);
WHILE NOT EOF(fitx1) DO
BEGIN
READ(fitx1,zenb1);
RESET(fitx2);
WHILE NOT EOF(fitx2) DO
BEGIN
READ(fitx2,zenb2);
IF zenb1=zenb2 THEN kont:=kont+1;
END;
END;
CLOSE(fitx1);
CLOSE(fitx2);
WRITELN('en el segundo fichero hay ',kont,' números que aparecen en el primero');
END.

salu2 y gracias por adelantado a quien me ayude [angelito]

EDITO: PROBLEMA SOLUCIONADO!!XD
yo a simple vista no veo nada raro

pero tb decir que yo ese lenguaje de programacion ( que no se cual es) todavia no lo he visto x lo que muchas instrucciones supongo lo que haran ( writeln, while, etc.. pero las de ficheros hay ya no)
He borrado el post que tenía aquí para poder poner mi siguiente dudaXD

--> pues naaada, siguiendo con los fitxeros, ahora tengo duda con otros comandos:

uno está nada mas empezar el programa..

randomize;

y el otro está dentro de un for,

PRimero pregunta a ver cuantos números quieres coger, así que supongo que será para que él mismo te elija los los números

for i:=1 to bdú(esto sería el número que le has metido) DO
begin
a:=random(1000);
write(fitx,a);
end;

El 1000 supongo que será para que me elija números de 0 a 1000 no?

Y el otro comando raro es seek

para que sirve?

salu2 y gracias por adelantado!!!
Si el 1000 es para eso.
seek es un comando para ficheros de acceso directo, se suele utilizar asi: Seek (VariableArchivo, NumRegistro); y te lleva al registro que le indiques sin tener que recorrer todo el fichero.

Saludos
estaba yo pensando dándole vueltas a mi maquiavélica cabezita, y he pensado... entonces por ejemplo, cuando necesito leer de un fichero, ¿¿ es lo mismo poner reset(fitx) que poner seek(fitx,0) ???

Los dos me llevarían al principio de fichero, es correcto?

salu2
Los dos te llevan al pirncipio, pero luego como sigues???

seek es para leer directamente, se utiliza si tienes registros almacenados en el fichero, si no no vale, te puede llevar a cualquier parte ya uqe accedes a un byte del fichero.

y si no es de acceso directo, si utilizas seek no sabes cuando acaba la linea por ponerte un ejemplo
lo comentado antes, no se pascal y tampoco se el funcionamiento de las instrucciones de pascal
peo x ejemplo en ADA, que es en lo que programo ahora, si hago un reset al fichero, le tengo que decir COMO lo dejo

es decir, si estoy leyendo de un fichero y quiero escribir: reset(fichero, out_file) y me coloco al principio del fichero en modo lectura
si lo que quiero es escribir, pero tras el ultimo dato del fichero y estoy en modo lectura, reset(fichero, append_file)

y si estoy escribiendo, acabo de escribir y quiero leer el fichero, hago un reset(fichero, in_file)

tb sirve para leer y al llegar al final, leer otra vez, pues otro reset como el de arriba


pero en pascal no se como va lo del reset

la instruccion que te han respondido ya, seek = buscar en ingles [oki]
37 respuestas