Викторина по факторизующим квадратичным выражениям

Я начинаю, и это моя первая программа на C. Это хорошо работает, но мне было интересно, есть ли более короткий способ сделать это и как я мог бы сделать это лучше.

Предполагается сделать квадратичное выражение и спросить пользователя о его коэффициенте. Если пользователь правильно его оценивает, он переходит на следующий уровень, что является немного более сложным вопросом. Если (s) он не может решить его правильно, (ы) он остается на том же уровне, если только он не хочет выйти.

# include <stdio.h>
# include <stdlib.h>
# include <ctype.h>
# include <string.h>
# include <math.h>
# include <time.h>

int main() {

  srand(time(0));
  int a, b, c, level=1, randMax=level*5;
  char ch;

  // generate the problem to ask
  int ask(){

    // generate non-zero random number for first coefficient
    // that is less than the level of the game, but not zero
    int nonZeroCoefficient(){
      int n = (rand()%(level+2) - (level));
      if ( n == 0 ){
      n++;
      }
      return n;
    }

    // generate non-zero random number

    int nonZeroRand(){
      int n=(rand()%randMax - (randMax));
      if (n == 0){
        n++;
      }
      return n;
    }

    int f = nonZeroCoefficient();
    int h = nonZeroCoefficient();
    int k = nonZeroRand();
    int g = nonZeroRand();

    a = f*h;
    b = (f*k + g*h);
    c = g*k;


    // shows the Level
    printf("\n\n\n\n --- Level %d ---", level);

    // generate the question
    printf("\nfactor the following expression\n%dx^2 %+dx %+d",a ,b, c);
    puts("\n\nEnter your answer in the form of (fX+g)(hX+k)");
    int inputF, inputG, inputH, inputK;
    printf("\nEnter f:");
    scanf("%d", &inputF);
    printf("Enter g:");
    scanf("%d", &inputG);
    printf("Enter h:");
    scanf("%d", &inputH);
    printf("Enter k:");
    scanf("%d", &inputK);

      if (inputF*inputH == a && ((inputF*inputK+inputG*inputH== b) && (inputG*inputK == c))){
        printf("\nRight on!\n");
        level++;

      }else{
        printf("\nSorry! your answer is not currect!\nthe currect answer is:\nf:%d\ng:%d\nh:%d\nk:%d\n \ntry again",f, g, h, k);
      }

    }


    do{
      ask();
      printf("\nDo you want to continue? (Y/N)");
      scanf (" %c", &ch);
    } while(ch == 'y'|| ch == 'Y');

}
8 голосов | спросил Ali Tahrei-Shalmani 13 Jpm1000000pmSat, 13 Jan 2018 22:34:56 +030018 2018, 22:34:56

1 ответ


2
  1. Стандарт C не позволяет определять функцию в другом. Переместить определения функций, таких как int ask() вне main().

  2. if ( n == 0 ){ n++; } поддерживает возвращаемое значение смещения 1- a. Альтернатива:

    // return [-level...-1, 1...level]
    int nonZeroCoefficient(void) {
      int n = rand()%(2*level);
      if (n % 2) {
        return n/2 + 1;
      }
      return -(n/2 + 1);
    }
    
  3. Аналогично для nonZeroRand(). В этом случае код может просто повторить попытку, чтобы избежать смещения 1.

    int nonZeroRand(void) {
      int n;
      do {
        int n=(rand()%randMax - randMax);
      } while (n == 0);
      return n;
    }
    
  4. stdout не может быть буферизирован, как ожидалось. Используйте fflush(), чтобы убедиться, что вывод отображается перед запросом ввода.

    printf("\nEnter f:");
    fflush(stdoout); // add
    scanf("%d", &inputF);
    
  5. Надежный код проверяет возвращаемое значение пользовательского ввода.

    // scanf("%d", &inputF);
    if (scanf("%d", &inputF) != 1) Handle_Error();
    
  6. Любопытно, что код не определял f,g,h,k в алфавитном порядке.

    int f = nonZeroCoefficient();
    int h = nonZeroCoefficient();
    int k = nonZeroRand();
    int g = nonZeroRand();  // why last?
    
  7. Понятно, что формулировка ширины обзора обзора.

    }else{
      printf("\nSorry! your answer is not currect!\nthe currect answer is:\nf:%d\ng:%d\nh:%d\nk:%d\n \ntry again",f, g, h, k);
    
  8. ... против (также проверить орфографию)

    }else{
      printf("\nSorry! your answer is not correct!\n"
          "the correct answer is:\nf:%d\ng:%d\nh:%d\nk:%d\n \n"
          "try again",f, g, h, k);
    
  9. Рассмотрим объявление /определение переменных при необходимости.

    // int a, b, c, level=1, randMax=level*5;
    // .... many lines later 
    // a = f*h;
    // b = (f*k + g*h);
    // c = g*k;
    
    int a = f*h;
    int b = (f*k + g*h);
    int c = g*k;
    
  10. Важный совет для будущего эффективности кодера (ваша эффективность). Сделайте не формат вручную, как следует из приведенного ниже кода. Используйте автоформат среды кодирования (или получите тот, который делает это), который соответствует стилю кодировки вашей группы. Жизнь слишком коротка для таких ручных задач picayune - таких как проблемы белого пространства.

    // OP's
    scanf("%d", &inputK);
    
      if (inputF*inputH == a && ...
    
    // Auto formated
    scanf("%d", &inputK);
    
    if (inputF * inputH == a && ....
    
ответил chux 15 Jpm1000000pmMon, 15 Jan 2018 21:49:10 +030018 2018, 21:49:10

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132