Решение математических уравнений с дробями в скриптах Google - PullRequest
0 голосов
/ 23 сентября 2018

Я создаю программу Google Sheets для создания математического листа , который случайным образом генерирует числа в рамках определенных параметров.

Я преуспел в сложении, вычитании, сочетании сложения и вычитания и умножении.Я сейчас пытаюсь добавить дроби в микс, но столкнулся с проблемой форматирования.Хотя я смог генерировать случайные дроби и правильно отображать их, проблема заключается в попытке получить правильный ответ на листе ключей.

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

Я включил ссылку выше, пожалуйста, дайте мне знать, если у вас есть какие-либо идеи, чтобы помочь с этой проблемой.

Кроме того, так как я не думаю, что я правильно задокументировал вВ скрипте максимальное значение сгенерированных целых чисел находится на ключевой странице в диапазоне «K2»

function myWSG() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var ws = ss.getSheetByName("Worksheet");
 var ks = ss.getSheetByName("Key");

 var m = ks.getRange('K2').getValue()+1;

 function getRandomInt(min, max) {
 min = Math.ceil(min);
 max = Math.floor(max);
 return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive
}
for (var i = 8; i <= 26; i = i + 2){
var num = getRandomInt(0, m);
var num1 = getRandomInt(0, m);
var dn1 = getRandomInt(0, m);
var dn2 = getRandomInt(0, m);
var sym = getRandomInt(0, 2);
ws.getRange("A1").copyFormatToRange(ws, 3, 3, i, i)
ws.getRange("A1").copyFormatToRange(ws, 5, 5, i, i)
 switch(ws.getRange(6, 5).getValue()){
  case "Fractions":
    ks.getRange("A6").setValue("Fractions");
    if(dn1 == 0){
      ws.getRange(i, 3).setValue(num)
    }
else if(dn1 == 1){
      ws.getRange(i, 3).setValue(num)
    }
    else{
      ws.getRange(i, 3).setValue(num + "/" + dn1);
    }
    if(dn2 == 0){
      ws.getRange(i, 5).setValue(num1)
    }
    else if(dn2 == 1){
      ws.getRange(i, 5).setValue(num1)
    }
    else{
      ws.getRange(i, 5).setValue(num1 + "/" + dn2);
    }
    break;
 case "Add&Sub":
    ks.getRange("A6").clearContent();
    if(num > num1){
      ws.getRange(i, 3).setValue(num);
      ws.getRange(i, 5).setValue(num1);
    }
    else{
      ws.getRange(i, 3).setValue(num1);
      ws.getRange(i, 5).setValue(num);
    }
    if(sym == 0){
      ws.getRange(i, 4).setValue('+')
     }
    else{
      ws.getRange(i, 4).setValue('-')
    }
    break;
  case "Addition":
    ks.getRange("A6").setValue("Fractions")
    ws.getRange(i, 4).setValue('+');
    if(num > num1){
      ws.getRange(i, 3).setValue(num);
      ws.getRange(i, 5).setValue(num1);
    }
    else{
      ws.getRange(i, 3).setValue(num1);
      ws.getRange(i, 5).setValue(num);
    }
    break;
  case "Subtraction":
    ks.getRange("A6").setValue("Fractions")
    ws.getRange(i, 4).setValue('-');
            if(num > num1){
      ws.getRange(i, 3).setValue(num);
      ws.getRange(i, 5).setValue(num1);
    }
    else{
      ws.getRange(i, 3).setValue(num1);
      ws.getRange(i, 5).setValue(num);
    }
    break;
  case "Multiplication":
    ks.getRange("A6").setValue("Fractions")
    ws.getRange(i, 4).setValue('x');
    ws.getRange(i, 3).setValue(num);
    ws.getRange(i, 5).setValue(num1);
    break;
 }
}
for (var v = 30; v <= 46; v = v + 3){
var vnum = getRandomInt(0, m); //random Integer 1
var vnum1 = getRandomInt(1, m); //random Integer 2
var vnum2 = getRandomInt(0, m); //random Integer 3
var vnum3 = getRandomInt(1, m); //random Integer 4
var vsym = getRandomInt(0, 2); //Symbol determinate
var vsym1 = getRandomInt(0, 2); //Symbol determinate 2
var vdn1 = getRandomInt(0, m); //random denominator 1
var vdn2 = getRandomInt(0, m); //random denominator 2
ws.getRange("A1").copyFormatToRange(ws, 3, 3, v, v); //Reset Format to 

ws.getRange("A1").copyFormatToRange(ws, 5, 5, v, v); //Reset Format to 

ws.getRange("N1").copyFormatToRange(ws, 3, 3, v+1, v+1); //Reset Format 

ws.getRange("N1").copyFormatToRange(ws, 5, 5, v+1, v+1); //Reset Format 

switch(ws.getRange(6, 5).getValue()){
  case "Fractions":
    if(vdn1 == 0){
      ws.getRange(v, 3).setValue(vnum);
    }
    else if(vdn1 == 1){
      ws.getRange(v, 3).setValue(vnum);
    }
    else{
      ws.getRange(v, 3).setValue(vnum + "/" + vdn1);
      ws.getRange(v, 5).setValue(vnum2 + "/" + vdn1);
    }
    if(vdn2 == 0){
      ws.getRange(v+1, 3).setValue(vnum1);
    }
    else if(vdn2 == 1){
      ws.getRange(v+1, 3).setValue(vnum1);
    }
    else{
      ws.getRange(v+1, 3).setValue(vnum1 + "/" + vdn2);
      ws.getRange(v+1, 5).setValue(vnum3 + "/" + vdn2);
    }
break;
  case "Add&Sub":
    if(vnum > vnum1){
      ws.getRange(v, 3).setValue(vnum);
      ws.getRange(v+1, 3).setValue(vnum1);
    }
    else{
      ws.getRange(v, 3).setValue(vnum1);
      ws.getRange(v+1, 3).setValue(vnum);
    }
    if(vnum2 > vnum3){
      ws.getRange(v, 5).setValue(vnum2);
      ws.getRange(v+1, 5).setValue(vnum3);
    }
    else{
      ws.getRange(v, 5).setValue(vnum3);
      ws.getRange(v+1, 5).setValue(vnum2);
    }
    if(vsym == 0){
      ws.getRange(v+1, 2).setValue('+');
    }
    else{
      ws.getRange(v+1, 2).setValue('-');
    }
    if(vsym1 == 0){
      ws.getRange(v+1, 4).setValue('-');
    }
    else{
      ws.getRange(v+1, 4).setValue('+');
    }
    break;
case "Addition":
    ws.getRange(v+1, 2).setValue('+');
    ws.getRange(v+1, 4).setValue('+');
    ws.getRange(v, 3).setValue(vnum);
    ws.getRange(v+1, 3).setValue(vnum1);
    ws.getRange(v, 5).setValue(vnum2);
    ws.getRange(v+1, 5).setValue(vnum3);
    break;
  case "Subtraction":
    ws.getRange(v+1, 2).setValue('-');
    ws.getRange(v+1, 4).setValue('-');
    if(vnum > vnum1){
      ws.getRange(v, 3).setValue(vnum);
      ws.getRange(v+1, 3).setValue(vnum1);
    }
    else{
      ws.getRange(v, 3).setValue(vnum1);
      ws.getRange(v+1, 3).setValue(vnum);
    }
    if(vnum2 > vnum3){
      ws.getRange(v, 5).setValue(vnum2);
      ws.getRange(v+1, 5).setValue(vnum3);
    }
    else{
      ws.getRange(v, 5).setValue(vnum3);
      ws.getRange(v+1, 5).setValue(vnum2);
    }
    break;
  case "Multiplication":
    ws.getRange(v+1, 2).setValue('x');
    ws.getRange(v+1, 4).setValue('x');
    ws.getRange(v, 3).setValue(vnum);
    ws.getRange(v+1, 3).setValue(vnum1);
    ws.getRange(v, 5).setValue(vnum2);
    ws.getRange(v+1, 5).setValue(vnum3);
    break;
  }
}
for ( var s = 8; s <= 26; s = s + 2){
  ks.getRange(s, 7).clearContent();
}
 for ( var s2 = 32; s2 <= 47; s2 = s2 + 3){
    ks.getRange(s2, 3).clearContent();
    ks.getRange(s2, 5).clearContent();
   }

}
function myKSG() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var ws = ss.getSheetByName("Worksheet");
 var ks = ss.getSheetByName("Key");

 for ( var s = 8; s <= 26; s = s + 2){
   var nm = ks.getRange(s, 3).getValue();
   var nm1 = ks.getRange(s, 5).getValue();

   switch(ws.getRange(s, 4).getValue()){
    case "+":
      ws.getRange(s, 4).copyFormatToRange(ks, 7, 7, s, s);
      ks.getRange(s, 7).setValue(nm + nm1);
      break;
    case "-":
      ws.getRange(s, 4).copyFormatToRange(ks, 7, 7, s, s);
      ks.getRange(s, 7).setValue(nm - nm1);
    break;
    case "x":
      ws.getRange(s, 4).copyFormatToRange(ks, 7, 7, s, s);
      ks.getRange(s, 7).setValue(nm * nm1);
    break;
   }
  }
  for ( var s2 = 32; s2 <= 47; s2 = s2 + 3){
    var vm = ks.getRange(s2 - 2, 3).getValue();
    var vm1 = ks.getRange(s2 - 1, 3).getValue();
    var vm2 = ks.getRange(s2 - 2, 5).getValue();
    var vm3 = ks.getRange(s2 - 1, 5).getValue();
    if( ks.getRange(s2-1, 2).getValue() == "+"){
      ks.getRange(s2, 3).setValue(vm + vm1);
   }
   else if(ks.getRange(s2-1, 2).getValue() == "-"){
      ks.getRange(s2, 3).setValue(vm - vm1);
    }
   else if(ks.getRange(s2-1, 2).getValue() == "x"){
     ks.getRange(s2, 3).setValue(vm * vm1);
   }
     if( ks.getRange(s2-1, 4).getValue() == "+"){
      ks.getRange(s2, 5).setValue(vm2 + vm3);
    }
    else if(ks.getRange(s2-1, 4).getValue() == "-"){
     ks.getRange(s2, 5).setValue(vm2 - vm3);
    }
     else if(ks.getRange(s2-1, 4).getValue() == "x"){
      ks.getRange(s2, 5).setValue(vm2 * vm3);
    }
   }
 }

1 Ответ

0 голосов
/ 12 октября 2018

Этот вопрос относится к рабочим листам по математике и, в частности, к проблемам с решением уравнений для сложения дробей.

Этот код предназначен для обновления результатов на листе «Ключ» для уравнений дроби, которые отображаются в строках с 8 по 26. После определения логики и механизма вопросник может адаптировать код для оценки и оценки.обновите формулы в строках с 30 по 47.

Запрашивающий должен вставить новую строку 73 в свою функцию «myWSG», чтобы создать «знак добавления», обеспечивающий добавление, применимое к дробям.В какой-то момент у меня случился небольшой сердечный приступ, когда выяснилось, что фракции нужно умножать, а не добавлять.Без сомнения, установив механизм оценки дробей, спрашивающий мог адаптировать код для вычитания, умножения или деления дробей.Но это лучше всего оставить Спрашивающему на досуге.

myWSG Новая строка 73

ws.getRange(i, 4).setValue('+');

Оценка фракций требовала установления рубрики для управления различными вариантами и соответствующей обработки.Я добавил это как дополнение.Это включает в себя оценку числителей с нулевым значением (что спрашивающий может или не может ожидать).

В тех случаях, когда каждая фракция имеет свой знаменатель, необходимо установить «наименьший общий знаменатель», чтобы сделать дроби совместимыми.Для этого я использовал функцию LCM (Least Common Multiple), представленную на листе «Ключ».Единственная проблема заключается в том, что это может привести к дроби, которая может быть упрощена.Например, если ответ «1 26/40», то его можно упростить до «1 13/20».Я оставлю спрашивающего, чтобы рассмотреть плюсы и минусы этого на досуге.


function so_52469576() {

  // build solutions for fractions
  // Define the sdpreadsheet and sheets
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ks = ss.getSheetByName("Key");

  // set/reset key variables
  var status = 0;
  var numtotal = 0;
  var answer = 0;
  var IntegerDenominator = 0;
  var IntegerNumerator = 0;
  var answercell = "";
  var Remainder = 0;
  var answerInteger = 0;
  var seqL = 0;
  var newnumL = 0;
  var seqR = 0;
  var newnumR = 0;
  var numL = 0; 
  var denL = 0; 
  var numR = 0; 
  var denR = 0; 
  var lcd = 0; 

  // start loop for equations in lows 8 to 26, every other row
  for (var i = 8; i <= 26; i = i + 2){

    //Logger.log("i="+i);//DEBUG

    // ensure some variables values don't carry over
    // might not be necessary
    status = 0;
    numtotal = 0;
    answer = 0;
    IntegerDenominator = 0;
    IntegerNumerator = 0;
    answercell = "";
    Remainder = 0;
    answerInteger = 0;
    seqL = 0;
    newnumL = 0;
    seqR = 0;
    newnumR = 0;
    numL = 0; 
    denL = 0; 
    numR = 0; 
    denR = 0; 
    lcd = 0; 

    // collect denominators and numerators
    numL = ks.getRange(i,16).getValue(); 
    denL = ks.getRange(i,17).getValue(); 
    numR = ks.getRange(i,19).getValue(); 
    denR = ks.getRange(i,20).getValue(); 
    lcd= ks.getRange(i,22).getValue(); 
    //Logger.log("i="+i+",numL="+numL+", denL="+denL+",numR="+numR+", denR="+denR+", lcd="+lcd); //DEBUG

    // commence evaluation
    // 1- test for an integer
    // Left side first
     if ((denL == "n/a") || (denL == 1)){
       // Left side is an integer
       status = 1;
       //Logger.log("denl is an integer"); //DEBUG
     }
     else{
       // Left side must be a Fraction
       status = 2;
       // Logger.log("denl is NOT an integer"); //DEBUG
     }

     // Right side
     if ((denR == "n/a") || (denR == 1)){
       // Left side is an integer
       status = status+1;
       // Logger.log("denR is an integer"); // DEBUG
     }
     else{
       // Left side must be a Fraction
       status = status+2;
       // Logger.log("denR is NOT an integer"); //DEBUG
     }

     // possible status values
     // 2 = Two Integers
     // 3 = One Integer and one Fraction
     // 4 = Two Fractions
     // There aretwo variations to Two Fractions: 1 - Same denominators; 2 - Different Denominators

     if (status == 2){

       //Logger.log("Status = 2 - Two Integers");
       // Two integers
       //get the numerator
       numtotal = numL + numR;
       answer = numtotal;
       //Logger.log("i="+i+",Result 2");//DEBUG
       answercell = ks.getRange(i, 7);
       answercell.setValue(answer);
       // end status 2 - Two Integers


     } else if (status == 3){ 

       //Logger.log("Status = 3 - One Integer and One Fraction");//DEBUG
       // One Integer and One Fraction
       // establish which side is the integer

       if (denL == "n/a" || denL == 1){
         // the integer is on the left
         IntegerDenominator = denR; //row, column Col L
         IntegerNumerator = numL * IntegerDenominator; 
         numtotal = IntegerNumerator + numR; 
         //Logger.log("i="+i+",Result 3-1-1");//DEBUG

       }else{
         // the integer is on the right
         IntegerDenominator = denL; //row, column Col L
         IntegerNumerator = numR * IntegerDenominator;
         numtotal = IntegerNumerator + numL;
         // Logger.log("i="+i+",Result 3-1-2");// DEBUG
       }


       // test for a numerator equal to zero
       // no intergers are = zero 
       // no denominators = zero

       if (numL==0 && numR==0){

         // doesn't apply for one integer and one fraction, 
         // but retain for consistency
         // answer must be zero

         answer = 0; 
         // Logger.log("i="+i+",Result 3-1");// DEBUG

       } else if  (numL == 0) {

       // if numL is zero, then the fraction must be on the left side
       // integer must be on the right
       // so answer is an integer

       answer = numR;
         //Logger.log("i="+i+",Result 3-2");//DEBUG

       } 
       else if (numR == 0) {

         // if numR is zero, then the fraction must be on the right side
         // so integer must be on the left  
         // so answer is an integer
         answer = numL;
         // Logger.log("i="+i+",Result 3-3");DEBUG

       } 
       else {

         // neither side = zero, so answer as normal
         answerInteger = parseInt(numtotal / IntegerDenominator);
         Remainder = numtotal-(answerInteger * IntegerDenominator);
         answer = " "+answerInteger+" "+Remainder+"/"+IntegerDenominator;
         // Logger.log("i="+i+",Result 3-4");// DEBUG
       }

       answercell = ks.getRange(i, 7);
       answercell.setValue(answer);
       // end status 3

     } else {

       //Logger.log("Status = 4 - Two Fractions");
       // Two Fractions

       // test for a numerator equal to zero
       // no intergers are = zero 
       // no denominators = zero

       if (numL==0 && numR==0){

         // doesn't apply for one integer and one fraction, 
         // but retain for consistency
         // answer must be zero

         answer = 0;
         // DEBUGLogger.log("i="+i+",Result 4-1: ");

       } else if  (numL == 0) {

         // if numL is zero, then fraction on the left must = zero
         // so only the fraction on the right applies
         // so answer is the righthand side
         answer = " "+numR+" "+"/"+denR;  
         //Logger.log("i="+i+",Result 4-2");//DEBUG

       } else if  (numR == 0) {

         // if numR is zero, then fraction on the right must = zero
         // so only the fraction on the left applies
         // so answer is the lefthand side
         answer = " "+numL+" "+"/"+denLR;  
         // Logger.log("i="+i+",Result 4-3");//DEBUG

       } else if (denL == denR && numL !=0 && numR!=0){

         // establish whehther same or different demoninators
         // same denominators
         numtotal = numL + numR;
         answerInteger = parseInt(numtotal / denL);
         Remainder = numtotal-(answerInteger * denL);
         answer = " "+answerInteger+" "+Remainder+"/"+denL;
         // Logger.log("i="+i+",Result 4-4");// DEBUG
         // end same denominators

       }
       else if (denL != denR && numL !=0 && numR!=0)
       {

         // Test for different denominators
         // Requires calculating the Lowest Common Denominator

         seqL = (lcd/denL);
         newnumL = seqL * numL;
         seqR = (lcd/denR);
         newnumR = seqR * numR;
         numtotal = newnumL+ newnumR;
         answerInteger = parseInt(numtotal/lcd);
         Remainder = numtotal-(answerInteger * lcd);
         answer = " "+answerInteger+" "+Remainder+"/"+lcd;  
         // Logger.log("i="+i+",Result4-5");// DEBUG
         // end different denominators

       }
         answercell = ks.getRange(i, 7);
         answercell.setValue(answer); 

     }// end status 4 - Two Fractions  
   }// end for  
}// end

Снимок экрана решений на листе "Ключ"

enter image description here

Рубрика - Логика расчета

Необходимо установить типы чисел в уравнении, чтобы мы могли применить соответствующую формулу для решения.Цель состоит в том, чтобы различать целые и дробные числа.И из дробей, с общим знаменателем и с другим знаменателем.Общее правило также применяется, если любая дробь имеет ноль в качестве числителя, тогда ее значение равно нулю, и его можно игнорировать в вычислениях.

  • Подсчитать количество ненулевых числителей (возможностиодин или два)
  • Подсчитать количество ненулевых знаменателей (возможны один или два)
  • Добавить результаты (возможны два, три или четыре)

ВОЗМОЖНЫЕ РЕЗУЛЬТАТЫ
" Два целых числа " или " Одно целое число" и одна дробь"или" Две дроби"

ДВА ИНТЕГРА
Сложите два числа вместе и вставьте ответ

ОДИН ЦЕЛОК И ОДНА ФРАКЦИЯ

  • Преобразовать целое число в дробь, получить знаменатель дроби и создать числитель с одинаковым значением

  • Добавить два числителя

  • Разделите сумму числителей на знаменатель и выразите в виде целого числа.

  • Рассчитать остаток от числителя (сумма чисел меньше (целочисленный результат по знаменателю))

  • Ответ = Целое число, пробел и остаток & / & знаменатель

ДВЕ ФРАКЦИИ Существует два варианта

  • Каждая фракция имеет один и тот же знаменатель

  • Каждая фракция имеет свой знаменатель

Две дроби - один и тот же знаменатель

  • Добавить числители

  • Разделитьсумму числителей по знаменателю и выражение результата в виде целого числа

  • Рассчитать остаток от числителя (сумма числителей меньше (целочисленный результат по знаменателю))

  • Ответ = Целое число, пробел и остаток и / и знаменатель

Две дроби - Различный знаменатель

  • Найти наименьшее общеезнаменатель (LCM)

  • Для каждой дроби определите соответствующий порядковый номер, который приводит к LCM

  • Для каждой дроби умножьте числитель напорядковый номер;при этом генерируется «новый» числитель для каждой дроби

  • Добавьте два «новых» числителя

  • Разделите сумму числителей на LCM иВыразить в виде целого числа.

  • Рассчитать остаток от числителя (сумма «новых» числителей меньше (целочисленный результат по LCM))

  • Ответ = Целое число, пробел и остаток и / и LCM


ИМПЕРФЕКЦИИ: самый низкий общий знаменатель (ЖКД). Сценарий опирается на значение LCM на листе «Ключ»,При этом используется функция Google "LCM" для вычисления наименьшего общего множителя двух знаменателей.LCM не всегда генерирует истинный LCD, потому что он решает общий множитель, а не наименьший общий знаменатель.И это никогда не будет меньшим из двух чисел.

Например

Assume the denominators are "6" and "2". The LCM value = 6, but the true Lowest common denominator is "2". 

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...