Schemat, Algorytm Hornera

0

Mam ogromną prośbę o udzielenie pomocy odnośnie schematu Hornera interacyjnego. Mianowicie muszę napisać program dający użytkownikowi możliwość wprowadzenia zmiennych po czym program ma algorytmem Hornra dokonać obliczeń i zwrócić wartość.
Zacząłem coś pisać ale kompletnie mi to nie wychodzi bo staram się przekonwertować C++ na C# a jestem niezbyt biegły w programowaniu.

Oto mój kod źródłowy (zmienne użytkownik może wprowadzać do textBoxów - nie są one na razie idioto odporne, czyli można w tej chwili wpisać wszystko. Chodzi o to żeby w ogóle zaczęło być cokolwiek liczone)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace Schemat_Hornera_Interacyjnie
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            int n = int.Parse(textBox1.Text);
            int x = int.Parse(textBox2.Text);
            int a = int.Parse(textBox3.Text);
 
            int[] a = new int[n];
            for (int i = 0; i <= n; i++)
            {
 
            }
 
            int w = int.Parse(textBox4.Text);
            w = a[0];
            for (int i = 1; i <= n; i++)
            {
                w = w * x + a[i];
            }
 
                textBox4.Text = Convert.ToString(w);
 
        }
 
    }
}

Z góry bardzo dziękuje za odpowied

0

Powinno Ci wywalić błąd bo masz 2 razy definicję zmiennej 'a'.

0

Też właśnie mi wywala ale chciał bym zrobic 'a' jako tablicę dynamiczną i przy okazji możliwość podania 'a' w textBox'ie... I tu mam problem :/
Nie wiem też jak zrobić pętle 'for'

     for (int i = 0; i <= n; i++)
            {
                     ???
            }

W C++ wygląda to tak:

for (int i = 0; i <= n; i++)
{
  cout<<"a["<<i<<"] = ";
  cin >>a[i];
  cin.ignore();
}

Ale nie potrafię tego przekonwertować na język C#

0

Jezus ludzie, czemu Wy nie potraficie przeczytać najprostszego kursu przed pisaniem w C#. Zamiast cin i cout masz Console.WriteLine() i Console.Readline() jesli sie nie myle. W ogóle MSND aż do oporu.

0

Dzięki wielkie... Bardzo mi to pomogło... Tylko mam jeszcze jeden mały problem mianowicie już nie pokazuje mi żadnych błędów ale przy uruchomieniu programu i przy podaniu wartości 'a' którejś z kolei program mi się wysypuje :/

Taki mam kod:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Horner_Consola
{
    class Program
    {
        static void Main(string[] args)
        {
            int n;
            Console.WriteLine("Podaj stopień wielomioanu: ");
            n = Convert.ToInt32(Console.ReadLine());

            int[] a = new int [n];

            Console.WriteLine("Podaj wartosc a: ");
            for (int i = 0; i <= n; i++)
            {
                Console.WriteLine("a [" + i );
                a[i] = Convert.ToInt32(Console.ReadLine());
            }

            int x;

            Console.WriteLine("Podaj x:");
            x = Convert.ToInt32(Console.ReadLine());

            int w;

            w = a[0];
            for (int i = 1; i <= n; i++)
            {
                w = w * x + a[i];
            }

            Console.WriteLine("Wynik to" + w);
        }
    }
}

Pokazuje że błąd jest gdzieś w tym miejscu ( n = Convert.ToInt32(Console.ReadLine()); ?? )

0

Nie wywala Ci się przypadkiem, jak podasz cokolwiek po za liczbą? Sprawdź TryParse().

0

A nie wychodzisz przypadkiem poza tablicę hę?

 for (int i = 0; i <= n; i++)

Masz tablicę rozmiaru n i indeksy 0..n-1 więc powinno być tak:

 for (int i = 0; i < n; i++)
0

Dzięki bardzo za pomoc :) Wszytko chodzi jak powinno :) Tylko zrobiłem program w aplikacji konsolowej tak żeby zobaczyć czy zadział, a chciał bym (jeżeli oczywiście się da) przedstawić to w aplikacji okienkowej... Docelowo chciał bym pokazać krok po kroku sposób liczenia np. w MessageBox'ie na przykładzie wprowadzonym przez użytkownika do TextBox'ów... Tylko się teraz zastanawiam jak to przerobić na aplikację okienkową...?

Kod konsolowy mam docelowo taki:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Horner_Consola
{
    class Program
    {
        static void Main(string[] args)
        {
            int n;
            Console.WriteLine("Podaj stopień wielomioanu: ");
            n = Convert.ToInt32(Console.ReadLine());

            int[] a = new int [n];

            Console.WriteLine("Podaj wartosc a: ");
           
            for (int i = 0; i < n; i++)
            {
                Console.WriteLine("a [" + i );
                a[i] = Convert.ToInt32(Console.ReadLine());
            }

            int x;

            Console.WriteLine("Podaj x:");
            x = Convert.ToInt32(Console.ReadLine());

            int w;

            w = a[0];
            for (int i = 1; i < n; i++)
            {
                w = w * x + a[i];
            }

            Console.WriteLine("Wynik to: " + w);
            Console.ReadLine();
        }
    }
}

Oczywiście jak już zdołam przerobić to wszystko to zajmę się idioto odpornością czyli zabraniem możliwości wpisywania literek itp.

Tu myślę o takim kodzie na każdy TextBox:

try
  { 
     int tekst = Int32.Parse(textBox1.Text); 
  } 
catch 
  { 
     textBox1.Clear(); MessageBox.Show("Wpisany znak nie jest typem INT"); 
  }
0

Stary w życiu, jak nie jesteś pewien czy dany string będzie liczbą to TryParse http://msdn.microsoft.com/en-us/library/f02979c7.aspx a nie wyjątek.

0
mcshow napisał(a)

Oczywiście jak już zdołam przerobić to wszystko to zajmę się idioto odpornością czyli zabraniem możliwości wpisywania literek itp.

Tu myślę o takim kodzie na każdy TextBox:

try
  { 
     int tekst = Int32.Parse(textBox1.Text); 
  } 
catch 
  { 
     textBox1.Clear(); MessageBox.Show("Wpisany znak nie jest typem INT"); 
  }

I będziesz taki sam kod kopiował wielokrotnie? Przemyśl to nieco.

0
Sarrus napisał(a)

A nie wychodzisz przypadkiem poza tablicę hę?

 for (int i = 0; i <= n; i++)

Masz tablicę rozmiaru n i indeksy 0..n-1 więc powinno być tak:

 for (int i = 0; i < n; i++)

Program jak już pisałem działa i super tylko jest mały problem bo po poprawieniu kodu jak wcześniej doradził Sarrus, przy podawaniu stopnia wielomianu powinno być np.

Stopień wielomianu: 4 to wypisuje od a0: do a4:

a po wprowadzonych zmianach wypisuję tylko od a0: do a3: i rozumiem to bo "i" jest mniejsze od "n" ale jak już próbuję to poprawić na wcześniejszą dobrą wersję czyli i = n to cały czas program się wysypuje...

Ma ktoś pomysł co jeszcze może być źle ?

0

Jak chcesz wpisywać 5 wartości po podaniu Tobie 4 wcześniej, to:

(sposób)
1)

            int n = 0;
            Console.WriteLine("Podaj stopień wielomioanu: ");
            Int32.TryParse(Console.ReadLine(), out n);
 
            int[] a = new int[++n];

2)

            Console.WriteLine("Podaj stopień wielomioanu: ");
            int n = 1 + Convert.ToInt32(Console.ReadLine());

3)

            int n = 1;
            Console.WriteLine("Podaj stopień wielomioanu: ");
            n += Convert.ToInt32(Console.ReadLine());

4)

int[] a = new int[n];

na

int[] a = new int[++n];

A pętla nadal ma być:

for (int i = 0; i < n; i++)

Nietestowane. Istnieje jeszcze wiele innych sposobów.

0

Dzięki wielkie :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1