我需要以下程式的幫助:
我想做的是根據銷售團隊的銷售額(AntalS?ldartiklar)對他們進行排序。串列中的第一個是銷量最少的,最后是銷量最高的。其余的介于兩者之間。是的,我需要使用 Bubblesort。一路上遇到了一些問題,但我想我已經解決了所有這些問題。我現在的問題是該程式根本不排序任何東西。請解釋我如何修復它,就像我是個小孩子一樣。在編程方面,我是一個完全的新手
using System;
using System.IO;
namespace Inl?mingsuppgift2ConsoleApplication
{
class Program
{
struct S?ljare : IComparable<S?ljare>
{
public String Namn;
public String Personnummer;
public String Distrikt;
public int AntalS?ldaArtiklar;
public int CompareTo(S?ljare other)
{
return AntalS?ldaArtiklar - other.AntalS?ldaArtiklar;
}
}
[STAThread]
static void Main(string[] args)
{
System.Console.Write("Hur m?nga s?ljare vill du registrera?:");
string antalS?ljare = System.Console.ReadLine();
System.Console.WriteLine("Registrera s?ljare:");
int Antals?ljare = int.Parse(antalS?ljare);
S?ljare[] s?ljare = new S?ljare[Antals?ljare];
int niv?1 = 0;
int niv?2 = 0;
int niv?3 = 0;
int niv?4 = 0;
void BubbleSort(S?ljare[] list) where S?ljare : IComparable<S?ljare>
{
for (int i = 0; i < list.Length - 1; i )
{
for (int j = 1; j < list.Length - 1 - i; j )
{
if (list[j].CompareTo(list[j - 1]) < 0)
{
S?ljare tmp = list[j 1];
list[j 1] = list[j];
list[j] = tmp;
}
}
}
}
for (int i = 0; i < Antals?ljare; i )
{
System.Console.Write(" Ange Namn: ");
s?ljare[i].Namn = System.Console.ReadLine();
System.Console.Write(" Ange Personnummer: ");
s?ljare[i].Personnummer = System.Console.ReadLine();
System.Console.Write(" Ange Distrikt: ");
s?ljare[i].Distrikt = System.Console.ReadLine();
System.Console.Write(" Ange antal Artiklar: ");
s?ljare[i].AntalS?ldaArtiklar = int.Parse(System.Console.ReadLine());
Console.WriteLine("\n");
}
for (int j = 0; j < Antals?ljare; j )
{
if (s?ljare[j].AntalS?ldaArtiklar < 50)
{
niv?1 ;
}
else if (s?ljare[j].AntalS?ldaArtiklar >= 50 && s?ljare[j].AntalS?ldaArtiklar < 100)
{
niv?2 ;
}
else if (s?ljare[j].AntalS?ldaArtiklar >= 100 && s?ljare[j].AntalS?ldaArtiklar < 200)
{
niv?3 ;
}
else if (s?ljare[j].AntalS?ldaArtiklar > 200)
{
niv?4 ;
}
}
BubbleSort(s?ljare);
try
{
StreamWriter sw = new StreamWriter("F:\\Test.txt");
for (int i = 0; i < s?ljare.Length; i )
{
Console.WriteLine("\n");
Console.WriteLine("Namn: " s?ljare[i].Namn);
Console.WriteLine("Personnummer: " s?ljare[i].Personnummer);
Console.WriteLine("Distrikt: " s?ljare[i].Distrikt);
Console.WriteLine("Antal s?lj: " s?ljare[i].AntalS?ldaArtiklar);
sw.WriteLine("\n");
sw.WriteLine("Namn: " s?ljare[i].Namn);
sw.WriteLine("Personnummer: " s?ljare[i].Personnummer);
sw.WriteLine("Distrikt: " s?ljare[i].Distrikt);
sw.WriteLine("Antal s?lj: " s?ljare[i].AntalS?ldaArtiklar);
sw.WriteLine("\n");
sw.WriteLine("-----------------------------");
sw.WriteLine("\n Antal S?ljare p? niv? 1: " niv?1);
sw.WriteLine("Antal S?ljare p? niv? 2: " niv?2);
sw.WriteLine("Antal S?ljare p? niv? 3: " niv?3);
sw.WriteLine("Antal S?ljare p? niv? 4: " niv?4);
sw.WriteLine("\n -----------------------------");
Console.WriteLine("\n");
Console.WriteLine("-----------------------------");
Console.WriteLine("\n Antal S?ljare p? niv? 1: " niv?1);
Console.WriteLine("Antal S?ljare p? niv? 2: " niv?2);
Console.WriteLine("Antal S?ljare p? niv? 3: " niv?3);
Console.WriteLine("Antal S?ljare p? niv? 4: " niv?4);
Console.WriteLine("\n -----------------------------");
sw.Flush();
}
}
catch (Exception e)
{
Console.WriteLine("Exception: " e.Message);
}
finally
{
Console.WriteLine("Executing finally block.");
}
}
}
}
uj5u.com熱心網友回復:
您的排序演算法比較“當前與上一個”,然后交換“當前與下一個”——這是不一致的。如果你有一個 { 3, 1, 2 } 陣列,并且“current”是 1(中間那個),你就不能比較 1 和 3(上一個),然后用它作為基礎來決定 1 和 2(下一個)應該交換
if (list[j].CompareTo(list[j - 1]) < 0) //if "current" less than "previous"
{
S?ljare tmp = list[j 1]; //remember next
list[j 1] = list[j]; //swap current into next
list[j] = tmp; //set current from memory
}
真的,你想要做“當前與下一個”,也許“交換當前和下一個”。因為我們正在比較當前和下一個,并且我們想要一個從最小的開始排序的串列,如果當前大于下一個,我們想要執行交換。
for (int i = 0; i < list.Length - 1; i )
{
for (int j = 0; j < list.Length - 1 - i; j )
{
if (list[j].CompareTo(list[j 1]) > 0)
{
S?ljare tmp = list[j 1];
list[j 1] = list[j];
list[j] = tmp;
}
}
}
請注意,我們更改了j回圈的起點。j從當前的 0 開始,然后繼續到“小于(長度 - 1)”,這實際上意味著在 10 個元素的陣列中j將從 0 運行到 8,因為它運行到“小于一小于-長度”。這意味著它是安全的,j 1因為它不會掉出陣列
暫時保持 10 大小的陣列,該i值一直在增加。wheni是1,j只從0到7運行。我們不需要一直運行到8,因為我們不需要檢查它。冒泡排序一路攜帶最小的項,第一次把它dump到slot 9(陣列的末尾),所以我們知道9已經是最小的項了;我們不再需要交換它。現在忘記它是一種優化..所以我們讓回圈從 0 運行到 7,這意味著幾乎最小的專案將一直被帶到插槽 8 并在那里傾倒。重復直到陣列排序
如果你想以另一種方式排序,首先是最大的,你會“如果當前專案小于下一個專案,則交換元素”
只使用整數玩一下:https : //dotnetfiddle.net/ldwOMV
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/362767.html
