Menú

Mostrar Mensajes

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

Mostrar Mensajes Menú

Mensajes - dijsktra

#101
A ver, no es un problema de C, es de aritmetica.
La condición que impones la cumplen todos, no solo los primos. (Todos los numeros son divisibles por 1 y por si mismos).
El matiz es: Solo  los numeros primos  tienen unicamente como divisores a 1 y a si mismos...

Repasa el libro de mates. Hay muchas maneras de computar si un numero es primo: Yo pongo una de las más sencillas:
"Si un número mayor que 1 no tiene divisores otros que el 1 antes hasta la mitad, entonces es primo. En otro caso, o si es 1 o 0 no es primo "

Va una posible solucion

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>

// P : n >= 0
// Q : p = n > 1 and \not (\exits i : 2<= i , 2 <= 2i <= n : n%i = 0)
// O(n)
int prime(const int n)
{
 int d;
 for(d=2 ; (2*d<=n) && (n%d); d++);
 return (n>1)*(2*d > n) ;
}

int main (void){
 FILE *f;
 int n;
 if (!(f = fopen("datos.txt","r")))
   {
     perror("fopen");
     exit(EXIT_FAILURE);
   };
 while(!feof(f)){
   fscanf(f, "%d\n", &n);
   if (prime(n)) printf("%d\n", n);
 }
 fclose(f);
}


Esto es el fichero datos.txt

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50


Y esto la salida por pantalla

2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
#102
Esta solucion es mas general. Y segura

 
char w[]=...
for( ; *w ; w++) *w=toupper(*w);


Dentro de una rutina...


#include <stdio.h>
#include <ctype.h>

char *toupper_w(char *w)
{
 char *c=w;
 for( ; *w ; w++) *w=toupper(*w);
 return (w=c);
}


int main(int argc, char *args[])
{
 char w[512];
 while (scanf("%s",w)!=EOF)
   printf("%s \n",toupper_w(w));
 return 0;
}



Da esta salida

La
LA
Estacion
ESTACION
de
DE
SERRRvicio
SERRRVICIO





#103
A ver si puede valerte esto...




#include <stdio.h>
#include <assert.h>

/*
  P : \forall i : 0 <= i < 3 : w[i]='c' or w[i]='+'
  Q : #i : 0 <= i < 3 : w[i]='c'
  O(1)
  I : P[3/n] and 0 <= n <= 3
  C(n) = 3 - n
*/
int eval(const char w[])
{
 int n,s;
 for(n=s=0;n<3;n++)
     s+=(w[n]=='c');
 return s;
}

/* Mapping int -> const char[]  */
const char *banner[] = {"bad", "medium","very good","excellent"};

int main(int argc, char *args[])
{
 char w[512];
 char *c;
 while (scanf("%s",w)!=EOF)
   {
     /* check protocol  O(1) */
     int n,l;
     for(n=l=0,c=w ; (n<3) && *c; n++,c++)
      l+=(*c=='+' ||*c=='c');
     assert((*c==0) && (n==3) && (l==3));
     /* P */
     printf("%s : %s \n",banner[eval(w)], w);
   }
 return 0;
}


Si estás empezando, fíjate solo en la funcion eval()... El resto (comentarios) se entiende en cursos más avanzados.
El programa lee resultados de lanzamientos de 3 monedas. no se exige que estos sean generados por el programa, pero SI que sean resultados de lanzamientos de 3 monedas. En otro caso, se aborta el programa.
Se acaba el programa con Ctr-D sobre un terminal Linux, o Ctr-Z + Intro en Windows. esto es es la salida,


ccc
excellent : ccc
cc+
very good : cc+
+cc
very good : +cc
++c
medium : ++c
c+c
very good : c+c
c++
medium : c++
+++
bad : +++
+-+
main: main.c:33: main: Assertion `(*c==0) && (n==3) && (l==3)' failed.
Aborted