Webcampista.com

mucho más que un foro

Programar en C

navegante 420

la nave nodriza
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.
 
¿quieres que diga donde está el error?... :D

Creo que hay dos...
 
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++
 
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...
 
#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...
 
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/

 

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????
 
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.

attachment.php
 

Archivos adjuntos

  • mayusculas.jpg
    mayusculas.jpg
    50,9 KB · Visitas: 0
Bueno, no soy tan inútil en esto.... he conseguido gracias a las indicaciones de aunolose corregir uno....

attachment.php


attachment.php


attachment.php


Pero el anterior no lo veo...
 

Archivos adjuntos

  • tabla inicial.jpg
    tabla inicial.jpg
    32,5 KB · Visitas: 0
  • tabla corregido.jpg
    tabla corregido.jpg
    33,6 KB · Visitas: 0
  • tabla fun.jpg
    tabla fun.jpg
    33,7 KB · Visitas: 0
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...
 
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
 
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'
 
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...
 
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....
 
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;
}
 
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.
 
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.
 
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.

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.....
 
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.

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
 
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.
 
Arriba
© 2004-2024 Webcampista.com