› Foros › PC › Software libre
Ferdy escribió:Si seguis haciendo los deberes de la gente no aprenderán nunca. Es mejor (pero más dificil) dar pistas.
Crapos escribió:Hola, me podeis ayudar a plantear esto? quiero decir, no es ayuda sobre el codigo, si no, que no se como hacer una comparacion del caracter que introduzco con la tabla ASCII.
Escribe un programa en C que, dada una variable de tipo carácter indique si el valor de la mima es un carácter alfabético, numérico o especial. Utiliza la tabla de caracteres ASCII.
Como es esa comparacion? existe algun modo en c en que yo pueda hacer una comparacion con la tabla, porq la tabla ya esta iguardada previamente?
Gracias, gracias, gracias.
#include <stdio.h>
#define N 10
int main() {
int valor[N], indice, maxima;
for (indice = 0; indice < N; indice++) {
printf("Introduce el valor Nº%d: ", indice+1);
scanf("%d", &valor[indice]);
}
printf("\n");
/*Càlculo máximo*/
maxima = valor[0];
for (indice = 1; indice < N; indice++) {
if (maxima < valor[indice]) {
maxima = valor[indice];
}
}
#include <stdio.h>
#include <stdlib.h>
#define N 10
int max(int *x) {
int m,cont = 0;
m = *x;
for (cont = 0; cont < N; cont++) {
if (m < *(x+cont)) {
m = *(x+cont);
}
}
return m;
}
int main() {
int *p, cont;
p=(int*)malloc(N*sizeof(int));
for (cont = 0; cont < N; cont++) {
printf("Introduce el valor Nº%d: ", cont+1);
scanf("%d", p+cont);
}
printf("El máximo es %d\n",max(*p));
}
pedro4949 escribió:#include <stdio.h>
#include <conio.h>
main()
{
int x1=0;
int x2=0;
int y1=0;
int y2=0;
int pendiente=0;
printf("introduce x de la primera coordenada\n");
scanf("%d",&x1);
printf("introduce y de la primera coordenada\n");
scanf("%d",&y1);
printf("introduce x de la segunda coordenada\n");
scanf("%d",&x2);
printf("introduce y de la segunda coordenada\n");
scanf("%d",&y2);
pendiente=(y2-y1)/(x2-x1);
printf("la pendiente de las coordenadas (%d,%d) y (%d,%d) es:%.2f",x1,y1,x2,y2,pendiente);
getch();
}
aunque tambien lo puedes hacer con un for{}
pero todabia me falta en el valor de la pendiente no me sale bien la respuesta solo me sale 0.00 y noce si algo esta mal o es que el float no puede sacar valores negativo porque yo probe con cordenadas que dan una pendiente positiva y si me la saca pero luego probe con coordenadas que dan una pendiente negativa y siempre me sale 0.00 si me pueden guiar en eso que noce que es, el ejemplo que use para la pendiente negativa es (3,2) y (1,3) que seria con la ecuancion pendiente =(3-2)/(1-3) lo que da una pendiente de -0,5; y lo que quiero saber es como puedo hacer que me saque resultados negativo, porfa ayuda gracias de ante mano
//Incluimos librerias a usar
#include <stdio.h>
#include <stdlib.h>
//Inicio de la función principal
main()
{
int x1=0;
int x2=0;
int y1=0;
int y2=0;
float pendiente=0;
//Pedimos datos por teclado
printf("introduce x de la primera coordenada\n");
scanf("%d",&x1);
printf("introduce y de la primera coordenada\n");
scanf("%d",&y1);
printf("introduce x de la segunda coordenada\n");
scanf("%d",&x2);
printf("introduce y de la segunda coordenada\n");
scanf("%d",&y2);
//Realizamos la operacion
pendiente=(float)(y2-y1)/(x2-x1);//Convertimos una operación de enteros a reales
//Mostramos los datos por pantalla
printf("la pendiente de las coordenadas (%d,%d) y (%d,%d) es:%.2f",x1,y1,x2,y2,pendiente);
system("pause");
return 0;
//Fin de la funcion principal
}
int *p, int array[N], cont;
p = &array[0];
pedro4949 escribió:#include <stdio.h>
#include <conio.h>
main()
{
int x1=0;
int x2=0;
int y1=0;
int y2=0;
int pendiente=0;
printf("introduce x de la primera coordenada\n");
scanf("%d",&x1);
printf("introduce y de la primera coordenada\n");
scanf("%d",&y1);
printf("introduce x de la segunda coordenada\n");
scanf("%d",&x2);
printf("introduce y de la segunda coordenada\n");
scanf("%d",&y2);
pendiente=(y2-y1)/(x2-x1);
printf("la pendiente de las coordenadas (%d,%d) y (%d,%d) es:%.2f",x1,y1,x2,y2,pendiente);
getch();
}
aunque tambien lo puedes hacer con un for{}
pero todabia me falta en el valor de la pendiente no me sale bien la respuesta solo me sale 0.00 y noce si algo esta mal o es que el float no puede sacar valores negativo porque yo probe con cordenadas que dan una pendiente positiva y si me la saca pero luego probe con coordenadas que dan una pendiente negativa y siempre me sale 0.00 si me pueden guiar en eso que noce que es, el ejemplo que use para la pendiente negativa es (3,2) y (1,3) que seria con la ecuancion pendiente =(3-2)/(1-3) lo que da una pendiente de -0,5; y lo que quiero saber es como puedo hacer que me saque resultados negativo, porfa ayuda gracias de ante mano
Puyover escribió:Tu código es correcto, sin embargo en la invocación a max, lo que haces es pasarle el contenido a lo que apunta p (*p) y al tratarse de un array esto no funciona ya que debes pasarle el puntero en sí (p), así que cambia el max(*p) por max(p) y ya te debería de funcionar.
Puyover escribió:Una duda que me ha surgido. Porque reservas así la memoria para el puntero?
No podrías haber hecho:int *p, int array[N], cont;
p = &array[0];
?
Aunque supongo que lo tuyo será mas eficiente, no lo se
Serginius escribió:Vale... se me ha escapado esa línea xD Era para probar cosas...
A ver... lo que quiero hacer es que yo asigno los valores en main, despues mando los valores a la función max para que trabaje con ellos, entonces mi método chustero es enviar el *p como variable a la función max, no sé si se entiende mi idea... u_u
Lo que no quiero es enviar la posición 2 o la posición 3, por decir algo, quiero enviar "todo el pack", para entendernos ^^"
Y esta p=(int*)malloc(N*sizeof(int)); en teoría si que está bien puesta y dice que reserve 10 espacios de memoria si no recuerdo mal
//Declaracion de librerias y valores predefinidos
#include <stdio.h>
#include <stdlib.h>
#define N 10
//declaracion de variables
void introducir_valores_array(int valor[]);
int calcular_maximo(int valor[]);
//Funcion principal
int main()
{
//Declaracion de variables de la funcion principal
int valor[N], maxima;
//Mandamos un vector de numeros enteros a la funcion encarga de dar valores
introducir_valores_array(valor);
/*Guardamos en la variable "maxima", el maximo obtenido en
la funcion calcular maximo, que tiene como atributo el vector "valor"*/
maxima=calcular_maximo(valor);
//Mostramos el maximo por pantalla
printf("La maxima es: %i \n",maxima);
system("pause");
return 0;
//Fin de la funcion principal
}
//Desarrollo de funciones
void introducir_valores_array(int valor[])
{
int i=0;
for(i=0;i<N;i++)
{
//Vamos pidiendo valores para rellenar el vector
printf("Introduce el valor para posicion %i : \n",i+1);
_flushall();
//Los guardamos en la posicion correspondiente
scanf("%i",&valor[i]);
}
}
int calcular_maximo(int valor[])
{
int maxima=0;
maxima=valor[0];//Iniciamos el valor de la maxima con el primer valor del vector
int i=0;
for(i=0;i<N;i++)
{
if(valor[i]>maxima)//Si el dato que se guarda en la posicion "i" del vector es mayor a la maxima....
{
maxima=valor[i];//ese valor pasa a ser la nueva maxima
}
}
return maxima;//devolvemos el ultimo valor asignado a la maxima a la funcion principal
}
Serginius escribió:No entiendo porque declaras las funciones como variables globales :/
Concretamente esto:
//declaracion de variables
void introducir_valores_array(int valor[]);
int calcular_maximo(int valor[]);
Lo demás lo tengo casi igual
#include <stdio.h>
#include <stdlib.h>
#define N 10
int maximo(int valor[]);
int main() {
int valor[N], cont,max;
for (cont = 0; cont < N; cont++) {
printf("Introduce el valor Nº%d: ", cont+1);
scanf("%d", valor[cont]);
}
max = maximo(valor);
printf("El máximo es %d\n",max);
}
int maximo(int valor[]) {
int max,cont = 0;
max = valor[0];
for (cont = 0; cont < N; cont++) {
if (max < valor[cont]) {
max = valor[cont];
}
}
return max;
}
char diagrama[N][N]={
{' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' ',' ',' ',' '},
{'*','*',' ',' ',' ',' ',' ',' ',' '},
{'*','*',' ',' ',' ',' ',' ',' ',' '},
{'*','*',' ',' ',' ',' ',' ',' ',' '},
{'*','*',' ','*','*',' ',' ',' ',' '},
{'*','*',' ','*','*',' ',' ',' ',' '},
{'*','*',' ','*','*',' ','*','*',' '},
{'*','*',' ','*','*',' ','*','*',' '}
};
Serginius escribió:Puyover escribió:Una duda que me ha surgido. Porque reservas así la memoria para el puntero?
No podrías haber hecho:int *p, int array[N], cont;
p = &array[0];
?
Aunque supongo que lo tuyo será mas eficiente, no lo se
Yo tampoco lo sé xD Lo he hecho así porque es como salía en un ejemplo de punteros que nos han puesto.
p = &array[0];
p = array;
Serginius escribió:Yo llevo poco programando, pero creo que se pone (float) delante de la operación para que evalúe el resultado de la operación entre 2 int como un float, por ejemplo, si yo tengo:
int x=3,y=2;
float resultado;
resultado = x/y <-- Creo que devolvería 1 (no estoy seguro)
En cambio, poniendo resultado = (float)x/(float)y devuelve 1.5
float resultado;
int x = 3;
int y = 2;
resultado = x /y;
resultado = (float) (x) / (float) (y);
Iverson88 escribió:int x=3,y=2;
float resultado=0; //Inicializamos a 0 para que no guarde "basura"
resultado=(float)x/y;
Serginius con ponerlo como he indicado vale, no hace falta (float)x/(float)y;
Iverson88 escribió:Una operación que implique como resultado otro tipo de variable (long int o float) te va a devolver un resultado no satisfactorio, para convertir una operacion de enteros a real lo indicamos en almenos uno de las variables implicadas.
Espero que se me haya entendio jaja que creo que no me expresao bien
Esto que dices es válido en ciertas arquitecturas... pero no es una verdad universal. Lo que estás haciendo es forzar a x a ser float, pero no se dice nada acerca de y, y el encargado de hacer los casts (no sé si será el compilador) puede hacer todo al revés de lo que piensas.
srpatato escribió:Tan estándar como que en Linux y en Windows se producen resultados distintos?
creo que ponerle float a cada variable en vez de a la operacion es mas una mania que un necesidad para obtener un valor real de una division de dos enterosSerginius escribió:A mi lo del (float)x/(float)y me lo puso el profe en un código mio al verlo, no sé, yo lo pondría, que total no viene de 4 letras xD
Ahí está, no me salía lo que dice Ferdy. El tema es que yo creía recordar que la promoción se hacía hacia el tipo que contiene menor información (int), en lugar de al de mayor información (float). Pero con lo que habéis dicho, ya no me queda claro cuál es el modo de promoción y seguramente esté equivocado.
unsigned long a;
...
unsigned long b = a + 1;
En cualquier caso, y esto ya es personal, NO poner (float) x / (float) y EMHO es una chapuza. En este caso solo mezclas dos operandos de tipo int, pero cuando programes algo más tocho y tengas que hacer chorizos de cuentas, a no ser que vayas haciendo cuentas parciales, te puedes hacer la picha un lío.
Ferdy escribió:Ahem, http://www.open-std.org/JTC1/SC22/WG14/ ... .html#9899
En concreto ese punto dice: "The type of an integer constant is the first of the corresponding list in which its value can
be represented." y la lista para 'Decimal Constant' es "int, long int, long long int".
srpatato escribió:He mirado el documento más reciente de esa web, pero en el punto 6.4.4.1 al que te referías lo que se explica no son las promociones, sino el tipo y la base numérica de las constantes, no tiene nada que ver con la promoción.
pero eso sí, sigo recomendando especificar la promoción o la democión (?) siempre que haga falta, a cabezón no me gana nadie
Ferdy escribió:srpatato escribió:(...)
Es que yo no dije que hablara de las promociones. Intentaba ilustrar por qué el modelo de promociones que planteabas era ridículo. En esa suma estarías operando en 'int' (por culpa del 1) cuando deberías operar en unsigned long (por tener más rango).
Ferdy escribió:srpatato escribió:pero eso sí, sigo recomendando especificar la promoción o la democión (?) siempre que haga falta, a cabezón no me gana nadie
Es que cuando haga falta si no lo haces, no funciona
- ferdy
Serginius escribió:Buenas, tengo otra duda!
Cómo puedo hacer que me redondee hacia arriba el resultado de una operación? (En C), me iría de perlas para un programa pero no se hacerlo... algo similar a cuando haces la división entre 2 ints, que redondea hacia abajo, pues eso...
Gracias!