Progresión aritmética -- ++ campo con mathematics camp codereview Relacionados El problema

Arithmetic Progression


4
vote

problema

Español

Tuve que escribir un programa que complete una progresión aritmética basada en la entrada de los usuarios. El usuario proporcionará el tercer término de la serie, el tercero del último término, y la suma de todos los términos en la serie. El programa mostraría el número total de términos en la serie y luego la serie. Ya lo presenté, pero espero obtener algún comentario general.

Ejemplo: 3, 8, 55

Salida del programa:

10

1, 2, 3, 4, 5, 6, 7, 8, 9, 10

  #include <iostream> #include <vector>  int main() {     int thirdTerm;     int thirdLastterm;     int sum;     int total;     int constantNumber = 1;     int a = 0;     std::vector<int> vSeries;      while (std::cout << "Please enter the third term in the series: " && !(std::cin >> thirdTerm)) {         std::cin.clear(); //clear bad input flag         std::cin.ignore(std::numeric_limits<std::streamsize>::max(), ' '); //discard input         std::cout << "Invalid input; please re-enter. ";     }     while (std::cout << "Enter the third from the last term in the series: " && !(std::cin >> thirdLastterm)) {         std::cin.clear(); //clear bad input flag         std::cin.ignore(std::numeric_limits<std::streamsize>::max(), ' '); //discard input         std::cout << "Invalid input; please re-enter. ";     }     while (std::cout << "Please enter the sum of the series: " && !(std::cin >> sum)) {         std::cin.clear(); //clear bad input flag         std::cin.ignore(std::numeric_limits<std::streamsize>::max(), ' '); //discard input         std::cout << "Invalid input; please re-enter. ";     }      do {         a = 0;         vSeries.clear();         vSeries.push_back(thirdTerm - (2 * constantNumber));         vSeries.push_back(thirdTerm - (1 * constantNumber));          do {             total = 0;             vSeries.push_back(thirdTerm + (a * constantNumber));             a++;             for (int i = 0; i < vSeries.size(); i++) {                 total += vSeries[i];             }         } while (total < sum);          constantNumber++;          if (constantNumber > 100000) {             std::cout << "There doesn't appear to be a solution based on the input - exiting program.";                 return 0;         }      } while (vSeries[vSeries.size() - 3] != thirdLastterm || total != sum);      std::cout << " Number of terms in the series: " <<  vSeries.size() << std::endl;     for (int i = 0; i < vSeries.size(); i++) {         if (i == 0)             std::cout << vSeries[i];         else             std::cout << "," << vSeries[i];     }      return 0; }   
Original en ingles

I had to write a program that would complete an arithmetic progression based on the users input. The user would provide the third term in the series, the third from the last term, and the sum of all the terms in the series. The program would display the total number of terms are in the series and then the series itself. I already submitted it but I am hoping to get some general feedback.

Example: 3, 8, 55

Program output:

10

1, 2, 3, 4, 5, 6, 7, 8, 9, 10

#include <iostream> #include <vector>  int main() {     int thirdTerm;     int thirdLastterm;     int sum;     int total;     int constantNumber = 1;     int a = 0;     std::vector<int> vSeries;      while (std::cout << "Please enter the third term in the series: " && !(std::cin >> thirdTerm)) {         std::cin.clear(); //clear bad input flag         std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //discard input         std::cout << "Invalid input; please re-enter.\n";     }     while (std::cout << "Enter the third from the last term in the series: " && !(std::cin >> thirdLastterm)) {         std::cin.clear(); //clear bad input flag         std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //discard input         std::cout << "Invalid input; please re-enter.\n";     }     while (std::cout << "Please enter the sum of the series: " && !(std::cin >> sum)) {         std::cin.clear(); //clear bad input flag         std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //discard input         std::cout << "Invalid input; please re-enter.\n";     }      do {         a = 0;         vSeries.clear();         vSeries.push_back(thirdTerm - (2 * constantNumber));         vSeries.push_back(thirdTerm - (1 * constantNumber));          do {             total = 0;             vSeries.push_back(thirdTerm + (a * constantNumber));             a++;             for (int i = 0; i < vSeries.size(); i++) {                 total += vSeries[i];             }         } while (total < sum);          constantNumber++;          if (constantNumber > 100000) {             std::cout << "There doesn't appear to be a solution based on the input - exiting program.";                 return 0;         }      } while (vSeries[vSeries.size() - 3] != thirdLastterm || total != sum);      std::cout << "\nNumber of terms in the series: " <<  vSeries.size() << std::endl;     for (int i = 0; i < vSeries.size(); i++) {         if (i == 0)             std::cout << vSeries[i];         else             std::cout << "," << vSeries[i];     }      return 0; } 
     

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

Un par de cosas que noté:

aquí:

  while (std::cout << "Please enter the third term in the series: " && !(std::cin >> thirdTerm)) {     std::cin.clear(); //clear bad input flag     std::cin.ignore(std::numeric_limits<std::streamsize>::max(), ' '); //discard input     std::cout << "Invalid input; please re-enter. "; }   

Aparte de la cadena rápida, esto se repite tres veces. Esto sería mejor si estuviera en una función separada que aceptaba la cadena de solicitud y la dirección de la variable para almacenar el valor de entrada:

  void GetInput(string prompt, int& input) {     while (std::cout << prompt && !(std::cin >> input))      {         std::cin.clear(); //clear bad input flag         std::cin.ignore(std::numeric_limits<std::streamsize>::max(), ' '); //discard input         std::cout << "Invalid input; please re-enter. ";     } }  GetInput("Please enter the third term in the series: ",thirdTerm); GetInput("Enter the third from the last term in the series: ",thirdLastterm); GetInput("Please enter the sum of the series: ",sum);   

aquí:

      do {         total = 0;         vSeries.push_back(thirdTerm + (a * constantNumber));         a++;         for (int i = 0; i < vSeries.size(); i++) {             total += vSeries[i];         }     } while (total < sum);   

Estás iterando a través del vector obteniendo un nuevo total. Sería mejor simplemente agregar cada elemento a un total de funcionamiento:

      total = 0;     do {         int temp = thirdTerm + (a * constantNumber);         vSeries.push_back(temp);         total += temp;         a++;     } while (total < sum);   
 

A couple of things I noticed:

Here:

while (std::cout << "Please enter the third term in the series: " && !(std::cin >> thirdTerm)) {     std::cin.clear(); //clear bad input flag     std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //discard input     std::cout << "Invalid input; please re-enter.\n"; } 

Aside from the prompt string this is repeated three times. This would be better if it was in a separate function that accepted the prompt string and the address of the variable to store the input value:

void GetInput(string prompt, int& input) {     while (std::cout << prompt && !(std::cin >> input))      {         std::cin.clear(); //clear bad input flag         std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //discard input         std::cout << "Invalid input; please re-enter.\n";     } }  GetInput("Please enter the third term in the series: ",thirdTerm); GetInput("Enter the third from the last term in the series: ",thirdLastterm); GetInput("Please enter the sum of the series: ",sum); 

Here:

    do {         total = 0;         vSeries.push_back(thirdTerm + (a * constantNumber));         a++;         for (int i = 0; i < vSeries.size(); i++) {             total += vSeries[i];         }     } while (total < sum); 

You're iterating through the vector getting a new total. It would be better to just add each element to a running total:

    total = 0;     do {         int temp = thirdTerm + (a * constantNumber);         vSeries.push_back(temp);         total += temp;         a++;     } while (total < sum); 
 
 

Relacionados problema

13  Numérica para un cálculo de teoría de juegos usando la utilidad esperada  ( Numerics for a game theory calculation using expected utility ) 
Estoy tratando de replicar los resultados de Bruce B. de Mesquita (BDM) en la teoría del juego político para la predicción. Sobre la base de dónde se encuentr...

2  Optimización del código para la secuencia A064604  ( Optimizing code for sequence a064604 ) 
Estoy implementando a064604 - oeis para enteros positivos de hasta 10 mil millones. Estoy encontrando a los divisores en $ o ( sqrt n) $. Por lo tanto, ...

15  Función de sine en C / C ++  ( Sine function in c c ) 
Debido a las restricciones de software, No puedo usar las bibliotecas estándar, cmath , 9988776655544334 , plantillas, en línea o impulso . También estoy u...

4  Verificación computacional de la conjetura de Collatz utilizando OpenCl  ( Computational verification of collatz conjecture using opencl ) 
Esta solicitud de revisión de código sigue mi solicitud anterior Verificación computacional de Collatz Conyecture . A diferencia del programa anterior (que ...

6  Determinar si f (n) = n ^ 2 + 3n + 5 es divisible por 121  ( Determining if fn n2 3n 5 is ever divisible by 121 ) 
Dado el siguiente problema: Se conjeture eso para cualquier $ N & GT; 0 $, $ N ^ 2 + 3n + 5 $ nunca es divisible por 121. Pruebe esta conjetura por ...

11  Números de colmena - usando goto en C ++  ( Beehive numbers using goto in c ) 
Entiendo que el uso de orca_array.hpp4 en el código C ++ está estrictamente no aconsejado, pero a veces, realmente reduce la cantidad de líneas de código co...

3  Análisis de simetría para arreglos atómicos en un cristal  ( Symmetry analysis for atom arrangements in a crystal ) 
Por un tiempo ahora he tenido la intención de publicar un poco de mi código Haskell aquí para que alguien pueda decirme qué partes de la biblioteca de idiomas...

3  Código C ++ para encontrar la distancia entre la línea y el punto  ( C code to find distance between line and point ) 
Así que hice este simple programa que permite a los usuarios construir puntos y líneas y luego devolver la distancia más pequeña entre un punto dado y una lín...

4  Algoritmo más rápido para adaptar la expresión matemática dada  ( Faster algorithm to tailor given mathematical expression ) 
¿Hay una solución más optimizada para resolver el problema declarado? Dada una matriz 'Arr' de 'n' elementos y un número 'M', encuentra el menor índice 'Z' ...

13  Plantilla de expresión para calcular la distancia euclidiana  ( Expression template to compute the euclidean distance ) 
Estaba escribiendo un código relacionado con el geometría nuevamente y tuvo un vistazo más de cerca a mi función que se supone que calcula la distancia euclid...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos