W jaki sposób napisać ten program?

0

Witam!
Chcę napisać taki program:

  1. Wczytuję z pliku tekstowego około 10000 linijek (około 30 znaków jedna linijka).
  2. Wczytane linijki są wrzucone do tabeli. W pierwszej kolumnie jest kolejno 10000 wczytanych linijek, a w drugiej kolumnie jest licznik z wartością domyślną 0.
  3. W textbox wpisuję jakąś wartość, np. 351 i po wciśnięciu przycisku pierwsze 351 linijek zostaje zapisane do pliku, a licznik przy tych linijkach zwiększa się o 1.

*Wciskając przycisk program omija te linijki, których licznik jest większy od 100.
**Po 24 godzinach od zwiększenia licznika przy danej linijce jest on zmniejszany o 1.

Program będzie włączony na vps 24 godziny na dobę.

Chciałbym to napisać w c#. Czy powinienem do tego użyć mysql, czy zwykły grid? Taki sobie program wyznaczyłem, jednak chciałbym go zacząć możliwie jak najlepiej, więc kieruję pytanie do was.

0

To może wyglądać mniej więcej tak:

using System;
using System.Text;
using System.Linq;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Drawing;
using System.IO;

class Lines
{
    public static void SaveRandom(string path, int numberOfLines, int lineLength)
    {
        using (var file = new FileStream(path, FileMode.Create))
        {
            using(var stream = new StreamWriter(file))
            {
                var rnd = new Random();
                for (int i = 0; i < numberOfLines; i++)
                {
                    var line = "";
                    for (int j = 0; j < lineLength; j++)
                    {
                        line = line + (char)rnd.Next(97, 123);
                    }
                    stream.WriteLine(line);
                }
            }
        }
    }

    public static void SaveSpecified(string outPath, int numberOfLinesToSave, List<Row> container)
    {
        using (var file = new FileStream(outPath, FileMode.Create))
        {
            using (var stream = new StreamWriter(file))
            {
                for(int i = 0; i < numberOfLinesToSave; i++)
                {
                    if (container[i].Count <= 100)
                    {
                        stream.WriteLine(container[i].Text);
                        container[i].Count += 1;
                    }
                }
            }
        }
    }

    public static List<Row> LoadData(string path)
    {
        var result = new List<Row>();
        var lines = File.ReadAllLines(path);
        for (int i = 0; i < lines.Length; i++)
        {
            result.Add(new Row
            {
                Text = lines[i],
                Count = 0
            });
        }
        return result;
    }
}

class Row
{
    public string Text { get; set; }
    public int Count { get; set; }
}

class Program {
    public static void Main(string[] args) {
        string path = "test.txt";
        Lines.SaveRandom(path, 1000, 30);

        var form = new Form();
        var grid = new DataGridView();
        grid.Dock = DockStyle.Fill;
        grid.DataSource = Lines.LoadData(path);
        
        var textbox = new TextBox();
        textbox.Dock = DockStyle.Fill;

        var button = new Button();
        button.Text = "Save";
        button.Dock = DockStyle.Fill;
        button.Click += (sender, e) =>
        {
            var output = "output.txt";
            var count = 0;
            if (Int32.TryParse(textbox.Text, out count))
            {
                Lines.SaveSpecified(output, count, grid.DataSource as List<Row>);
                grid.Refresh();
            }
        };

        var panel = new TableLayoutPanel();
        panel.Dock = DockStyle.Fill;
        panel.Controls.Add(textbox);
        panel.Controls.Add(button);
        panel.Controls.Add(grid);

        form.Controls.Add(panel);
        form.ShowDialog();
    }
}

Wybaczcie jakość kodu ale już trochę zmęczony jestem. Timera z odliczaniem godzin napisz sobie już sam :)

0

Dzięki Grzesiek za dobrą robotę :) Postaram się przeanalizować Twój kod.

Spróbowałem i udało mi się napisać po swojemu. Tak wygląda cały kod:

using System;
using System.Windows.Forms;
using System.IO;

namespace test
{
public partial class Form1 : Form
{
    int lines = 0;
    int active = 0;

    public Form1()
    {

        InitializeComponent();
        textBox1.Select();
        string line;
        int i = 0;


        //wczytanie linii do grid
        System.IO.StreamReader file =
            new System.IO.StreamReader(@"c:\users\PC\Desktop\test2.txt");
        while ((line = file.ReadLine()) != null)
        {

            dataGridView1.Rows.Add(line);
            this.dataGridView1.Rows[i].Cells[1].Value = "100";
            i++;
            lines += 100;
            active++;

        }
        label2.Text = lines.ToString();
        label4.Text = active.ToString();

        file.Close();



    }


    //sprawdzenie, czy licznik nie jest wiekszy niz 100
    bool sprawdz(int n)
    {

        if (n <= 0)
        {

            return false;


        }
        else
        {

            return true;

        }



    }


    private void button1_Click(object sender, EventArgs e)
    {


        int ile = Int32.Parse(textBox1.Text);

        if (ile <= active)
        {

            TextWriter sw = new StreamWriter(@"c:\users\PC\Desktop\wynik.txt");


            for (int i = 0; i < ile; i++)
            {
                //jeśli licznik jest mniejszy niż 100
                if (sprawdz(Convert.ToInt32(dataGridView1.Rows[i].Cells[1].Value.ToString())) == true)
                {
                    //zwiększ licznik o 1
                    int x = Convert.ToInt32(dataGridView1.Rows[i].Cells[1].Value.ToString());
                    x--;
                    dataGridView1.Rows[i].Cells[1].Value = x;       //zmien wartość licznika
                    sw.WriteLine(dataGridView1.Rows[i].Cells[0].Value.ToString());  //wypisz linijki do pliku
                    lines--;
                    label2.Text = lines.ToString();


                    //jeśli licznik spadnie do 0, to zmniejsze active
                    if (dataGridView1.Rows[i].Cells[1].Value.ToString() == "0")
                    {
                        active--;
                        label4.Text = active.ToString();


                    }


                }
                else        //jeśli licznik jest większy niż 100, sprawdź kolejną linijkę
                {

                    ile++;

                }

            }
            sw.Close();


        }
        textBox1.Text = "";
        textBox1.Select();

    }



}
}

 

Możecie go ocenić, co mógłbym poprawić? Uczę się dopiero programowania dosyć krótko, wiec domyslam sie ze i tak mizernie to wyszło :)

1

Na pewno to:

    //sprawdzenie, czy licznik nie jest wiekszy niz 100
    bool sprawdz(int n)
    {
 
        if (n <= 0)
        {
 
            return false;
 
 
        }
        else
        {
 
            return true;
 
        }
 
 
 
    }

zamienić na to:

bool sprawdz(int n)
{
    return n > 0;
}

Poza tym nie wiem w jaki sposób ta metoda ma sprawdzać, czy licznik jest większy od 100, skoro jej argument porównujesz do 0; Obstawiam, że to przypadkowy błąd.

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