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

#21
Muchas gracias. Explicación de 10!
#22
Buenas a todos otra vez, sigo atascado con este problema.

12) Diseñar un programa que genere y muestre en la pantalla ordenados los 100 primeros
números de un conjunto M definido de la siguiente forma:
i. 1 pertenece a M.
ii. Si x pertenece a M, entonces 2*x+1 y 3*x+1 también pertenecen a M.
iii. Ningún otro número pertenece a M.
El programa deberá producir una salida por pantalla de la forma:
M = {1, 3, 4, 7, 9, 10, ... }*/


La cosa es que empieza a generarme el conjunto bien (al menos los primeros números, los demás no he tenido manera de comprobarlos), pero derrepente salen valores desorbitados, como si en alguna parte del proceso hubiera datos basura que estuvieran estropeando el proceso, y no lo veo.

Os dejo el código:

Código (cpp) [Seleccionar]

#include <iostream>
using namespace std;

typedef long int Tarray [100];

void generarConjunto(Tarray ar);

bool esta(Tarray ar, int long n, unsigned pos);

void ordenar(Tarray ar);

void mostrar(Tarray ar);

//---------------------------

int main(){
   Tarray ar;
   generarConjunto(ar);
   cout<<"-----------------------------------"<<endl;
   ordenar(ar);
   mostrar(ar);


   return 0;
}

//---------------------------

void generarConjunto(Tarray ar){ //EL FALLO CREO QUE LO DA ESTA FUNCION,  QUE ES LA QUE GENERA LOS VALORES DEL CONJUNTO
   unsigned valor=0;
   ar[valor]=1;
   long int x=ar[valor];
   for(unsigned pos=1; pos<100; pos++){
       if(!esta(ar, 2*x+1, pos)){
           ar[pos]=2*x+1;
           cout<<ar[pos]<<endl;
       } //end if
       ++pos;
       if(!esta(ar, 3*x+1, pos)){
           ar[pos]=3*x+1;
           cout<<ar[pos]<<endl;
       }//end if
       ++valor;
       x=ar[valor];
   }//end for
}

bool esta(Tarray ar, int long n, unsigned pos){
   unsigned i=0;
   bool e =false;
   while(!e and i<pos){
       if(ar[i]==n) e=true;
       ++i;
   }//end while
   return e;
}

void ordenar(Tarray ar){
   int long aux=0;
   unsigned comp=0;
   do{
       for(unsigned pos=0; pos<99; pos++){
           if(ar[pos]>ar[pos+1]){
               aux=ar[pos];
               ar[pos]=ar[pos+1];
               ar[pos+1]=aux;
           }//end if
       }//end for
   ++comp;
   }while(comp<=1000); //podria sustituir esto por una funcion auxiliar que dijera si el array esta ordenado o no.
}

void mostrar(Tarray ar){
   for(unsigned pos=0; pos<100; ++pos){
       cout<<"->"<<ar[pos]<<endl;
   }//end for
}

#23
Programación C/C++ / Duda con los array C++
8 Agosto 2015, 11:37 AM
Buenas, tengo varias dudas manejando arrays, sobre todo al llamarlos en las cabeceras de las funciones o al inicializarlos.
Además, no se cuándo debo usar un array abierto o definir su tamaño.

A continuación dejo parte de un ejercicio en el que me da error ( storage size of 'ar' isn't known|)

Código (csharp) [Seleccionar]

typedef int Tarray [];

void generarConjunto(Tarray ar);  //esta función genera los 100 primeros nºs de un conjunto y los mete en un array.
                                       //Por lo que no se si debería haber definido la dimensión de Tarray como [100]


//-----------------

int main(){
   Tarray ar;  //¿Cuándo pongo los corchetes? En caso de tener que ponerlos,
                  //¿debo definir su tamaño, o el tamaño viene dado al inicializar el tipo Tarray?
                 //He probado a poner corchetes con y sin dimensión y me sale " declaration of 'ar' as multidimensional array must have bounds for all dimensions except the first"

   generarConjunto(ar);

   return 0;
}


Dejo el enunciado del ejercicio, por si os facilita algo:

12) Diseñar un programa que genere y muestre en la pantalla ordenados los 100 primeros
números de un conjunto M definido de la siguiente forma:
i. 1 pertenece a M.
ii. Si x pertenece a M, entonces 2*x+1 y 3*x+1 también pertenecen a M.
iii. Ningún otro número pertenece a M.
El programa deberá producir una salida por pantalla de la forma:
M = {1, 3, 4, 7, 9, 10, ... }*/



Gracias. Siento ser tan repetido en el foro haciendo todo tipo de preguntas.
#24
Buenas, estoy haciendo ejercicios de array. He terminado uno y funciona correctamente pero creo que he hecho bastantes chapuzas en el código y me gustaría que lo vierais para pulirlo un poco.

Gracias.

Código (cpp) [Seleccionar]

/*
11) Diseñar un programa en C++ para determinar la disponibilidad de una serie de personas
para reunirse algún día de un cierto mes. Para esto, el programa deberá preguntar el
número de días del mes (28, 29, 20 0 31) y el número de personas que deben reunirse; con
estos datos, pedirá, una a una, a cada persona cuáles son los días (de 1 al número de días
del mes) que tiene disponibles y con ayuda de un único array deberá presentar en
pantalla los días disponibles en que coinciden todas las personas.*/

#include <iostream>
using namespace std;

typedef int  Tarray [];

void eliminarDia (int noPuede,int  dias, Tarray ar);

void siPuede (Tarray ar);


int main(){
   Tarray ar={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};
   int dias=0, personas=0, noPuede=0;
   do{
       cout<<"Introduzca el numero de dias del mes: ";
       cin>>dias;
   }while(dias<28 or dias>31);

   if(dias==28){
       ar[30]=0;
       ar[29]=0;
       ar[28]=0;
   }
   else if (dias==29){
       ar[30]=0;
       ar[29]=0;
   }
   else if(dias==30){
       ar[30]=0;
   }
   else;
   cout<<"Cuantas personas desea que se reunan?: ";
   cin>>personas;

   for(unsigned contador=1; contador<=personas; contador++){
       while(noPuede!=-1){ //Para pasar a la siguiente persona
           cout<<"Persona "<<contador<<" ,dia que no puede reunirse: ";
           cin>>noPuede;
           eliminarDia(noPuede, dias, ar);
       }
       noPuede=0;
   }
   siPuede(ar);
   return 0;
}


void eliminarDia (int noPuede,int  dias, Tarray ar){
   if(noPuede!=-1){
       for(unsigned i=0; i<dias; i++){
           if(ar[i]==noPuede) ar[i]=0;
       }
   }
}

void siPuede (Tarray ar){
   cout<<"Todos pueden: "<<endl;
   for(unsigned i=0; i<31; i++){
       if(ar[i]!=0) cout<<ar[i]<<endl;
   }
}

#25
Buenas, quiero invertir un array de manera que la posicion vec[0] sea la vec[dim], vec[1] sea vec[dim-1], etc. Pensaba que no iba a ser un problema pero al parecer no me funciona. Echadle un vistazo por favor.

Código (cpp) [Seleccionar]

void invertir(Tvector vec, unsigned dim){
    for(unsigned i=0; i<dim; ++i){
        vec[i]=vec[dim-i];
    }
}


Gracias.
#26
Vale, quizás debería haber puesto lo siguiente, ya que como dices mes está estático y contador es la variable que va sumando los días de los respectivos meses hasta la variable mes.

Código (cpp) [Seleccionar]

int mesAdias(int mes, int anno){
   int dias=0;
   for(unsigned contador=1; contador<=mes; contador++){
       if([b]contador[/b]%2==0){
           if([b]contador[/b]==2){
               if(esbisiesto(anno))dias+=29;
               else dias+=28;
           }else if (mes==8) dias+=31;
            else dias+=30;
       }else dias+=31;
   }
   return dias;
}



PD: Acabo de probarlo y me devuelve 29 días :(

Por cierto, la función annoAdias lo que hace es pasar cuantos días sería en este caso 2000 años con su bucle for en el que contador va de 1 a 2000 sumando cada pasada 365 dias (o 366 según sea bisiesto).

mesAdias hace algo similar, con mes=2 el bucle for recorre con contador del 1 al 2 y suma a dias 31+28 (o 29 días si es bisiesto)
#27
Buenas, he corregido un par de cosas basadas en el error de que agosto tiene 31 días y no 30.

Código (cpp) [Seleccionar]

int ultimodelmes (int mes, int anno){
    if (mes==2){
        if(esbisiesto(anno)) return 29;
        else return 28;
    }else if (mes!=2 and mes%2==0){
        if(mes==8) return 31;
        else return 30;
    }
    else return 31;
}


y

Código (cpp) [Seleccionar]

int mesAdias(int mes, int anno){
    int dias=0;
    for(unsigned contador=1; contador<=mes; contador++){
        if(mes%2==0){
            if(mes==2){
                if(esbisiesto(anno))dias+=29;
                else dias+=28;
            }else if (mes==8) dias+=31;
             else dias+=30;
        }else dias+=31;
    }
    return dias;
}




He comprobado que funcione con las siguientes  2 fechas: 2/2/2000 y 2/1/2000 y me dice que la diferencia son 27 días... sigo sin ver el problema...
#28
cierto, no me había dado cuenta, ahora cuando llegue a casa lo pruebo. Puede que fuese por esa tontería.

Gracias.
#29
Buenas, son varios ejercicios, aquí os dejo los enunciados.

12) Teniendo en cuenta que el calendario gregoriano está vigente desde 1583 y que, según
este calendario, son bisiestos los años divisibles por 4, salvo los años seculares (los
divisibles por 100) que además deben ser divisibles por 400 para que sean bisiestos,
defínanse las funciones siguientes: bool esBisiesto(int anno), que determina si un
año del calendario gregoriano es bisiesto o no; int ultimoDeMes(int mes, int anno),
que calcula el último día de cada mes, teniendo en cuenta el año y bool
fechaCorrecta(int dia,int mes,int anno), que determina si los valores de sus
argumentos corresponden a una fecha correcta o no en el calendario gregoriano.
13) Continuando con el ejercicio anterior, defínanse también las funciones void
avanzar(int& d, int& m, int& a), que avanza un día la fecha del argumento y void
retroceder(int& d, int& m, int& a), que retrocede un día la fecha del argumento.
14) Defínanse las funciones: bool esAnterior(int d1,int m1,int a1,int d2,int
m2,int a2), que determina si la fecha d1/m1/a1 es anterior o no a la fecha d2/m2/a2, y
int diferencia(int d1,int m1,int a1,int d2,int m2,int a2), que calcula el
número de días que debe avanzar (resultado positivo) o retroceder (resultado negativo) la
fecha d1/m1/a1 hasta alcanzar la fecha d2/m2/a2.
15) Agrúpense las funciones de los tres ejercicios anteriores en un programa repetitivo que
pida una fecha del teclado, compruebe si es correcta, y ofrezca una serie de opciones para
avanzar o retroceder la fecha, para comparar con otra fecha, que se pedirá del teclado, o
para calcular la diferencia de días con otra fecha que también se deberá leer del teclado.



Me funciona todo excepto calcular la diferencia de días entre 2 fechas y la verdad tengo la cabeza saturada, ya he descubierto unos cuantos fallos que he arreglado, pero aun así sigue sin darme la diferencia correcta. Concretamente el error suceda si introduzco meses o años diferentes.

Código (cpp) [Seleccionar]

#include <iostream>
using namespace std;

bool esbisiesto(int anno);

int ultimodelmes (int mes, int anno);

bool fechacorrecta(int dia, int mes, int anno);

void avanzar(int& d, int& m, int& a);

void retroceder(int& d, int& m, int& a);

bool esAnterior(int d1,int m1,int a1,int d2,int m2,int a2);

int diferencia(int d1,int m1,int a1,int d2,int m2,int a2);

int mesAdias (int mes, int anno);

int annoAdias (int anno);


//-------------------

int main(){
   int dia, mes, anno;
   int dia2, mes2, anno2;
   do{
       cout<<"Introduce una fecha para saber si es correcta (dia, mes, año): "<<endl;
       cout<<"Dia: ";
       cin>>dia;
       cout<<"Mes: ";
       cin>>mes;
       cout<<"año: ";
       cin>>anno;
       if (fechacorrecta(dia, mes, anno)) cout<<"Ha introducido una fecha correcta."<<endl;
       else cout<<"Fecha incorrecta."<<endl;
   }while(!fechacorrecta(dia, mes, anno));

   int menu=999;
   while(menu!=0){
       cout<<endl
           <<"###########################################################"<<endl
           <<"1.Avanzar un dia la fecha."<<endl
           <<"2.Retroceder un dia la fecha."<<endl
           <<"3.Comparar fecha introducida con otra a introducir."<<endl
           <<"4.Calcular la diferencia en dias de la fechas introducidas."<<endl
           <<"0.Salir"<<endl
           <<"-----------------------------------------------------------"<<endl
           <<endl;

       cout<<"Introduzca una opcion valida: ";
       cin>>menu;

       switch (menu){

           case 0:
           break;

           case 1:
               avanzar(dia, mes, anno);
               cout<<dia<<"/"<<mes<<"/"<<anno<<endl;
           break;

           case 2:
               retroceder(dia, mes, anno);
               cout<<dia<<"/"<<mes<<"/"<<anno<<endl;
           break;

           case 3:
               do{
                   cout<<"Introduce otra fecha para comparar: "<<endl;
                   cout<<"Dia: ";
                   cin>>dia2;
                   cout<<"Mes: ";
                   cin>>mes2;
                   cout<<"año: ";
                   cin>>anno2;
               }while(!fechacorrecta(dia2, mes2, anno2));

               if(esAnterior(dia, mes, anno, dia2, mes2, anno2)) cout<<dia<<"/"<<mes<<"/"<<anno<<" es anterior a "<<dia2<<"/"<<mes2<<"/"<<anno2<<endl;
               else cout<<dia<<"/"<<mes<<"/"<<anno<<" NO ES anterior a "<<dia2<<"/"<<mes2<<"/"<<anno2<<endl;
           break;

           case 4:
               do{
                   cout<<"Introduce otra fecha para comparar: "<<endl;
                   cout<<"Dia: ";
                   cin>>dia2;
                   cout<<"Mes: ";
                   cin>>mes2;
                   cout<<"año: ";
                   cin>>anno2;
               }while(!fechacorrecta(dia2, mes2, anno2));

               cout<<diferencia(dia, mes, anno, dia2, mes2, anno2);
           break;




           }


   }
return 0;
}

//-------------------

bool esbisiesto(int anno){
  if(anno>1583){
       if(anno%4==0){
           if((anno%100==0) and (anno%400==0)){
               return true;
           }else  return true;


       }else return false;

   }else return false;
}

int ultimodelmes (int mes, int anno){
   if (mes==2){
       if(esbisiesto(anno)) return 29;
       else return 28;
   }else if (mes!=2 and mes%2==0) return 30;
   else return 31;
}

bool fechacorrecta(int dia, int mes, int anno){
   if(dia>31 or mes>12 or anno<1583){
       return false;
   }else{
       if(dia>ultimodelmes(mes, anno)) return false;
       else return true;
   }
}

void avanzar(int& d, int& m, int& a){
   ++d;
   if(d>ultimodelmes(m,a)) ++m;
   if(m>12){
       ++a;
       m=1;
       d=1;
   }

}

void retroceder(int& d, int& m, int& a){
   --d;
   if(d<1){
       if(m>1){
           --m;
           d=ultimodelmes(m, a);
       }else{
           m=12;
           --a;
           d=ultimodelmes(m, a);
       }
   }
}

bool esAnterior(int d1,int m1,int a1,int d2,int m2,int a2){
   if(a1>a2) return false;
   else if (a1<a2) return true;
   else{
       if(m1>m2) return false;
       else if(m1<m2) return true;
       else {
           if(d1>d2) return false;
           else if(d1<d2) return true;
           else cout<<"LAS DOS FECHAS SON LA MISMA"<<endl;
       }
   }
}

int mesAdias(int mes, int anno){
   int dias=0;
   for(unsigned contador=1; contador<=mes; contador++){
       if(mes%2==0){
           if(mes==2){
               if(esbisiesto(anno))dias+=29;
               else dias+=28;
           }else dias+=30;
       }else dias+=31;
   }
   return dias;
}

int annoAdias(int anno){
   int dias=0;
   for(unsigned contador=1; contador<= anno; contador++){
       if(esbisiesto(anno)) dias+=366;
       else dias+=365;
   }
   return dias;
}

int diferencia(int d1,int m1,int a1,int d2,int m2,int a2){
   int suma1=0, suma2=0;
   suma1=d1+mesAdias(m1, a1)+annoAdias(a1);
   suma2=d2+mesAdias(m2, a2)+annoAdias(a2);
   if (suma1<=suma2) return suma2-suma1;
   else return suma1-suma2;
}



#30
Si, tu codigo funciona perfectamente, ahora estoy intentado entenderlo...

No entiendo bien qué se está haciendo en el if y por qué un primo es primo(i) y otro primo(n-i)

PD: Vale , ya se lo que haces

Gracias engel lex y joecarl