Imprime el nombre del día -- ++ campo con datetime camp codereview Relacionados El problema

Print the name of day


5
vote

problema

Español

¿Cómo puedo mejorar este código? Se necesita un número en el rango de [1,7] e imprime su día correspondiente.

  newCombo()2  
Original en ingles

How can I improve this code? It takes a number in the range of [1,7] and prints its corresponding day.

#include "stdafx.h" #include <iostream>     // std::cout #include <vector>       // std::vector #include <string>  using std::cin; using std::cout; using std::vector; using std::string;    int main() {     vector<string> name_day = { "Saturday" ,"Sunday" , "Monday" , "Tuesday" , "Wednesday" , "Thursday" , "Friday" };     int n ;      cout << "This program takes a number in the range of" << "\n" << "[1 , 7] and prints its corresponding day." << "\n" << "............................................................." << "\n";       while (true)      {         bool flag = true;          cout << "Input a number : ";         cin >> n;          if (!cin) //If input is wrong.         {             // reset failbit             cin.clear();             cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');         }          //If the condition is not satisfied .          else         {             for (int i = 0; i <= 6; i++)             {                 if (n-1 == i)                 {                     cout << name_day[i] << "\n" << "-----------------------" << "\n";;                     flag = false;                 }              }//end of for          }           if (flag) { cout << "Bad Entery !." << "\n" << "-----------------------" << "\n"; }       }//end of while        system("pause"); } 
     
 
 

Lista de respuestas

7
 
vote
vote
La mejor respuesta
 

Aquí hay algunas cosas que pueden ayudarlo a mejorar su programa.

Aislar el código específico de la plataforma

Si debe tener stdafx.h , considere envolverlo para que el código sea portátil:

  #ifdef WINDOWS #include "stdafx.h" #endif   

Asegúrese de que ha requerido todo #include S

El código utiliza std::numeric_limits pero no #include <limits> . Un programa puede compilar sin el 9988776665544335, porque puede suceder algún otro encabezado para incluirlo, pero eso no está garantizado por el estándar. Para compilar de manera confiable, se deben usar los archivos 9988776655544336655544336 .

No use system("pause")

Hay dos razones para no usar system("cls") o system("pause") . La primera es que no es portátil para otros sistemas operativos que pueda o no se preocupe ahora. El segundo es que es un agujero de seguridad, lo que usted es absolutamente debe preocuparse por "strong>. Específicamente, si se define un programa y se llama #ifdef WINDOWS #include "stdafx.h" #endif 0 o #ifdef WINDOWS #include "stdafx.h" #endif 1 , su programa ejecutará ese programa en lugar de lo que intentas, y ese otro programa podría ser cualquier cosa. Primero, aislarlos en una función separada #ifdef WINDOWS #include "stdafx.h" #endif 2 y luego modifique su código para llamar a esas funciones en lugar de #ifdef WINDOWS #include "stdafx.h" #endif 3 . Luego, reescriba los contenidos de esas funciones para hacer lo que desea usar C ++. Por ejemplo:

  #ifdef WINDOWS #include "stdafx.h" #endif 4  

Uso #ifdef WINDOWS #include "stdafx.h" #endif 5 Donde sea práctico

El vector #ifdef WINDOWS #include "stdafx.h" #endif 6 no es y no debe modificarse, por lo que debe declararse #ifdef WINDOWS #include "stdafx.h" #endif 7 . Mejor aún, podría ser declarado #ifdef WINDOWS #include "stdafx.h" #endif 8 .

Usa MEJOR NAMING

El vector llamado #ifdef WINDOWS #include "stdafx.h" #endif 9 está bien nombrado porque es descriptivo de los contenidos. Sin embargo, #include0 no es un buen nombre porque no sugiere el significado de la variable en el contexto del programa.

Use la concatenación de cadena

El #include1 La rutina incluye esta línea muy larga:

  #include2  

Cada uno de esas es una llamada separada a #include3 pero no necesitan ser. Otra forma de escribir eso sería así:

  #include4  

Esto reduce el menú completo a una sola llamada a #include5 porque las cadenas consecutivas en C ++ (y en C, para la materia) se concaten automáticamente en una sola cadena por el compilador. También es más legible.

Fije el error de ortografía

La cadena de error actualmente dice "¡Bad Entery!". ¡Con puntuación y ortografía corregida, que se convierte en "mala entrada!". Sin embargo, sería aún mejor si el mensaje de error le sugiera lo que estaba realmente incorrecto y le dio alguna sugerencia al usuario sobre qué hacer al respecto.

Use la indexación en lugar de un bucle

El código actual tiene este bit peculiar de código:

  #include6  

En lugar de un bucle para buscar el día, ¿por qué simplemente no usar un índice? Aquí hay una forma de hacerlo:

  #include7  

Tenga en cuenta que esto descargará el flujo de entrada sobre cualquier error que difiera del comportamiento del código actual.

Considere al usuario del código

Actualmente no hay una forma elegante de finalizar el programa. Sería mejor si, por ejemplo, un valor de 0 o tal vez -1 se utilizaron como una señal para finalizar el programa.

Piense cuidadosamente con el uso de #include8

No hay nada intrínsecamente incorrecto con estas líneas:

  #include9  

Sin embargo, dado que cada uno solo se usa una vez, probablemente les omití y simplemente usaría el espacio de nombres completo en el código:

  std::numeric_limits0  

Considere usar std::numeric_limits1

Porque es un vector de cadenas, uno no puede hacer std::numeric_limits2 a std::numeric_limits33 Valor, pero podría ser simplemente haciendo un cambio menor:

  std::numeric_limits4  

Esto también significa que el std::numeric_limits5 y 99887766555443336 ya no son necesarios.

 

Here are some things that may help you improve your program.

Isolate platform-specific code

If you must have stdafx.h, consider wrapping it so that the code is portable:

#ifdef WINDOWS #include "stdafx.h" #endif 

Make sure you have all required #includes

The code uses std::numeric_limits but doesn't #include <limits>. A program may compile without the explicit #include because some other header might happen to include it, but that is not guaranteed by the standard. To compile reliably, the documented #include files should be used.

Don't use system("pause")

There are two reasons not to use system("cls") or system("pause"). The first is that it is not portable to other operating systems which you may or may not care about now. The second is that it's a security hole, which you absolutely must care about. Specifically, if some program is defined and named PAUSE or pause, your program will execute that program instead of what you intend, and that other program could be anything. First, isolate these into a seperate functions pause() and then modify your code to call those functions instead of system. Then rewrite the contents of those functions to do what you want using C++. For example:

void pause() {     getchar(); } 

Use const where practical

The name_day vector is not and should not be modified, so it should be declared const. Better yet, it could be declared static const.

Use better naming

The vector named name_day is well named because it is descriptive of the contents. However, flag is not a good name because it doesn't suggest the meaning of the variable in the context of the program.

Use string concatenation

The main routine includes this very long line:

std::cout << "This program takes a number in the range of" << "\n" << "[1 , 7] and prints its corresponding day." << "\n" << "............................................................." << "\n"; 

Each of those is a separate call to operator<< but they don't need to be. Another way to write that would be like this:

std::cout << "This program takes a number in the range of\n"               "[1 , 7] and prints its corresponding day.\n"              ".............................................................\n"; 

This reduces the entire menu to a single call to operator<< because consecutive strings in C++ (and in C, for that matter) are automatically concatenated into a single string by the compiler. It is also more readable.

Fix the spelling error

The error string currently says "Bad Entery !." With corrected punctuation and spelling, that becomes "Bad entry!". However, it would be even better if the error message suggested what was actually wrong and gave some suggestion to the user about what to do about it.

Use indexing rather than a loop

The current code has this peculiar bit of code:

for (int i = 0; i <= 6; i++) {     if (n-1 == i)     {         std::cout << name_day[i] << "\n" << "-----------------------" << "\n";;         flag = false;     }  }//end of for  

Instead of a loop to look up the day, why not simply use an index? Here's one way to do it:

while (true) {     std::cout << "Input a number : ";     std::cin >> n;     if (std::cin && n >= 1 && n <= 7) {         std::cout << name_day[n-1] << "\n----------------\n";     } else {         std::cout << "Bad entry: The number must be in the range 1-7 inclusive\n";         std::cin.clear();         std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');     } } 

Note that this will flush the input stream on any error which differs from the behavior of the current code.

Consider the user of the code

There is currently no graceful way to end the program. It would be nicer if, for instance, a value of 0 or maybe -1 were used as a signal to end the program.

Think carefully about using using

There is nothing inherently wrong with these lines:

using std::vector; using std::string; 

However, since each is only used once, I'd probably omit them and simply use the full namespace in the code:

static const std::vector<std::string> name_day{      "Saturday" ,"Sunday" , "Monday" , "Tuesday" , "Wednesday" , "Thursday" , "Friday" }; 

Consider using constexpr

Because it is a vector of strings, one can't make name_day a constexpr value, but it could be simply by making a minor change:

static constexpr const char* name_day[]{      "Saturday" ,"Sunday" , "Monday" , "Tuesday" , "Wednesday" , "Thursday" , "Friday" }; 

This also means that the #include <vector> and #include <string> are no longer needed.

 
 
   
   
5
 
vote

este bucle

  for (int i = 0; i <= 6; i++) {     if (n-1 == i)     {         cout << name_day[i] << " " << "-----------------------" << " ";;         flag = false;     }  }/   

es superfluo. Todo lo que necesita es usar n-1 como índice:

  if(n > 0 && n < 8) {      cout << name_day[n-1] << " " << "-----------------------" << " ";  } else {     cout << "Bad Entry !." << " " << "-----------------------" << " ";  }   

También usando System ("Pausa") , mientras conveniente, es un mal hábito de entrar.

 

This loop

for (int i = 0; i <= 6; i++) {     if (n-1 == i)     {         cout << name_day[i] << "\n" << "-----------------------" << "\n";;         flag = false;     }  }/ 

is superfluous. All you need is to use n-1 as the index:

if(n > 0 && n < 8) {      cout << name_day[n-1] << "\n" << "-----------------------" << "\n";  } else {     cout << "Bad Entry !." << "\n" << "-----------------------" << "\n";  } 

Also using System("pause"), while convenient, is a bad habit to get into.

 
 
 
 
3
 
vote

Entonces, mi comentario va a ser un poco más amplio acerca de las prácticas

En la parte superior de lo que TimsaAAFl ha dicho, no utilice while(true) . Compruebe la entrada del usuario en su lugar. Sé que no es su enfoque, pero 9988777665544334 puede llevar a un diseño bastante malo, como usar roturas y gotas.

Además, siempre tendrá una devolución al final de su principal, la firma de tipo de ejecución y no tiene ninguna advertencia, Somettime, guarde su día;)

Finnaly, comentarios. Solo un consejo a medida que continúas, escribe comentarios sobre por qué haces cosas, no sobre lo que haces exactamente. // if the condition wasn't satisfied o // end of loop no es muy informativo, el código ya le brinda mucha información, no necesita duplicarlo

espero que haya ayudado

 

So, my comment is going to be a bit broader about practices

On top of what tinstaafl has said, please do not use while(true). Check for user input instead. I know it's not your focus, but while(true) can lead to pretty bad design such as using breaks and gotos.

Also always have a return at the end of your main, enforcing type signature and having no warning will somettime save your day ;)

Finnaly, comments. Just an advice as you go on, write comments about why you do things, not about what exactly you do. // if the condition wasn't satisfied or // end of loop are not very informative, code already gives you a lot of informations, you don't need to duplicate it

Hope it helped

 
 

Relacionados problema

2  Obtén el primer patrimonio dado por los días de semana y un tiempo de inicio  ( Get first datetime by given weekdays and a starttime ) 
En el trabajo hay un sistema de entrada donde los clientes pueden especificar los días de semana y una hora de inicio para un evento. Los días de semana son e...

10  Obteniendo la última fecha donde ocurrió un día de la semana dado  ( Getting the last date where a given week day occurred ) 
Estoy tratando de aprender un poco sobre la programación funcional y como mi herramienta, elegí F # ya que soy un desarrollador de .NET y el medio ambiente es...

4  Salida de una cuenta regresiva en un div  ( Outputting a countdown in a div ) 
Obtuve este código trabajando con el complemento de cuenta regresiva jQuery para tomar una entrada y salida una cadena cuenta regresiva en un div. ¿Hay una ...

5  Método de cálculo del día del año  ( Day of year calculation method ) 
El ejercicio que quería resolver es de aquí . Copiando desde esa página: public static int dayOfYear(int month, int dayOfMonth, int year) { if (month...

0  Valor numérico para una fecha, DataTado y Datediff  ( Numeric value for a date dateadd and datediff ) 
En MS Excel, una fecha también se representa como un valor numérico, con el 1-enero-1900 como el primer día. También en VBA hay funciones de DataLTD y Datedif...

5  Calcular el tiempo transcurrido de los tiempos de entrada sin usar declaraciones condicionales  ( Calculate elapsed time from input times without using conditional statements ) 
Acabo de empezar la programación y nos estamos enseñando C ++. Después de nuestra 2ª conferencia, nos dieron una tarea para hacer un programa que tome dos val...

6  Compara el último tiempo de modificación con tiempo especificado  ( Compare last modification time with specfied time ) 
Estoy escribiendo una función en Python que compara el tiempo de modificación de un archivo en Linux (usando OS.STAT) con un tiempo específico y compare las f...

5  Representando el tiempo de apertura y cierre para un negocio  ( Representing the opening and closing time for a business ) 
Tengo una clase de openclose que solo representa las horas de operación de un negocio por la apertura y el tiempo de cierre. Toma los tiempos de apertura y ci...

10  Obteniendo tiempo actual con milisegundos  ( Getting current time with milliseconds ) 
Estoy buscando una forma más eficiente o más corta de lograr la siguiente salida utilizando el siguiente código: timeval curTime; gettimeofday(&curTime, NU...

8  Conversión de STD :: Chrono :: Time_Point to / from std :: string  ( Converting stdchronotime point to from stdstring ) 
Considere estas funciones que permitan convertir checkOnline.sh4 a / FROM checkOnline.sh5 Con un formato Fecha de fecha ". checkOnline.sh6 con uso:...




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