PDA

Ver la versión completa : Programar en C



navegante 420
18/02/2010, 22:53
Bueno abro este hilo en parte para desahogarme un poco....

Pero alguien me podría indicar alguna página, link o lo que sea, para que un pobre mortal como yo entiena el puto lenguaje y poder hacer los ejercicios que el profe me ha mandado porque nos ha mandado unos programitas con errores pero es que soy incapaz, de leerlos y el portatil ya lleva dos puñetazos de impotencia y dudo que aguante un tercero, Así que antes de que ocurra pido ayuda.

Un ejemplo:

#include <stdio.h>

#define DIF 'a'-'A'

/* ENUNCIAT */
/* Aquest programa demana un caracter a l'usuari per a passar-lo a majuscula. */
/* Si l'entrada no es correspon a una lletra, el programa segueix demanant el */
/* caracter. Quan aquest es introduit i en el cas de que estigui en minuscules */
/* el programa el passara a majuscules i el treura per pantalla. */

int main()
{
char c,nouc;

printf("Dona un caracter 'a'-'z','A'-'Z' i el \
passare a majuscules \n");
scanf("%c",&c); /*Cambiamos de d por c ya que no tenemos un entero sino un caracter */
while (((c<'a')||(c>'z'))&&((c<'A')||(c>'Z')))
{
if (c!='\n') printf("T'he demanat un caracter\n");
scanf("%c",&c);
}
if ((c>='a') && (c<='z'));
{
nouc=c-DIF;
printf("El caracter donat es %c i en majuscules es %c\n","c","nouc");
} else {
printf("El caracter ja esta en majuscules\n");
}
}

Como coño se yo lo que hace eso, y donde estan los errores.

Aunolose
18/02/2010, 23:04
¿quieres que diga donde está el error?... :D

Creo que hay dos...

Aunolose
18/02/2010, 23:08
Una pista del que es seguro: está dentro del ultimo if...

Aunolose
18/02/2010, 23:15
Este empieza por el principio.

Manual de Programación en el Lenguaje C - Monografias.com (http://www.monografias.com/trabajos33/programacion-lenguaje-c/programacion-lenguaje-c.shtml)

navegante 420
18/02/2010, 23:15
prefiero que me ayudes a leer el código, porque no tengo ni idea de como opera, o sea lo que hace.

los errores me los canta el dev c++

navegante 420
18/02/2010, 23:20
Este empieza por el principio.

Manual de Programación en el Lenguaje C - Monografias.com (http://www.monografias.com/trabajos33/programacion-lenguaje-c/programacion-lenguaje-c.shtml)


Gracias, a esto me referia, ya que me gustaría aprender el C bien, y ser capaz de hacer mis propios programas, pero digamos que la metodogia que esta utilizando el profe con este tema, no me esta siendo muy faborable.

gendou
18/02/2010, 23:37
Ya me habeis picado a mi tambien con el tema "C"...

voy a sacar al perro y a ver si recuerdo algo de mis tiempos de facultad...

Aunolose
18/02/2010, 23:40
#include <stdio.h> en esta librería está scanf y printf

#define DIF 'a'-'A' para hacerlo fácil, aunque aquí puede haber un error

/* ENUNCIAT */ comentarios
/* Aquest programa demana un caracter a l'usuari per a passar-lo a majuscula. */
/* Si l'entrada no es correspon a una lletra, el programa segueix demanant el */
/* caracter. Quan aquest es introduit i en el cas de que estigui en minuscules */
/* el programa el passara a majuscules i el treura per pantalla. */

int main() el programa empieza aquí
{
char c,nouc; en los programas de alto nivel compilados, es necearios definir las variables antes de usarlas, estas son dos variables de tipo caracter (alfanuméricas)

printf("Dona un caracter 'a'-'z','A'-'Z' i el passare a majuscules \n"); mensaje solicitando un caracter
scanf("%c",&c); /*Cambiamos de d por c ya que no tenemos un entero sino un caracter */ esto es un poco liante, scanf lee del teclado, pero lo interpreta según lo que pongas en las comillas, es decir si pulsas el 1 y en las comillas pone "%d" se tomará como un entero, el 1, mientras que si pone "%c" lo tomará como un caracter alfanumérico, el "1". no es lo mismo el caracter ASCII que el valor numérico. lo que lea lo guarda en la variable c

while (((c<'a')||(c>'z'))&&((c<'A')||(c>'Z'))) ejecuta este bucle mientras el caracter leído, c, sea menor que 'a' o mayor que 'z' además (y) c sea < que 'A' o mayor que 'Z' es para evitar que introduzcas un caracter que no sea una letra, por ejemplo, el '1',
{
if (c!='\n') printf("T'he demanat un caracter\n"); si escribes un caracter diferente a una letra, te lo vuelve a pedir, dentro del bucle while
scanf("%c",&c);
}
if ((c>='a') && (c<='z')); si es minusculas (entre la 'a' y la 'z')
{
nouc=c-DIF; las letras minúsculas tienen un valor ascii mayor que las mayúsculas, por eso le quitamos la diferencia, para que nos dé la misma letra, pero en mayúsculas, aquí puede haber un error según como ejecute el compliador la suma y la resta, pues el #define coloca la expresión tal cual, es decir, estás poniendo nouc=c-'a'-'A' debería ser nouc=c- ('a'-'A') aunque dependiendo del compliador puede ejecutarlo bien, que lo dudo
printf("El caracter donat es %c i en majuscules es %c\n","c","nouc"); si era minúsculas, lo imprime, peeero, segundo erro, cuando imprimes una variable, imprimes la variable, sin comillas, sería ...", c, nouc); colocará las variables en el orden marcado por los %c, igual que scanf s

} else { si está en mayúsculas, pues lo pone.
printf("El caracter ja esta en majuscules\n");
}
}

y ahora me tengo que ir, que ya me he pasado...

navegante 420
19/02/2010, 00:23
Muchimas gracias aunolose..... estaba apunto de un ataque de histeria por la impotencia de no ser capaz de resolver el tema....

Ahora me miro con tranquilidad la pagina que me has enviado y haber si así y con tus indicaciones soy capaz de aprender C.

Por cierto, si te aburres aqui tienes el resto de ejercicios.

http://www.isaacpaton.com/cfs/prog/c/

navegante 420
19/02/2010, 13:59
nouc=c-DIF; las letras minúsculas tienen un valor ascii mayor que las mayúsculas, por eso le quitamos la diferencia, para que nos dé la misma letra, pero en mayúsculas, aquí puede haber un error según como ejecute el compliador la suma y la resta, pues el #define coloca la expresión tal cual, es decir, estás poniendo nouc=c-'a'-'A' debería ser nouc=c- ('a'-'A') aunque dependiendo del compliador puede ejecutarlo bien, que lo dudo




Esto de aquí más o menos lo entiendo, aunque no me queda claro del todo.

Me he mirado por curiosidad, el codigo ACSI y he comprobado que esa dif. es una constate de 32, Si declaro esa constante al principio del programa y así obligo a realizar la resta de forma correcta????

navegante 420
19/02/2010, 14:22
De momento lo le pongo los parentesis al a-A ya que la otra idea no he sabido hacerla.

Ahora tengo un error en el else y te juro que no lo veo.

https://anterior.webcampista.com/foro/attachment.php?attachmentid=25790&stc=1&d=1266578554

navegante 420
19/02/2010, 15:23
Bueno, no soy tan inútil en esto.... he conseguido gracias a las indicaciones de aunolose corregir uno....

https://anterior.webcampista.com/foro/attachment.php?attachmentid=25793&stc=1&d=1266582107

https://anterior.webcampista.com/foro/attachment.php?attachmentid=25794&stc=1&d=1266582116

https://anterior.webcampista.com/foro/attachment.php?attachmentid=25795&stc=1&d=1266582124

Pero el anterior no lo veo...

Aunolose
19/02/2010, 17:27
Hola perdona por dejarte tirao... tocaba irse a casa a cenar...

con el else tienes un problema de llaves, debes cerrar la primera llave, donde hace lo de si{....} y si no {...}

luego miro los otros que hay que currar...

navegante 420
19/02/2010, 17:58
En absoluto me dejastes tirado.... Aproveche para ir estudiando lo que me distes.....

por cierto, ya funciona......

#include <stdio.h>

#define DIF 32
/*detras del define sobrava un espacio, y ponemos un valor, ya que la orden define no acepta operaciones*/

/* ENUNCIAT */
/* Aquest programa demana un caracter a l'usuari per a passar-lo a majuscula. */
/* Si l'entrada no es correspon a una lletra, el programa segueix demanant el */
/* caracter. Quan aquest es introduit i en el cas de que estigui en minuscules */
/* el programa el passara a majuscules i el treura per pantalla. */

int main()
{
char c,nouc;

printf("Dona un caracter 'a'-'z','A'-'Z' i el \
passare a majuscules \n");
scanf("%c",&c); /*Cambiamos de d por c ya que no tenemos un entero sino un caracter */
while (((c<'a')||(c>'z'))&&((c<'A')||(c>'Z')))
{
if (c!='\n') printf("T'he demanat un caracter\n");
scanf("%c",&c);
}
if ((c>='a') && (c<='z')) /* Quitamos el final de sentencia */
{
nouc=c-DIF;
printf("El caracter donat es %c i en majuscules es %c\n",c,nouc);
}
else
{
printf("El caracter ja esta en majuscules\n");
}
}

El defiene era uno de los problemas y el else era por un punto y coma que no deveria de estar y ya lo he quitado

Aunolose
19/02/2010, 20:42
Pero aquí si que tiene corchetes... en el de la imagen no, no me di cuenta que era el mismo programa... pero está todo relacionado, son los tipicos "Syntax error..." o "Unexpected..." (inesperado... encontró algo que no le gustaba)

Me dejas con la duda, pero creo que en el define si se pueden poner operaciones, lo que hace el compilador es sustituir la palabra por el texto, literalmente, si es valido, p'alante, sea una operación o no.

El problema de los paréntesis es de tipo matemático, no es lo mismo c-'a'-'A' que c-('a'-'A') pero si pones el paréntesis en el define, debe funcionar, y también debe funcionar si pones c-(DIF)

siendo DIF 'a'-'A'

navegante 420
22/02/2010, 12:35
Pero aquí si que tiene corchetes... en el de la imagen no, no me di cuenta que era el mismo programa... pero está todo relacionado, son los tipicos "Syntax error..." o "Unexpected..." (inesperado... encontró algo que no le gustaba)

Me dejas con la duda, pero creo que en el define si se pueden poner operaciones, lo que hace el compilador es sustituir la palabra por el texto, literalmente, si es valido, p'alante, sea una operación o no.

El problema de los paréntesis es de tipo matemático, no es lo mismo c-'a'-'A' que c-('a'-'A') pero si pones el paréntesis en el define, debe funcionar, y también debe funcionar si pones c-(DIF)

siendo DIF 'a'-'A'

Pues si tu lo dices, luego lo pruebo, ha ber ....si funciona....

Ahora estoy muy liado programando, el resto de ejercicios de c, más uno de ensamblador...

navegante 420
22/02/2010, 12:52
Nuevo ejercicio, y nuevos problemas....

En está ocasión partims de 0 y se nos pide que realicemos un programa que nos indique el Máximo común divisor según el agoritmo de Euclides.

Yo he hecho el siguiente pseudo código.

Solicitar entrar 1º número = A
Solicitar entrada 2º número =B
Si (A>B)
{
Dividiendo=A
Divisor=B
}
Sino
{
Dividiendo=B
Divisor=A
}
Si divisor != 0
{
X=dividiendo%divisor
Si x=0
{
Imprime resultado (Divisor)
}
Sino
{
Dividiendo=divisor
Divisor=x
}
Sino
{
Imprime no puedes dividir un nº por 0
}
Fin programa.

Y escrito el seguiente texto en c.


#include <stdio.h> /*Libreria que incluye printf y scanf*/

int main() /* Inicio del programa */
{
int A=0,B=0,x=0,dividiendo=0,divisor=0; /* declaramos variables y las inicializamos a 0*/

printf("Dame el primer número \t"); /*Solicitamos en primer número*/
scanf("%d",&A); /*Lo guardamos en A*/
printf("Dame el segundo número \t"); /*Solicitamos el segundo número*/
scanf("%d",&B); /*Lo guardamos en B */
if(A>B) /*si A es Mayor que B ejecuta lo siguiente*/
{
dividiendo=A; /*Guarda A como dividiendo*/
divisor=B; /*Guarda B como Divisor*/
}
else /*Si A no es mayor que B entonces ejecuta esto*/
{
dividiendo=B; /*Guarda B como dividiendo*/
divisor=A; /*Guarda A como divisor*/
}
if(divisor!=0)
{
x=dividiendo%divisor;
if(x=0)
{
printf("El máximo común divisor de %d y %d es %d\n",A,B,x);
}
else
{
dividiendo=divisor;
divisor=x;
}
}
else
{
printf("no puedes dividir un número por 0\n");
}
}

pero al ejecutarlo no me devuelve el resultado. alguna pista de donde la he cagado....

navegante 420
22/02/2010, 13:00
El fallo esta en este bucle, porque el resto funciona correctamente.


if(divisor!=0)
{
x=dividiendo%divisor;
if(x=0)
{
printf("\n El máximo común divisor de %d y %d es %d \n",A,B,x);
}
else
{
dividiendo=divisor;
divisor=x;
}

Aunolose
22/02/2010, 17:49
Hola, lo primero decirte que no tengo claro que así averigües el máximo común divisor, para según que números. prueba el 3 y 5 pero la idea no es mala.

Si quieres hacer un bucle, falta eso, el bucle. en alguna parte usarás while o do... while

Un fallo que veo es el típico de sintaxis en C si pones x=0 lo que haces es igualar x a cero, y "devuelves" al if un cero, se ejecuta el else

La sintaxis correcta es if (x==0) que es el signo de comparación.

Por cierto que en ese caso x siempre será cero cuando lo imprimas... tal vez quieras poner if (x!=0)

Y luego lo miro mejor que ahora me reclaman...


PD: (esto para "expertos") En C para poner if (x!=0) puedes poner if (x) ya que en C 0 es "falso" y cualquier cosa distinto de 0 es "cierto". Es decir, es como si preguntas "si x es cierto" -> "si x es distinto de 0"

y al revés, si quieres poner if (x==0) puedes poner if (!x) o if !(x) por lo mismo.

owockadoy
23/02/2010, 03:47
Un comentario sobre el programa de convertir a mayúsculas.
Nunca se deben poner en los programas "números mágicos" sin más al estilo del 32. Es una mala práctica de programación.

Si quieres "marcar paquete" con el profesor, un algoritmo más eficiente para intercambiar mayúsculas y minúsculas es darse cuenta que el código ASCII de una letra mayúscula (la 'A' por ejemplo es 0100 0001 ó 41h) y el de una minúscula (la 'a', por ejemplo es 0110 0001 ó 61h) difiere siempre en un único bit y es el de posición 5. Por lo tanto, si a cualquier letra le pones ese bit a 1, la tendrás en minúscula, si se lo pones a 0, la tendrás en mayúscula y si cambias el valor de ese bit, la cambias entre mayúscula <-> minúscula.
Esos cambios son triviales si haces la operación or, and o xor con la máscara 20h.

owockadoy
23/02/2010, 03:56
El programa del algoritmo de Euclides está mal, pero de planteamiento. El pseudocódigo que planteas no es el algoritmo de Euclides. Aquí tienes un enlace que lo explica:
Algoritmo de Euclides - Wikipedia, la enciclopedia libre (http://es.wikipedia.org/wiki/Algoritmo_de_Euclides).

Se puede hacer recursivamente, pero me imagino que aún no habéis llegado a eso. Plantea de nuevo el programa y te lo corregiremos pero asume que programar es como capar, se aprende a capar cortando.....

BENGI
23/02/2010, 16:53
Jaime, tienes un privi, dime algo cuando puedas.

salu2

Aunolose
23/02/2010, 17:21
El programa del algoritmo de Euclides está mal, pero de planteamiento. El pseudocódigo que planteas no es el algoritmo de Euclides. Aquí tienes un enlace que lo explica:
Algoritmo de Euclides - Wikipedia, la enciclopedia libre (http://es.wikipedia.org/wiki/Algoritmo_de_Euclides).

Se puede hacer recursivamente, pero me imagino que aún no habéis llegado a eso. Plantea de nuevo el programa y te lo corregiremos pero asume que programar es como capar, se aprende a capar cortando.....

Ya me extrañaba a mi, no lo veía, sobre todo sin bucle.

Y me alegro de que vaya apareciendo gente, que esto parecía "el consultorio de Elena Francis" :D

navegante 420
25/02/2010, 17:58
Hola, lo primero decirte que no tengo claro que así averigües el máximo común divisor, para según que números. prueba el 3 y 5 pero la idea no es mala.

Si quieres hacer un bucle, falta eso, el bucle. en alguna parte usarás while o do... while

Un fallo que veo es el típico de sintaxis en C si pones x=0 lo que haces es igualar x a cero, y "devuelves" al if un cero, se ejecuta el else

La sintaxis correcta es if (x==0) que es el signo de comparación.

Por cierto que en ese caso x siempre será cero cuando lo imprimas... tal vez quieras poner if (x!=0)

Y luego lo miro mejor que ahora me reclaman...


PD: (esto para "expertos") En C para poner if (x!=0) puedes poner if (x) ya que en C 0 es "falso" y cualquier cosa distinto de 0 es "cierto". Es decir, es como si preguntas "si x es cierto" -> "si x es distinto de 0"

y al revés, si quieres poner if (x==0) puedes poner if (!x) o if !(x) por lo mismo.

Muchas gracias Ya esta resulto, muchas gracias.

Aunolose
25/02/2010, 22:32
Ya me habeis picado a mi tambien con el tema "C"...

voy a sacar al perro y a ver si recuerdo algo de mis tiempos de facultad...


Hola gendou, no había visto este post, a ver si hablamos más gente. ¿que estudiaste?

Aunolose
25/02/2010, 22:35
Navegante, he visto que ya habéis llegado a las tablas/vectores ¿que tal?

navegante 420
26/02/2010, 01:40
Con la cabeza como un bombo, pero lo he sacado.... Gracias a cambiar de programa.....

En un principio, usabamos el dev c, pero era muy complicado segun el profe usar el debuger, así que ahora usamos el borland, y gracias al debuger he pidido seguir mejor el programa y ver donde la cagaba.... Eso y que un compañero, que por las mañanas esta en la uni, me enseño el for....

Ahora a ver que nos pone.....

Gerard-2
26/02/2010, 04:04
Tambien sumando/restando 20h

Saludos

Dedalo
26/02/2010, 13:17
Mejor que sumar y restar 20h yo prefiero hacer OR con 20h para pasar a mayusculas y AND con DFh para pasar a minusculas.

Aunolose
26/02/2010, 17:16
:D se nota el venir del ensamblador, lo de las and y las or,





PD: en C también se pueden usar...

Dedalo
27/02/2010, 21:50
Bueno, lo haremos como en C...

Para pasar a minusculas hariamos:
Salida == entrada && 0xDF

y para pasar a mayusculas:
Salida == entrada || 0x20

En realidad hay otra forma mas sencilla, creo que es utilizando la libreria <string.h> creo que hay una funcion toupper y otra tolower, en ese caso sera tan sencillo como:
Salida==toupper(entrada) para pasar a mayusculas y

Salida==tolower(entrada) para pasar a minusculas.

owockadoy
01/03/2010, 03:34
Bueno, lo haremos como en C...

Para pasar a minusculas hariamos:
Salida == entrada && 0xDF

y para pasar a mayusculas:
Salida == entrada || 0x20

En realidad hay otra forma mas sencilla, creo que es utilizando la libreria <string.h> creo que hay una funcion toupper y otra tolower, en ese caso sera tan sencillo como:
Salida==toupper(entrada) para pasar a mayusculas y

Salida==tolower(entrada) para pasar a minusculas.

Las líneas en rojo están mal. Se debería de haber utilizado el operador de asignación = en vez de ==, que es el operador lógico de igualdad.
Además, el operador && realiza la operación lógica AND entre los dos operados devolviendo como resultado verdadero o falso. La operación lógica AND bit a bit entre los bits de los operandos se realiza con el operador &, que es lo que se pretende en este caso.
Lo mismo se puede decir del operador || que es la operación lógica AND y del operador | que es la operación lógica OR bit a bit entre los bits de los operandos.

Las líneas quedarían:

Salida = entrada & 0xDF;

Salida = entrada | 0x20;

Como comentario, aunque sumar y restar 20h es correcto y obtienes lo mismo, hacerlo de esa manera te obliga a hacer antes una comparación para saber si el carácter es mayúscula o minúscula y decidir si debes sumar, restar o no hacer nada. Por lo tanto es una solución peor (más ineficiente) que la operación lógica.

Dedalo
01/03/2010, 11:41
Las líneas en rojo están mal. Se debería de haber utilizado el operador de asignación = en vez de ==, que es el operador lógico de igualdad.
Además, el operador && realiza la operación lógica AND entre los dos operados devolviendo como resultado verdadero o falso. La operación lógica AND bit a bit entre los bits de los operandos se realiza con el operador &, que es lo que se pretende en este caso.
Lo mismo se puede decir del operador || que es la operación lógica AND y del operador | que es la operación lógica OR bit a bit entre los bits de los operandos.

Las líneas quedarían:

Salida = entrada & 0xDF;

Salida = entrada | 0x20;

Como comentario, aunque sumar y restar 20h es correcto y obtienes lo mismo, hacerlo de esa manera te obliga a hacer antes una comparación para saber si el carácter es mayúscula o minúscula y decidir si debes sumar, restar o no hacer nada. Por lo tanto es una solución peor (más ineficiente) que la operación lógica.

Pues tienes razon. La verdad es que hace años que no programo en C y se pierde la costumbre. Ya ni me acordaba si la linea se debia terminar con el ;. La comprobacion se debe hacer para saber si es una letra o es otro caracter.

A ver si esto es mas correcto:

Pasar a mayusculas:
salida = entrada < 'a' || entrada > 'z' ? entrada : entrada | 0x20;

Pasar a minusculas:
salida = entrada < 'A' || entrada > 'Z' ? entrada : entrada & 0xDF;

En ambos casos el resultado quedaría igual si el caracter no es una letra entre la a y la z.

Mi memoria no me alcanza para acordarme si se escribe 'A' o se escribe "a", pues muchos años programando en pascal hacen olvidar detalles de la sintaxis del C. En pascal los literales se señalan con ' o con " segun los casos.

navegante 420
02/03/2010, 16:03
Un comentario sobre el programa de convertir a mayúsculas.
Nunca se deben poner en los programas "números mágicos" sin más al estilo del 32. Es una mala práctica de programación.

Si quieres "marcar paquete" con el profesor, un algoritmo más eficiente para intercambiar mayúsculas y minúsculas es darse cuenta que el código ASCII de una letra mayúscula (la 'A' por ejemplo es 0100 0001 ó 41h) y el de una minúscula (la 'a', por ejemplo es 0110 0001 ó 61h) difiere siempre en un único bit y es el de posición 5. Por lo tanto, si a cualquier letra le pones ese bit a 1, la tendrás en minúscula, si se lo pones a 0, la tendrás en mayúscula y si cambias el valor de ese bit, la cambias entre mayúscula <-> minúscula.
Esos cambios son triviales si haces la operación or, and o xor con la máscara 20h.


Desde la total y completa ignorancia en esto del C, poner 20h no seria otro "número mágico" pero en hexadecimal en vez de decimal?????

navegante 420
02/03/2010, 16:10
:D se nota el venir del ensamblador, lo de las and y las or,





PD: en C también se pueden usar...


Pues tal y como se me estan dando las cosas, tengo que decir que estoy con dedalo "viva el ensamblador".

Ejercicio de la tabla de edades, tiempo efectivo más de 12h

Calculadora, suma, resta, multiplicación, con pic y ensamblador, no tarde ni tres horas.

Teniendo en cuenta que el programa en C son 20 lineas de codigo y el ensamblador fueron 170 lineas, juzgar que se me da mejor....

Aunolose
02/03/2010, 17:43
Pues tal y como se me estan dando las cosas, tengo que decir que estoy con dedalo "viva el ensamblador".

Ejercicio de la tabla de edades, tiempo efectivo más de 12h

Calculadora, suma, resta, multiplicación, con pic y ensamblador, no tarde ni tres horas.

Teniendo en cuenta que el programa en C son 20 lineas de codigo y el ensamblador fueron 170 lineas, juzgar que se me da mejor....

Si pero, hay que comparar las mismas cosas, ¿cuanto cuesta realizar el programa de estas tablas en ensamblador? :D



Por cierto, para pasar de minúsculas a mayúsculas, no hace falta decidir nada, le aplicas la AND y como la pones a cero a piñon, es como si restaras 32 si es minúscula o no hicieras nada si es mayúscula.


20h es en hexadecimal, lo mismo que 32 en decimal o 32d

Pero al hacer la AND y la OR no sumas o restas, solo pones a uno o a cero un bit, mira la traza:

0100 0001 en binario ó 41h ó 65d (es la 'A' en ASCII)
0110 0001 en binario ó 61h ó 97d (es la 'a' en ASCII)

Fijate que se diferencia solo en un bit ¿que conseguimos si hacemos esto?
0110 0001 en binario ó 61h ó 97d (es la 'a' en ASCII)
AND
1101 1111 en binario ó DFh (no hace falta lo otro)
=
0101 0001 en binario ó 41h ó 65d, vamos la 'A' en ASCII, sin sumas ni restas.

A esto se refiere owockadoy. que ya ha puesto como se pondría en C.

nouc= c & 0xDF;

owockadoy
02/03/2010, 19:08
Desde la total y completa ignorancia en esto del C, poner 20h no seria otro "número mágico" pero en hexadecimal en vez de decimal?????

Bien visto :), pero erróneo.
Cuando te comenté lo del "número mágico" fue porque tú quitaste de tu programa un #define para hacer aparecer un número mágico en mitad del código. Cuando yo puse el 20h lo hice en la explicación de un algoritmo: tienes que hacer una operación lógica con ese valor. Otra cosa es cómo codifiques luego el programa.

Como regla general los "números mágicos" no deben aparecer en medio del código porque sí. Se pueden admitir sólo si aparecen una única vez en una función concreta y con un comentario al lado explicando qué es eso.
La práctica correcta es colocar en la cabecera del programa un #define por cada una de las constantes que utilices (con un comentario apropiado, por supuesto) y luego usar esa constante definida a lo largo del programa. De esa manera, si por cualquier razón la constante tiene que cambiarse, sólo se hace una vez en la cabecera y sus efectos se propagan a lo largo del código.

owockadoy
02/03/2010, 19:10
Pues tal y como se me estan dando las cosas, tengo que decir que estoy con dedalo "viva el ensamblador".



"Tu saber no que dices, mi joven aprendiz"
Fdo: Yoddah

Dedalo
02/03/2010, 19:18
Por cierto, para pasar de minúsculas a mayúsculas, no hace falta decidir nada, le aplicas la AND y como la pones a cero a piñon, es como si restaras 32 si es minúscula o no hicieras nada si es mayúscula.


20h es en hexadecimal, lo mismo que 32 en decimal o 32d

Pero al hacer la AND y la OR no sumas o restas, solo pones a uno o a cero un bit, mira la traza:

0100 0001 en binario ó 41h ó 65d (es la 'A' en ASCII)
0110 0001 en binario ó 61h ó 97d (es la 'a' en ASCII)

Fijate que se diferencia solo en un bit ¿que conseguimos si hacemos esto?
0110 0001 en binario ó 61h ó 97d (es la 'a' en ASCII)
AND
1101 1111 en binario ó DFh (no hace falta lo otro)
=
0101 0001 en binario ó 41h ó 65d, vamos la 'A' en ASCII, sin sumas ni restas.

A esto se refiere owockadoy. que ya ha puesto como se pondría en C.

nouc= c & 0xDF;

Ya, ¿Y con los simbolos que hay por encima y por debajo de a:z y A:Z?

Por ejemplo, los numeros en una cadena se convertirian en caracteres de control,mira la tabla ASCII, desde el 0 al 9, si les quitas el 5º bit te quedan los caracteres de control:

0 -> DLE
1 -> DC1
2 -> DC2
3 -> DC3
4 -> DC4
5 -> NAK
6 -> SYN
7 -> ETB
8 -> CAN
9 -> EM

El control es para que la conversion se aplique exclusivamente a los caracteres a los que esta dirigida la operacion.

Dedalo
02/03/2010, 19:23
Como regla general los "números mágicos" no deben aparecer en medio del código porque sí. Se pueden admitir sólo si aparecen una única vez en una función concreta y con un comentario al lado explicando qué es eso.
La práctica correcta es colocar en la cabecera del programa un #define por cada una de las constantes que utilices (con un comentario apropiado, por supuesto) y luego usar esa constante definida a lo largo del programa. De esa manera, si por cualquier razón la constante tiene que cambiarse, sólo se hace una vez en la cabecera y sus efectos se propagan a lo largo del código.

Ciertamente, cuando ahora reviso alguno de los programas de cuando empezaba a programar me vuelvo loco buscando esos numeros magicos distribuidos por el codigo.

Aunolose
02/03/2010, 19:42
Ya, ¿Y con los simbolos que hay por encima y por debajo de a:z y A:Z?

Por ejemplo, los numeros en una cadena se convertirian en caracteres de control,mira la tabla ASCII, desde el 0 al 9, si les quitas el 5º bit te quedan los caracteres de control:

0 -> DLE
1 -> DC1
2 -> DC2
3 -> DC3
4 -> DC4
5 -> NAK
6 -> SYN
7 -> ETB
8 -> CAN
9 -> EM

El control es para que la conversion se aplique exclusivamente a los caracteres a los que esta dirigida la operacion.

El control de si es una letra lo tienes que hacer igualmente, para evitar eso, lo que se trata de evitar con la AND es la suma o no, dependiendo de si es minúscula o no dicha letra. eso si, no puedes poner eso de "Ya es mayúscula"

navegante 420
02/03/2010, 20:32
Si pero, hay que comparar las mismas cosas, ¿cuanto cuesta realizar el programa de estas tablas en ensamblador? :D





Quieres decir que tardaria más de 12h????????

no lo creo.....:)

navegante 420
02/03/2010, 20:41
"Tu saber no que dices, mi joven aprendiz"
Fdo: Yoddah


Por eso me ha dejado mi compi que esta en la uni un librito mu guapo "introducción a la programación en C" de marco A. peña y Jose M. Cela de ediciones UPC que es la monda, por lo menos entiendo lo que me explica.....

Aunolose
02/03/2010, 21:04
Por eso me ha dejado mi compi que esta en la uni un librito mu guapo "introducción a la programación en C" de marco A. peña y Jose M. Cela de ediciones UPC que es la monda, por lo menos entiendo lo que me explica.....

Uy, ese me suena (claro que el nombre tampoco es gran cosa :D ) ¿es rojo?

Aunolose
02/03/2010, 21:04
Ah, no si es de la UPC no, el que yo digo es Mc Graw Hill

Aunolose
02/03/2010, 21:10
Quieres decir que tardaria más de 12h????????

no lo creo.....:)

¿con tablas? ¿en ensamblador? depende de lo que sean las tablas, pero a poco que quieras ordenarlas, buscar, saber donde acaba el nombre... no es lo mismo una tabla de valores numéricos que una alfanumérica.

Ten en cuenta que el ensamblador "ya lo dominas" y el C todavía no. Cuando lo domines verás.
De todas maneras, recuerda el C te lo puedes llevar a cualquier parte, cosa que el ensamblador no, aunque te cueste creerlo, el programa de las mayúsculas lo puedes pasar casi sin modificar a un PIC, y funcionará, dependiendo del compilador, el printf y el scanf se referirá al puerto serie, pero funcionará.

navegante 420
03/03/2010, 00:59
Uy, ese me suena (claro que el nombre tampoco es gran cosa :D ) ¿es rojo?


Más bien morado.

navegante 420
03/03/2010, 01:11
Ten en cuenta que el ensamblador "ya lo dominas" y el C todavía no. Cuando lo domines verás.
De todas maneras, recuerda el C te lo puedes llevar a cualquier parte, cosa que el ensamblador no, aunque te cueste creerlo, el programa de las mayúsculas lo puedes pasar casi sin modificar a un PIC, y funcionará, dependiendo del compilador, el printf y el scanf se referirá al puerto serie, pero funcionará.

No, si creeros os creo, y soy consciente de que cuando sepa C las posibilidades seran infinitas, pero como viste, mi primer contacto con C fue un poquito duro, y sin vaselina, espero que gracias a vuestra ayuda y al libro que me han dejado, se me pase el nudo que tengo y deje de atragantarseme el C.