Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?
Гродненский Форум
20 Июль 2025, 03:10:33
Новости, реклама:
   Главная   Новости Гродно Помощь Игры Календарь Войти Регистрация   Меню
Гродненский Форум > Компьютеры > Программирование
(Модераторы: Админ, barmalei) > Тема:

Помогите найти ошибку в коде, пожалуйста!!

Страниц  :   Вниз
  Печать  
Автор Тема: Помогите найти ошибку в коде, пожалуйста!!  (Прочитано 815 раз)
0 Пользователей и 1 Гость смотрят эту тему.
katti_ok
Новенький


Репутация: +1/-0
Offline Offline

Пол: Женский
Сообщений: 4


S Просмотр профиля Email
« : 30 Ноябрь 2012, 01:40:42 »

 Помогите, пожалуйста, найти ошибку в коде!! Суть задачи: метод Гауса с выбором главного элемента в подматрице! Почему не переставляются строки в матрице В??

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

namespace Gaus_main_element
{
    public static class Gaus_main_element
    {
        public static int n = 4;
        public static float[] X = new float[] { 10, 10, 10, 10 };
        public static float[,] A = new float[,] {
                                                { 0, 1,0,-1},
                                                {-1, 0,2, 2},
                                                { 0, 1,1,-1},
                                                { 0,-1,0, 0}
                                                
                                                };
        public static float[] B = new float[] { 1, 0, 2, 3 };

        public static bool flag = false;


        public static void OneStep(int k)
        {

            Console.WriteLine("Matrica A do Gaussa ");
            for (int q = 0; q < n; q++)
            {
                for (int p = 0; p < n; p++)
                    Console.Write("  {0}", Math.Round(A[q, p], 3));
                Console.WriteLine("\n");
            }
            Console.WriteLine("Matrica B do Gaussa ");
            for (int f = 0; f < n; f++)
            {
                Console.Write("  {0}", Math.Round(B[f], 3));
                Console.WriteLine("\n");
            }
            



            for (int i = 0; i < n; i++)
            {
                int t = 0;
                for (int j = 0; j < n; j++)
                {
                    if (A[i, j] == 0) t++;

                }
                if (t == n)
                {
                    if (B != 0)
                        Console.WriteLine("net resenij");
                    flag = true;
                    break;
                }
            }

            //ctb=0
            for (int j = 0; j < n; j++)
            {
                if (flag == true) break;
                int t = 0;
                for (int i = 0; i < n; i++)
                {
                    if (A[i, j] == 0) t++;

                }
                if (t == n)
                {
                    Console.WriteLine("beskonecno mnogo resenij");
                    flag = true;
                    break;
                }
            }
 if (flag == false)
            {
                for (int i = k + 1; i < n; i++)
                {
                    float q = A[i, k] / A[k, k];
                    for (int j = k; j < n; j++)
                    {
                        A[i, j] = A[i, j] - q * A[k, j];
                    }
                    B = B - q * B[k];
                }

                Console.WriteLine("Matrica A posle Gaussa");
                for (int q = 0; q < n; q++)
                {
                    for (int p = 0; p < n; p++)
                        Console.Write("  {0}", Math.Round(A[q, p], 3));
                    Console.WriteLine("\n");
                }
                Console.WriteLine("Matrica B posle Gaussa ");
                for (int i = 0; i < n; i++)
                {
                    Console.Write("  {0}", Math.Round(B, 3));
                    Console.WriteLine("\n");
                }

                Console.WriteLine("=========================");
            }
            //}


                
        }


        public static void BackStep()
        {
            X[n - 1] = B[n - 1] / A[n - 1, n - 1];
            for (int i = n - 2; i >= 0; i--)
            {
                float sum = 0;
                for (int j = i + 1; j < n; j++)
                {
                    sum = sum + A[i, j] * X[j];
                }
                X = (B - sum) / A[i, i];
            }
        }

        public static void ChangeStr(int i, int j)
        {
            for (int p = 0; p < n; p++)
            {
                float temp = 0;
                temp = A[i, p];
                A[i, p] = A[j, p];
                A[j, p] = temp;
                                
                temp = B;
                B = B[j];
                B[j] = temp;
            }
        }

        public static void ChangeStb(int i, int j)
        {
            for (int p = 0; p < n; p++)
            {
                float temp = 0;
                temp = A[p, i];
                A[p, i] = A[p, j];
                A[p, j] = temp;
                                
            }
        }


        public static void Max(int num)
        {
            Console.WriteLine("Matrica A do perestanovki");
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                    Console.Write("  {0}", Math.Round(A[i, j], 3));
                Console.WriteLine("\n");
            }
            Console.WriteLine("Matrica B do perestanovki");
            for (int i = 0; i < n; i++)
            {
                Console.Write("  {0}", Math.Round(B, 3));
                Console.WriteLine("\n");
            }

            float max = Math.Abs(A[num, num]);            
            int k = num;
            int l = num;            
            for (int i = num + 1; i < n; i++)
                for (int j = num + 1; j < n; j++)
                {
                    if (Math.Abs(A[i, j]) > max)
                    {
                        max = Math.Abs(A[i, j]);                        
                        k = i;
                        l = j;                        
                    }
                }

            Console.WriteLine("Max element {0},  k={1},  l={2}", Math.Round(max, 3), k, l);
            
            if (k == num && l == num) Console.WriteLine("ne meniajem\n");
            if (k != num && l != num)
            {
                ChangeStr(num, k);
                ChangeStb(num,l);
                

            }
            if ((k == num))
                ChangeStb(num, l);
            if ((l == num))
                ChangeStr(num, k);
            


            Console.WriteLine("Matrica A posle perestanovki");
            for (int i = 0; i < n; i++)
            {
                {
                    for (int j = 0; j < n; j++)
                        Console.Write("  {0}", Math.Round(A[i, j], 3));
                    Console.WriteLine("\n");
                }
            
            Console.WriteLine("Matrica B posle perestanovki ");
            for (int i = 0; i < n; i++)
            {
                Console.Write("  {0}", Math.Round(B, 3));
                Console.WriteLine("\n");
            }
                Console.WriteLine("\n---------------------------------");
            }
        }
 public static void Gauss()
        {
                for (int i = 0; i < n - 1; i++)
                {
                    if (flag == false)
                    {
                        Max(i);
                        OneStep(i);
                    }
                }
                if (flag == false)
                {
                    BackStep();

                    for (int cx = 0; cx < n; cx++)
                    {
                        Console.WriteLine("x[{0}]={1}", cx, Math.Round(X[cx], 3));
                    }
                }
            }

        }
    }
Записан
coolasm
Почетный гродненец
*****

Репутация: +102/-3
Offline Offline

Пол: Мужской
Сообщений: 1458


//---------//

Просмотр профиля
« Ответ #1 : 02 Декабрь 2012, 02:10:52 »

prog.cs(212,22): error CS0136: A local variable named `i' cannot be declared in this scope because it would give a different meaning to `i', which is already used in a `parent' scope to denote something else
prog.cs(203,22): (Location of the symbol related to previous error)
Compilation failed: 1 error(s), 0 warnings

212 строке используется вложеный цикл у которого итератор совпадает с внешним циклом
  
 for (int i = 0; i < n; i++)
            {
                {
                    for (int j = 0; j < n; j++)
                        Console.Write("  {0}", Math.Round(A[i, j], 3));
                    Console.WriteLine("");
                }
            
            Console.WriteLine("Matrica B posle perestanovki ");
            for (int i = 0; i < n; i++)
            {
                Console.Write("  {0}", Math.Round(B, 3));
                Console.WriteLine("");
            }
                Console.WriteLine("---------------------------------");
            }

Добавлено: [time]Сбт 01 Дек 2012 23:16:10[/time]

54 строка - тут проблемы с B, почему то массив сравнивается с нулем, а не элемент этого массива
                  if (B != 0)
                        Console.WriteLine("net resenij");
                    flag = true;
                    break;

Добавлено: [time]Вск 02 Дек 2012 00:17:35[/time]
http://ideone.com/ - используйте этот сервис, для форматирования кода

Добавлено: [time]Вск 02 Дек 2012 01:41:17[/time]
Основня часть ошибок связана с отсутствием индекса при обращении к массивам

                for (int i = 0; i < n; i++)
                {
                    Console.Write("  {0}", Math.Round(B, 3));  // B - массив, какой элемент округляется?  По идее должно быть B[ i ]
                    Console.WriteLine("\n");
                }

По коду такого дофига

Запускаете build, смотрите лог ошибок, будет что-то такое:
prog.cs(121,19): error CS0029: Cannot implicitly convert type `float' to `float[]'
Смотрите номер строки (в примере это 121 строка), переходите на эту строку, исправляете, заново запускаете build и так пока не будет нормально собираться, после выкладываете код и спрашиваете.
« Последнее редактирование: 02 Декабрь 2012, 18:18:42 от coolasm » Записан

HTTP Error 404 - File or directory not found.
Clinique Happy
Почетный гродненец
*****

Репутация: +130/-6
Offline Offline

Пол: Мужской
Сообщений: 1198


Меняю себя и мир вокруг себя!

Просмотр профиля WWW
« Ответ #2 : 02 Декабрь 2012, 10:32:00 »

if (flag == false)
За такие проверки я бы по рукам бил  Улыбка
Записан

Йаааz'
Настоящий гродненец
****

Репутация: +122/-4
Offline Offline

Пол: Мужской
Сообщений: 665


Рыб мечты

Просмотр профиля
« Ответ #3 : 02 Декабрь 2012, 14:33:54 »

if (flag == false)
За такие проверки я бы по рукам бил  Улыбка
Спорный вопрос. Некоторые могут сказать, что условие
Код:
if (!flag)
хуже видно в коде, чем
Код:
if (flag == false)

В любом случае - непрофессионалу простительно.

А вот такие конструкции меня напрягают (я имею в виду игнорирование фигурных скобок для второго for):
Код:
            
for (int q = 0; q < n; q++)
{
    for (int p = 0; p < n; p++)
        Console.Write("  {0}", Math.Round(A[q, p], 3));
    Console.WriteLine("\n");
}
Записан
Clinique Happy
Почетный гродненец
*****

Репутация: +130/-6
Offline Offline

Пол: Мужской
Сообщений: 1198


Меняю себя и мир вокруг себя!

Просмотр профиля WWW
« Ответ #4 : 02 Декабрь 2012, 15:12:34 »

if (flag == false)
За такие проверки я бы по рукам бил  Улыбка
Спорный вопрос. Некоторые могут сказать, что условие
Код:
if (!flag)
хуже видно в коде, чем
Код:
if (flag == false)

В любом случае - непрофессионалу простительно.

А вот такие конструкции меня напрягают (я имею в виду игнорирование фигурных скобок для второго for):
Код:
            
for (int q = 0; q < n; q++)
{
    for (int p = 0; p < n; p++)
        Console.Write("  {0}", Math.Round(A[q, p], 3));
    Console.WriteLine("\n");
}

Согласен, один из пунктов best practises это всегда использовать скобки для того, чтобы был виден скоуп Улыбка
Записан

Страниц  :   Вверх
  Печать  
 
Перейти в:  

Войти
Войдите, чтобы добавить комментарий

Войдите через социальную сеть

Имя пользователя:
Пароль:
Продолжительность сессии (в минутах):
Запомнить:
Забыли пароль?

Контакт
Powered by MySQL Powered by PHP Мобильная версия
Powered by SMF 1.1.20
SMF © 2006-2025, Simple Machines
Simple Audio Video Embedder
| Sitemap
Valid XHTML 1.0! Valid CSS!
Страница сгенерирована за 0,138 секунд. Запросов: 20.