Dev - C++ - por favor ayuda con trabajo final sobre funciones

 
Vista:
Imágen de perfil de francisco

por favor ayuda con trabajo final sobre funciones

Publicado por francisco (6 intervenciones) el 13/12/2016 17:18:10
Hola a todos

desde hace unos meses que empeze a estudiar C++, he podido con todos los ejercicios que me han dado, pero este ultimo me tiene loco, casi llorando, apunto de tirar la toalla...

El problema es el siguiente:

Me piden hacer un programa que sume , saque la media, me muestre el numero mayor y el segundo numero mayor de una lista de numeros ingresados por el usuario.

El problema lo solucione con sentencias IF, pero me piden hacerlo con funciones. :(

LLevo muchisimo tiempo tratando de hacer funcionar esto y todavia no se porque no funciona...El problema lo tengo especificamente con el numero mayor y el segundo mayor ..........

estaria muy agradecido si alguien me pudiera ayudar!!! GRACIAS..

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include<iostream>
#include<conio.h>
 
using namespace std;
 
 
void numeroMayor (int a, int b);
void segundoNumMayor (int a, int b, int c);
 
 
int main(int argc, char * argv[]) { // argumento para trabajar con una lista indefinida de numeros
 
 
	int Lin = 0;                  //  lista de numeros
	int suma = 0;                 //  
	int Tnum = 0;                //  total del numero en la lista
	int Nmax;                 //  numero mayor
	int sMax;                //  segundo numero mayor
 
 
	while (true) {
 
		cout << "***   untroduce una serie de numeros :   * preciona 0 para finalizar* " << endl;
		cin >> Lin;
		cout << endl;
 
		if (Lin == 0) {
			break;
 
		}
 
		suma += Lin;  // suma los numeros admitos en Lin
		Tnum++;       // El numero de los valores en la lista
 
 
	}
 
 
	cout << "Summa                  = " << suma << endl;
	cout << "Media                     = " << (float)suma / (float)Tnum << endl;
	cout << "Numero Mayor     = " << Nmax << endl;
	cout << "segundo Mayor    = " << sMax << endl;
	cout << endl;
	cout << endl;
 
	numeroMayor(Lin, Nmax);
	segundoNumMayor (Lin, Nmax, sMax);
 
 
	_getch();
	return 0;
 
}
 
void numeroMayor (int a, int b) {
 
	if (a > b)                        // the largest number                            
		b = a;
 
 
	cout << "1 2 3 probando  Nmax " << b << endl;     // probando si la funcion funciona
	cout << endl;
}
 
 
void segundoNumMayor (int a, int b, int c) {
 
	if (a < b && a > c)
		c = a;
 
 
	cout << "1 2 3 probando  sMax " << c << endl;      // probando si la funcion funciona
	cout << endl;
}
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
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

por favor ayuda con trabajo final sobre funciones

Publicado por agustin (522 intervenciones) el 13/12/2016 19:55:05
Creo que no has entendido lo que te piden.
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
Imágen de perfil de francisco

por favor ayuda con trabajo final sobre funciones

Publicado por francisco (6 intervenciones) el 14/12/2016 13:21:57
gracias por tu ayuda ha sido clarificante
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
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

por favor ayuda con trabajo final sobre funciones

Publicado por agustin (522 intervenciones) el 14/12/2016 15:57:00
Lo que no ayuda nada es que digas que ese codigo hace lo que pretendes pero solo te fallan el tema de hayar el valor mayor y el segundo mayor porque es FALSO.
Este codigo si hace todo lo que pide el ejercicio aunque no se hasta que punto estas por lo que no se si puedes usar el template vector:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
#include <iostream>
#include <conio.h>
//#include <locale.h> //Necesaria para std::stol
#include <stdlib.h> //Necesaria para atoi
#include <string>
#include <vector>
 
#define INTRO 0x0D
#define BACK 0x08
#define ESC 0x1B
#define CORRECT 0
#define BAD_FORMAT -1
#define EMPTY -2
 
using namespace std;
 
long getLong(int &msg);
void getValues(vector<long>&v);
void showContenido(vector<long>v);
long getSuma(vector<long>v, int &msg);
long getMayor(vector<long>v, int &msg);
long getMenor(vector<long>v, int &msg);
long getSegundoMayor(vector<long>v, int &msg);
long getMedia(vector<long>v, int &msg);
//---------------------------------------------------------------------------
 
int main(int argc, char* argv[])
{
    int mensaje;
    vector<long>array;
 
    getValues(array); //Funcion que pide los valores hasta que se pulse ESC
    system("CLS");
 
    if(array.size() > 0){ //Si el vector no esta vacio...
        //Muestro su contenido
        showContenido(array);
 
        cout << "La suma es: " << getSuma(array, mensaje) << endl << endl;
        cout << "La media es: " << getMedia(array,mensaje) << endl << endl;
        cout << "El mayor es: " << getMayor(array, mensaje) << endl << endl;
 
        //Para que haya un segundo mayor tiene que haber al menos 2 elementos por
        //lo que si no hay al menos 2 elementos no muestro el mensaje del segundo
        //mayor
        if(array.size() > 1)
            cout << "El segundo mayor es: " << getSegundoMayor(array, mensaje) << endl << endl;
    }
    system("PAUSE");
    return 0;
}
//---------------------------------------------------------------------------
 
long getMedia(vector<long>v, int &msg)
{
    long media=0;
 
    if(v.size() > 0){
        msg=CORRECT;
        for(size_t i=0; i < v.size(); ++i)
            media += v[i];
        media /= v.size();
    }else{
        msg=EMPTY;
    }
    return media;
}
//---------------------------------------------------------------------------
 
void showContenido(vector<long>v)
{
    cout << "Este es todo el contenido del array:" << endl;
    for(size_t i=0; i < v.size(); ++i)
        cout << v[i] << "  ";
    cout << endl << endl;
}
//---------------------------------------------------------------------------
 
void getValues(vector<long>&v)
{
    int mensaje=CORRECT;
    long valor;
 
    do{
        cout << "Introduce un valor (ESC para salir): ";
        valor = getLong(mensaje);
        if(mensaje == CORRECT)
            v.push_back(valor);
        else if(mensaje == BAD_FORMAT)
            cout << "Formato incorrecto. Vuelva a intentarlo." << endl;
    }while(mensaje != ESC);
}
//---------------------------------------------------------------------------
 
long getSuma(vector<long>v, int &msg)
{
    long suma=0;
 
    if(v.size() > 0){
        msg=CORRECT;
        for(size_t i=0; i < v.size(); ++i)
            suma += v[i];
    }else{
        msg=EMPTY;
    }
    return suma;
}
//---------------------------------------------------------------------------
 
long getMayor(vector<long>v, int &msg)
{
    long mayor=0;
 
    if(v.size() > 0){
        mayor=v[0];
        msg=CORRECT;
 
        for(size_t i=0; i < v.size(); ++i)
            if(mayor < v[i])
                mayor = v[i];
    }else{
        msg=EMPTY;
    }
    return mayor;
}
//---------------------------------------------------------------------------
 
long getMenor(vector<long>v, int &msg)
{
    long menor=0;
 
    if(v.size() > 0){
        menor=v[0];
        msg=CORRECT;
 
        for(size_t i=0; i < v.size(); ++i)
            if(menor > v[i])
                menor = v[i];
    }else{
        msg=EMPTY;
    }
    return menor;
}
//---------------------------------------------------------------------------
 
long getSegundoMayor(vector<long>v, int &msg)
{
    long mayor, segundoMayor=0;
 
    if(v.size() > 1){
        segundoMayor=getMenor(v, msg);
        mayor=getMayor(v,msg);
        msg=CORRECT;
 
        for(size_t i=0; i < v.size(); ++i)
            if(segundoMayor < v[i] && v[i] != mayor){
                segundoMayor=v[i];
            }
    }else{
        msg=EMPTY;
    }
    return segundoMayor;
}
//---------------------------------------------------------------------------
 
//Funcion con la que obtengo los valores
//Solo admite numeros con lo que no imprimirá nada que no sean numeros
//Sale al pulsar intro o al pulsar escape
long getLong(int &msg)
{
    long retval=0;
    string str;
    int ch=0;
    size_t len=0;
 
    msg = CORRECT;
 
    do{
        if(kbhit()){
            ch = getch();
            if(ch == 0xe0 && kbhit()){
                ch = (ch << 8)  | getch();
            }
            if(ch == ESC){
                msg = ESC;
            }else if(ch == INTRO){
                cout << endl;
            }else if(ch == BACK){
                if(len > 0){
                    cout << "\b \b";
                    str.pop_back();
                    len--;
                }
            }else if(isdigit(ch)){
                str.operator +=(ch);
                cout << char(ch);
                len++;
            }
        }
    }while(ch != ESC && ch != INTRO);
 
    if(len == 0 && msg != ESC){
        msg = BAD_FORMAT;
    }else if(msg == CORRECT){
        //retval = stol(str); //Mi compilador no me la admite y si pongo std::stol(str) dice que no forma parte de std
        retval = atoi(str.c_str()); //Uso el de C que este si me lo lee
    }
    return retval;
}
//---------------------------------------------------------------------------
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
Imágen de perfil de francisco

por favor ayuda con trabajo final sobre funciones

Publicado por francisco (6 intervenciones) el 14/12/2016 16:59:36
Agustin Muchisimas gracias por darte el tiempo de explicarme...
ahora me toca a mi tratar de entender todo...


esta fue la primera solucion que le encontre al ejercicio (funciona), pero me pidieron desarrollarla con funciones:
la dejo solo como antecedente...Gracias!

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include<iostream>
#include<conio.h>
 
using namespace std;
 
 
int main(int argc, char * argv[]){ // argument to work with a list of values
 
	int Lin  =0;                           //  intro List of numbers
	int suma =0;                          //  beggins in 0
	int Tnum =0;                         //  Total numbers in the list
    int Nmax = 0;                 //  the largest number
    int sMax = 0;                //  the second largest number
 
	while (true) {
 
        cout << "***   escribe una lista de numeros    *** preciona 0 para finalizar" << endl;
        cin >> Lin;
 
		if (Lin == 0) {
            break;
        }
 
        suma += Lin;  // Add the numbers admitted in Lin
	    Tnum++;       // number of values in the list
 
	     if (Lin > Nmax) {      // the largest number                            
            sMax=Nmax;
            Nmax = Lin;
        }
 
        if (Lin > sMax && Lin < Nmax) {     // the second largest number
            sMax = Lin;
        }
 
		}
 
		cout<<"Summa        = "<<suma<<endl;
		cout<<"La media       = "<<(float)suma/(float)Tnum<<endl;
		cout<<"El numero Mayor = "<<Nmax<<endl;
		cout<<"El segundo numero Mayor  = "<<sMax<<endl;
 
		getch();
		return 0;
}
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
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

por favor ayuda con trabajo final sobre funciones

Publicado por agustin (522 intervenciones) el 14/12/2016 18:40:07
Cuando dices:
"Me piden hacer un programa que sume , saque la media, me muestre el numero mayor y el segundo numero mayor de una lista de numeros ingresados por el usuario."
Yo entiendo que se refiere a una lista, un vector, o un array y tu no lo usas en ningún momento pero bueno, eso es lo de menos porque queda libre a la interpretación de cada uno.
Tu modo de obtener el segundo numero mayor no tiene en cuenta que se puedan introducir números negativos, con lo que si introduces -1, -2, -3 sMax y Nmax valdrán 0 cuando en realidad sMax debería valer -2 y Nmax -1. Además al usar el 0 como valor de escape no puedes usar ese valor para introducirlo como valor. Por esta razón es mejor usar un array o vector.
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
Imágen de perfil de francisco

por favor ayuda con trabajo final sobre funciones

Publicado por francisco (6 intervenciones) el 14/12/2016 19:53:19
si tienes razon, lo que use fue un array sin limites, con el bucle while almaceno los numeros que entran en Lin... en lo que respecta a los numeros negativos si funcionan pruebalo, yo uso dev++, y visual studio y en los dos funciona..y el 0 lo use porque no es relativo en las operaciones de suma, pero si entiendo que es limitante en otros casos. El punto es que todavia no aprendo otro retorno, estoy en el primer curso de c++. Gracias!
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
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

por favor ayuda con trabajo final sobre funciones

Publicado por agustin (522 intervenciones) el 14/12/2016 22:35:42
en ningun sitio usas un array, usas una variable de tipo int, un array seria por ejemplo:
1
int lin[50];
Con respecto a lo que indicas de que funciona lo de Nmax y sMax aqui te pongo la salida de consola:
1
2
3
4
5
6
7
8
9
10
***   escribe una lista de numeros    *** preciona 0 para finalizar
-1
***   escribe una lista de numeros    *** preciona 0 para finalizar
-2
***   escribe una lista de numeros    *** preciona 0 para finalizar
0
Summa        = -3
La media       = -1.5
El numero Mayor = 0
El segundo numero Mayor  = 0
¿Me puedes decir en que momento he introducido el 0? y aunque asi fuese porque para salir me obliga a pulsarlo ¿por qué el segundo numero mayor no es -1?
El problema es que inicializas ambas variables a 0 y solo cambia si el numero introducido es mayor con lo que cualquier numero menor a 0 no modificará esas variables aunque nunca hayas pulsado 0. Otra solucion seria darle a ambas variables el numero negativo menor que se le pueda dar a un entero.
O sea añades esta cabecera:
1
#include<limits>

y modificas estas dos lineas de tu primer codigo sin funciones:
1
2
int Nmax = INT_MIN;                 //  the largest number
int sMax = INT_MIN;                //  the second largest number
Con eso ya te cojeria cualquier valor en el rango de un entero con signo.
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
Imágen de perfil de francisco

por favor ayuda con trabajo final sobre funciones

Publicado por francisco (6 intervenciones) el 14/12/2016 23:11:29
no habia probado esa convinacion, tienes razon...
voy a tratar de hacerlo de esta manera
gracias!
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