void Calcula2(FuncDeX f, double x1, double x2, double incr, string serie) { lbx.Items.Clear(); // declara variável para armazenar a expressão // que resulta na condição do While CondWhile cond; // se x1 menor que x2 a contagem deverá ser progressiva // e o loop deve prosseguir enquanto x1 <= x2 if (x1 < x2) { cond = (cont, limite) => cont <= limite; } // caso contrário a contagem será regressiva // e o loop deve prosseguir enquanto x1 >= x2 else { cond = (cont, limite) => cont >= limite; } double x = x1; chart1.Series[0].ChartType = SeriesChartType.Line; chart1.Series[0].Points.Clear(); chart1.Series[0].Name = serie; chart1.Titles.Clear(); chart1.Titles.Add("Título Principal"); chart1.Titles.Add("Sub-Título"); chart1.Titles[0].Font = new Font("Arial", 12); chart1.Legends[0].Docking = Docking.Bottom; chart1.ChartAreas[0].AxisY.Title = "Tit. eixo Y"; chart1.ChartAreas[0].AxisX.Title = "Tit. eixo X"; // executa o loop while utilizando como condição // a expressão atribuída à variável cond. Passamos // para a expressão o valor de x (contador em a) // e x2 (limite de contagem em b) while (cond(x, x2)) { double y = f(x); chart1.Series[0].Points.Add(new DataPoint(x, y)); lbx.Items.Add("f( " + x.ToString("0.0000") + ") = " + y.ToString("0.0000")); x += incr; } }
// rotina auxiliar que recebe a variável f que é do tipo FuncDeX // esta variável aponta para um método que respeite a // assinatura criada pelo delegate. Pode apontar para o método // divide, multiplica ou qualquer outro que receba como parâmetro // um dado do tipo double e retorne com double /// <summary> /// rotina auxiliar que gera valores x e y de uma função linear /// </summary> /// <param name="f">Ponteiro para o método que calcula Y dado X</param> /// <param name="inicio">X inicial</param> /// <param name="fim">X final</param> /// <param name="incr">incremento de X</param> void Calcula(FuncDeX f, double inicio, double fim, double incr) { lbx.Items.Clear(); double ctdr = inicio; // loop para gerar os valores de Y while (ctdr <= fim) { // calcula Y de acordo com o método apontado // pela variável f double y = f(ctdr); // mostra os valores de X e Y no listBox lbx.Items.Add("f( " + ctdr + ") = " + y.ToString("0.0000")); ctdr += incr; } }
// rotina auxiliar que recebe a variável f que é do tipo FuncDeX // esta variável aponta para um método que respeite a // assinatura criada pelo delegate. Pode apontar para o método // divide, multiplica ou qualquer outro que receba como parâmetro // um dado do tipo double e retorne com double /// <summary> /// rotina auxiliar que gera valores x e y de uma função linear /// </summary> /// <param name="f">Ponteiro para o método que calcula Y dado X</param> /// <param name="x1">X inicial</param> /// <param name="x2">X final</param> /// <param name="incr">incremento de X</param> void Calcula(FuncDeX f, double x1, double x2, double incr) { lbx.Items.Clear(); double x = x1; // loop para gerar os valores de Y // faz apenas contagem progressiva, o método Calcula2 resolve o problema // podendo contar tanto progressivo quanto regressivo while (x <= x2) { // calcula Y de acordo com o método apontado // pela variável f double y = f(x); // mostra os valores de X e Y no listBox lbx.Items.Add("f( " + x + ") = " + y.ToString("0.0000")); x += incr; } }