C# Синтаксис без создания класса - PullRequest
0 голосов
/ 02 мая 2020

Я работаю через сортировки в C# и сейчас пишу быструю сортировку, и, кажется, синтаксис неверен.

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

namespace SortQuick
{
class quickSortAlgorithm
{
    private int[] array = new int[10];
    private int len;
    public static void quicksort(int left, int right)
    {
        int pivot;
        pivot = array[left];

        while(left < right)
        {
            while (array[left] <= pivot & (left<right)) {
                --right;
            }
            if(left != right)
            {
                array[left] = array[right];
                left++;
            }
            while((array[left]>= pivot) & (left>right)) {
                left++;
            }

            if(left!=right)
            {
                array[right] = array[left];
                right--;
            }
        }
        array[left] = pivot;
        pivot = left;
       if(left<pivot)
        {
            quicksort(left, pivot);
        }
       if(right>pivot)
        {
            quicksort(pivot+1, right);
        }
    }
    static void Main(string[] args)
    {
        quickSortAlgorithm qSort = new quickSortAlgorithm();
        int[] array = { 32, 43, 54, 65, 23, 56, 34, 78, 98, 12};
        qSort.array = array;
        qSort.len = qSort.array.Length;
        quicksort(0, qSort.len - 1);
        for (int j = 0; j &lt; qSort.len;++j) {
            Console.WriteLine(qSort.array[j]);
        }
    }
 }
}

Компилятор недоволен массивом внутри функции, а также условием escape в l oop в main. Я написал это сам без конструктора, но ошибки, которые я получаю, - это то, что я могу получить на go, я просто не понимаю разницу в синтаксисе.

/*
*  C# Program to Implement Quick Sort
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace sortQuickAlgorithm
{
class quickSortAlgorithm
{

    private int[] array = new int[20];
    private int len;

    public void QuickSortAlgorithm()
    {
        sort(0, len - 1);
    }

    public void sort(int left, int right)
    {
        int pivot, leftend, rightend;

        leftend = left;
        rightend = right;
        pivot = array[left];

        while (left < right)
        {
            while ((array[right] >= pivot) & amp; &amp; (left < right))
            {
                right--;
            }

            if (left != right)
            {
                array[left] = array[right];
                left++;
            }

            while ((array[left] >= pivot) & amp; &amp; (left < right))
            {
                left++;
            }

            if (left != right)
            {
                array[right] = array[left];
                right--;
            }
        }

        array[left] = pivot;
        pivot = left;
        left = leftend;
        right = rightend;

        if (left < pivot) { sort(left, pivot - 1); }
        if (right > pivot)
        {
            sort(pivot + 1, right);
        }
    }

    public static void Main()
    {
        quickSortAlgorithm q_Sort = new quickSortAlgorithm();

        int[] array = { 41, 32, 15, 45, 63, 72, 57, 43, 32, 52, 183 };
        q_Sort.array = array;
        q_Sort.len = q_Sort.array.Length;
        q_Sort.QuickSortAlgorithm();

        for (int j = 0; j & lt; q_Sort.len; j++)
        {
            Console.WriteLine(q_Sort.array[j]);
        }
        Console.ReadKey();
     }
  }
}

Это сообщение об ошибке:

Severity    Code    Description Project File    Line    Suppression State
Error   CS0120  An object reference is required for the non-static field, 
method, or property 'quickSortAlgorithm.array'  SortQuick    
C:\Program.cs   15  Active

Severity    Code    Description Project File    Line    Suppression State
Error   CS0103  The name 'j' does not exist in the current context  SortQuick    
C:\SortQuick\SortQuick\Program.cs   55  Active
Error   CS1026  ) expected  SortQuick   C:\SortQuick\SortQuick\Program.cs    
 55 Active
Error   CS1002  ; expected  SortQuick   C:\SortQuick\SortQuick\Program.cs    
55  Active
Error   CS1513  } expected  SortQuick   C:\SortQuick\SortQuick\Program.cs    
55  Active
Error   CS1026  ) expected  Miscellaneous Files C:\C#\Practice\Class1.cs     
32  Active
Error   CS1002  ; expected  Miscellaneous Files C:\C#\Practice\Class1.cs     
32  Active
Error   CS1513  } expected  Miscellaneous Files C:\C#\Practice\Class1.cs     
32  Active
Error   CS1026  ) expected  Miscellaneous Files C:\C#\Practice\Class1.cs     
43  Active
Error   CS1002  ; expected  Miscellaneous Files C:\C#\Practice\Class1.cs     
43  Active
Error   CS1513  } expected  Miscellaneous Files C:\C#\Practice\Class1.cs     
43  Active
Error   CS1026  ) expected  Miscellaneous Files C:\C#\Practice\Class1.cs     
76  Active
Error   CS1002  ; expected  Miscellaneous Files C:\C#\Practice\Class1.cs     
76  Active
 Error  CS1513  } expected  Miscellaneous Files C:\C#\Practice\Class1.cs     
 76 Active
Error   CS0103  The name 'lt' does not exist in the current context SortQuick    
C:\SortQuick\SortQuick\Program.cs   55  Active
Error   CS0201  Only assignment, call, increment, decrement, await, and new 
object expressions can be used as a statement   SortQuick    
C:\Program.cs   55  Active
 Error  CS0103  The name 'j' does not exist in the current context  SortQuick    
C:\Program.cs   56  Active
 Message    IDE1006 Naming rule violation: These words must begin with upper 
case 
characters: quickSortAlgorithm  SortQuick   C:\Program.cs   8   Active
 Message    IDE1006 Naming rule violation: These words must begin with upper 
 case 
 characters: quicksort  SortQuick   C:\Program.cs   12  Active

1 Ответ

0 голосов
/ 02 мая 2020

Вы выполняете QuickSort(0, qSort.len - 1); из static void Main(string[] args). Компилятор считает, что вы пытаетесь вызвать нестати c метод из области c.

Я считаю, что вы действительно хотите выполнить qSort.QuickSort(0, qSort.len - 1);.

Разница здесь в том, что компилятору ясно, какой экземпляр объекта QuickSort вызывать метод QuickSort.

Представьте, что вы создали несколько объектов QuickSortAlgorithm в своем методе Main. Если бы вы только что вызвали QuickSort, то как бы он узнал, для какого экземпляра следует выполнить этот метод?

Я думаю, что реализация вашего алгоритма в том же классе, что и точка входа вашей программы stati c, main Смущает вещи. Возможно, вам будет легче распознать ошибку, если вы выделите ее:

using System;

namespace Algorithms
{
    public class Sort
    {
        static void Main(string[] args)
        {
            QuickSortAlgorithm qSort = new QuickSortAlgorithm();
            int[] array = { 32, 43, 54, 65, 23, 56, 34, 78, 98, 12};
            qSort.array = array;
            qSort.len = qSort.array.Length;

            // This isn't going to work, the QuickSortAlgorithm class doesn't have a static definition for this method.
            // Beyond that, our implementation of the QuickSort method references instance variables, which are not referencable from a static scope.
            QuickSortAlgorithm.QuickSort(0, qSort.len - 1);

            for (int j = 0; j < qSort.len;++j)
            {
                Console.WriteLine(qSort.array[j]);
            }
        }
    }

    public class QuickSortAlgorithm
    {
        // These are instance variables; i.e. they belong to an instance of QuickSortAlgorithm, not the static class.
        public int[] array = new int[10]; // <-- changed to public
        public int len; // <-- changed to public
        public void QuickSort(int left, int right)
        {
            int pivot;
            pivot = array[left];

            while(left < right)
            {
                while (array[left] <= pivot & (left<right)) {
                --right;
                }

                if(left != right)
                {
                    array[left] = array[right];
                    left++;
                }
                while((array[left]>= pivot) & (left>right))
                {
                    left++;
                }

                if(left!=right)
                {
                    array[right] = array[left];
                    right--;
                }
            }

            array[left] = pivot;
            pivot = left;

            if(left<pivot)
            {
                QuickSort(left, pivot);
            }

            if(right>pivot)
            {
                QuickSort(pivot+1, right);
            }
        }
    }
}

Здесь немного яснее, что мы действительно хотим не называть stati c QuickSortAlgorithm.QuickSort(0, qSort.len - 1);, а скорее метод в экземпляре по qSort.QuickSort(0, qSort.len - 1);

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