C/Visual C - Duda de novato con sentencia FOR

   
Vista:

Duda de novato con sentencia FOR

Publicado por Ignacio (5 intervenciones) el 25/11/2014 20:46:49
Buenas tardes/noches a todos ,
Me llamo Ignacio y soy nuevo en este foro y en la programación en general (pero le estoy poniendo muchas ganas jejeje).Actualmente sigo un curso de C de Nacho Cabanes (excelente de momento he de decir) encontrado en esta página y en uno de los ejercicios que propone me asaltan las dudas .Se trata de hacer un programa que diga los dia que faltan hasta final de año a partir de una fecha dada .Se me ha ocurrido este código :

// Programa para saber cuantos dias
// hasta fin de año a partir de una fecha dada

#include <stdio.h>

int main()
{
int mes[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int dia[31];
int diasFin; // Variable para almacenar los dias hasta fin de año
int diasMF; // Variable para almacenar los dias de los meses faltantes hasta fin de año
int i;
printf("Introduce numero de mes (1=Enero,2=Febrero...) : ");
scanf("%d",&mes);
printf("\nIntroduce numero de dia del mes (Del 1 al 31) : ");
scanf("%d",&dia);
diasMF=0;
for (i=mes;i<=12;i++)
{
diasMF+=mes[i];

}
diasFin=((31-dia)+(365-diasMF));
printf("\nLos dias que faltan hasta Nochevieja son %d \n ",diasFin);

return 0;

}

Pero al compilar me da un error en la linea "diasFin=((31-dia)+(365-diasMF));" que dice lo siguiente :
*****error: invalid operands to binary - (have 'int' and 'int *')|*****
Entiendo que no se puede hacer la resta 31-dia ,pero no se me ocurre por qué .Y si borro dicha resta para ver si el resto está bien ,el programa compila y se ejecuta pero siempre dice que faltan 365 dias ,ponga el valor que ponga por lo que me imagino que la parte de la sentencia "for" también está mal.

Si alguien me pudiera iluminar un poco se lo agradeceré eternamente.

Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
información
Otras secciones de LWP con contenido de C/Visual C
- Código fuente de C/Visual C
- Cursos de C/Visual C
- Temas de C/Visual C
- Chat de C/Visual C
información
Códigos de C/Visual C
- Reinas
- Caja Registradora
- Libreria LL

Duda de novato con sentencia FOR

Publicado por Capitan Kirk capitan.kirk09@gmail.com (94 intervenciones) el 26/11/2014 08:20:33
El error es por lo siguiente:
Has puesto

printf("Introduce numero de mes (1=Enero,2=Febrero...) : ");
scanf("%d",&mes);

cpn scanf estás pidiendo un entero, pero mes lo has declarado como array de 12 números enteros. Ten en cuenta que, en C/C++, el nombre de un array es un puntero al primer elemento. Por tanto, mes es un puntero que apunta al primer elemento del array, y de ahí el error: estás intentando meter un entero en un puntero. Lo mismo ocurre a continuación, cuando pides el número del día.

Otro error que has cometido (este es típico de principiantes) es que en el bucle has puesto

for (i=mes;i<=12;i++)
{
diasMF+=mes[i];
}

es que los índices de un array de N elementos van siempre de 0 a N-1. En tu caso, mes es un array de 12 elementos, por lo que los índices van de 1 a 12. Tendrías que haber puesto en ese bucle:

for (i=dia_del_mes-1; i<12; i++)

He puesto dia_del_mes como variable porque mes (como tú habías puesto) es un array de enteros, no un número entero.

Estos son los errores que he visto. No he comprobado si hay algún error en la lógica del cálculo, eso es cosa tuya.

Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

**SOLUCIONADO** Duda de novato con sentencia FOR

Publicado por Ignacio (5 intervenciones) el 26/11/2014 20:11:46
Hola Capitán Kirk y gracias por contestar .

A ver si lo he entendido bien y lo he reescrito bien :

Al decirme que en los "scanf" pido un entero pero he declarado un array he introducido las variables "integer" 'meses' y 'diaMes' para arreglarlo .Y en la sentencia "for" también había un error como bien has señalado ,así que he introducido la variable 'meses' en la primera parte ("desde" i=meses) y he corregido el error que había también en la parte de "hasta" (i<=11,en vez de i<=12 como estaba antes y sumaba una vez de más) .Y en la última parte ,para averiguar el numero de dias hasta el fin de año ,he suprimido el número 365 que realmente no hacia falta .El código queda así :

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
// Programa para saber cuantos dias
// hasta fin de año a partir de una fecha dada
 
#include <stdio.h>
 
int main()
{
int mes[12]={31,28,31,30,31,30,31,31,30,31,30,31}; // Array con los dias de cada mes
int meses; // Variable para almacenar el numero de mes
int diaMes; // Variable para almacenar el dia del mes
int diasFin; // Variable para almacenar los dias hasta fin de año
int diasMF; // Variable para almacenar los dias de los meses faltantes hasta fin de año
int i;
printf("Introduce numero de mes (1=Enero,2=Febrero...) : ");
scanf("%d",&meses);
printf("\nIntroduce numero de dia del mes (Del 1 al 31) : ");
scanf("%d",&diaMes);
 
for (i=meses;i<=11;i++)
{
diasMF+=mes[i-1];
}
diasFin=((31-diaMes)+diasMF);
printf("\nLos dias que faltan hasta Nochevieja son %d \n ",diasFin);
 
return 0;

Lo he probado y funciona .Aunque seguro que se puede hacer con menos líneas y de forma más eficiente.

!Estoy abierto a críticas ¡.

Lo dicho ,¡muchas gracias Capitán Kirk!.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda de novato con sentencia FOR

Publicado por Capitan Kirk capitan.kirk09@gmail.com (94 intervenciones) el 27/11/2014 14:35:33
Nada hay que criticar, si el programa funciona. Las (posibles) optimizaciones o el ahorro de líneas es algo que irás haciendo con el tiempo, conforme acumules experiencia. Te indico una pequeña mejoa que añadir al programa: Pide el año en el que estás y comprueba si es bisiesto para el cálculo de los días que quedan.

Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar