Очно-дистанційні курси інформатиків

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Очно-дистанційні курси інформатиків » Консультації » Науковий керівник


Науковий керівник

Сообщений 1 страница 30 из 79

1

Для Кухара Андрія Володимировича

0

2

Як зробити програму, яку можна запустити на мобілці, смартфоні тощо?

0

3

Для того, щоб створити програму для смартфона чи кишенькового комп'ютера під керуванням Windows CE:

1. Створіть відповідний проект File -> New -> Project... Наприклад, Visual C# -> Smart Device -> Pocket PC 2003 -> Device Application.

2. Помістіть в проект вихідні тексти програми.

3. Відкомпілюйте для того, щоб програма була прив'язана до відповідної бібліотеки .NET.

4. Запустіть. В результаті запуститься програма-емулятор (імітатор) кишенькового комп'ютера, де ви зможете побачити виконання програми.

Не впевнений, що ці засоби розробки присутні в VS C# EE.

Для того, щоб запустити програму на реальному пристрої:

1. Встановіть на пристрій відповідну бібліотеку .NET Compact Framework. Існує дві версії .NET CF 1.0 та 2.0. .NET CF -- це зменшена версія .NET Framework. Вона містить лише підмножину класів та методів .NET Framework. Відповідно ваша програма має користуватися лише цими класами та методами, щоб успішно відкомпілюватися. В MSDN для кожного класа та метода вказано, чи підтримується він в .NET CF та в якій версії.

2. Скопіюйте .exe файл на реальний пристрій та запустіть його. Наявність специфічного інсталятора не обов'язкова, так як і для ПК.

Звичайні мобільні телефони як правило не керуються Windows CE. Але вони як правило містять Java машину. Використовуйте компілятор Java, що створювати програми, які запускаються майже на всіх звичайних мобільних телефонах.

0

4

Кухар Андрій написал(а):

Використовуйте компілятор Java, щоб створювати програми, які запускаються майже на всіх звичайних мобільних телефонах.

Думаю, що Java то наш другий проект

0

5

Потратив вечір, щоб зробити невеликий проект - програму для побудови графіка математичної функції, заданої рівнянням у полярних координатах. (Журнал "Квант" №9 за 1979 рік). Файл надсилаю електронною поштою.

...
double r(double fi) //функція, графік якої будуємо
{
return (double)numericUpDownA.Value*(Math.Cos(fi)+ Math.Sqrt(3+Math.Pow(Math.Cos(fi),2)))*Math.Pow(Math.Cos(3.5*fi),2)-(double)numericUpDownB.Value*Math.Pow(Math.Sin(60*fi),2);
}
   
void MainFormPaint(object sender, PaintEventArgs e) //обробник події для перемальовування форми
{
System.Drawing.Pen myPen = new System.Drawing.Pen(System.Drawing.Color.Green); //списав з прикладу
System.Drawing.Graphics formGraphics; //списав з прикладу
formGraphics = this.CreateGraphics(); //списав з прикладу
   
int xc,yc,x1,y1,x2,y2;

//вибираю точку - початок координат
xc=this.Size.Width/2;
yc=(this.Size.Height+numericUpDownA.Top+numericUpDownA.Size.Height)/3*2-50;

//початкова точка графіка
x1=0;
y1=(int)r(0);
   
double fi,rr;
for (fi=0; fi<=2*Math.PI; fi=fi+Math.PI/360) //основний цикл - малювання графіка
{
rr=r(fi);

//перетворення в декартові координати
x2=(int)(rr*Math.Sin(fi));
y2=(int)(rr*Math.Cos(fi));

formGraphics.DrawLine(myPen, xc+x1, yc-y1, xc+x2, yc-y2);
x1=x2;
y1=y2;
}

formGraphics.DrawLine(myPen, xc+x1, yc-y1, xc, yc-(int)r(0)); //останній штрих

myPen.Dispose();          //списав з прикладу
formGraphics.Dispose(); //списав з прикладу
}
   
void NumericUpDownAValueChanged(object sender, EventArgs e)
{
//примусове перемальовування форми при зміні параметрів
polar.MainForm.ActiveForm.Invalidate ();
}
...

Пропоную обговорити, що зроблено невдало.

Чи можна уникнути необхідності перед кожним викликом математичної функції писати Math?

0

6

Пилипчук О.П. написал(а):

Пропоную обговорити, що зроблено невдало.

Чи можна уникнути необхідності перед кожним викликом математичної функції писати Math?

Загалом непогано для початку.

Від необхідності писати Math позбавитися можна, але не треба. Математичні функції є методами класу Math. Якщо їх писати просто як Sin, Cos, то створюється враження, що вони є методами поточного класу (в даному випадку класу MainForm), а це не так.

Зрозуміло, що написи Math.Sin роблять математичні вирази не зовсім схожими на їх математичний запис. Що можна зробити? Можна створити коротший псевдонім (alias) для класу Math написавши на початку програми

using m = System.Math;

Тоді замість Math.Sin можна буде писати m.Sin

Інший досить ексцентричний спосіб -- створити делегат (вказівник на метод) у власному класі, та присвоїти йому відповідний метод класу Math

        delegate double _cos(double x);
        _cos cos = Math.Cos;

Тоді можна викликати відповідний метод просто як cos(x), бо це є звернення до поля власного класу. Проте я не рекомендую користуватися таким способом.

Пилипчук О.П. написал(а):

System.Drawing.Pen myPen = new System.Drawing.Pen(System.Drawing.Color.Green); //списав з прикладу
System.Drawing.Graphics formGraphics; //списав з прикладу
formGraphics = this.CreateGraphics(); //списав з прикладу

Щоб весь час не писати System.Drawing, можна на початку програми написати

using System.Drawing;

Тоді можна буде просто писати "Pen", "Graphics".

У даному випадку немає необхідності створювати об'єкт Graphics для того, щоб малювати на формі. Форма створює його сама і передає його в другому параметрі "e". Відповідно можна просто написати

Graphics formGraphics = e.Graphics;

Знищувати його після малювання не потрібно ("formGraphics.Dispose(); //списав з прикладу").

Пилипчук О.П. написал(а):

polar.MainForm.ActiveForm.Invalidate ();

"polar" писати непотрібно, бо клас MainForm і так мабуть знаходиться в просторі polar.

Форма має свій власний метод Invalidate. Немає необхідності звертатися до нього таким складним чином. Можна просто написати

Invalidate();

І що стосується загальної структури програми... Для простої навчальної програми непогано. Але в практичній програмі непогано було б виділити малювання графіка в окремий клас, нащадок Control -- елемента керування. Бо недобре є те, що позиція графіка обчислюється відносно полів вводу параметрів. Створивши свій клас на зразок

class myGraphic : Control
{
    public double A, B;

    private double r(double fi);

    protected override OnPaint(...);
}

ми отримаємо незалежну компоненту, яку можна буде просто мишою покласти на форму та керувати нею, присвоюючи значення в поля A, B, та викликаючи Invalidate()

0

7

З врахуванням вище сказаного програма виглядатиме так:
(*.Designer.cs файли з автоматично згенерованими візуальним конструктором текстами не наведені.
Форма MainForm містить два поля вводу numericUpDownA, numericUpDownB та графік myGraphic1.)

[файл MainForm.cs]

using System;
using System.Windows.Forms;

namespace polar
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        void NumericUpDownValueChanged(object sender, EventArgs e)
        {
            myGraphic1.A = (double)numericUpDownA.Value;
            myGraphic1.B = (double)numericUpDownB.Value;
            myGraphic1.Invalidate();
        }
    }
}

[файл myGraphic.cs]

using System;
using System.Drawing;
using System.Windows.Forms;
using m = System.Math;

namespace polar
{
    public partial class myGraphic : UserControl
    {
        public myGraphic()
        {
            InitializeComponent();
        }

        public double A, B;

        double r(double fi) //функція, графік якої будуємо
        {
            return A * (m.Cos(fi) + m.Sqrt(3 + m.Pow(m.Cos(fi), 2)))
                * m.Pow(m.Cos(3.5 * fi), 2) - B * m.Pow(m.Sin(60 * fi), 2);
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            Pen myPen = new Pen(Color.Green);
            Graphics G = e.Graphics;

            int xc, yc, x1, y1, x2, y2;

            //вибираю точку - початок координат
            xc = Width / 2;
            yc = Height / 2;

            //початкова точка графіка
            x1 = 0;
            y1 = (int)r(0);

            double fi, rr;
            for (fi = 0; fi <= 2 * m.PI; fi = fi + m.PI / 360) //основний цикл - малювання графіка
            {
                rr = r(fi);

                //перетворення в декартові координати
                x2 = (int)(rr * m.Sin(fi));
                y2 = (int)(rr * m.Cos(fi));

                G.DrawLine(myPen, xc + x1, yc - y1, xc + x2, yc - y2);
                x1 = x2;
                y1 = y2;
            }

            G.DrawLine(myPen, xc + x1, yc - y1, xc, yc - (int)r(0)); //останній штрих

            myPen.Dispose();
        }
    }
}

0

8

Як правильно дізнаватися, який з об'єктів звертається до обробника події, якщо я хочу використовувати його спільно? Наприклад, у моєму проекті з кольоровими кнопками, щоб для всіх кнопок був один обробник, а деталі варіювалися в ньому, залежно від кнопки (switch...)

0

9

Кухар Андрій написал(а):

І що стосується загальної структури програми... Для простої навчальної програми непогано. Але в практичній програмі непогано було б виділити малювання графіка в окремий клас, нащадок Control -- елемента керування. Бо недобре є те, що позиція графіка обчислюється відносно полів вводу параметрів. Створивши свій клас ...

З цього треба було почати! Це ж той бар'єр, через який треба перелізти, щоб потрапити з процедурного в об'єктне пограмування. Потрібно включити у посібник хоча б стислий опис ієрархії базових об'єктів, вказавши, що від яких можна успадкувати, навести прості приклади.

0

10

Пилипчук О.П. написал(а):

Як правильно дізнаватися, який з об'єктів звертається до обробника події, якщо я хочу використовувати його спільно? Наприклад, у моєму проекті з кольоровими кнопками, щоб для всіх кнопок був один обробник, а деталі варіювалися в ньому, залежно від кнопки (switch...)

Обробники подій як правило отримують параметр sender типу object, який є вказівником на об'єкт, що згенерував подію.
Такий параметр не обов'язково повинен бути у обробника подій, але в бібліотеці .NET так прийнято.

Таким чином можна звернутися до об'єкта-генератора події, виконавши відповідне перетворення типу.

Наприклад обробник подій від NumericUpDown в попередній програмі можна написати "оптимальніше" (увага! слово в лапках).

        void NumericUpDownValueChanged(object sender, EventArgs e)
        {
            if (sender == numericUpDownA)
                myGraphic1.A = (double)(sender as NumericUpDown).Value;
            else if (sender == numericUpDownB)
                myGraphic1.B = (double)(sender as NumericUpDown).Value;

            myGraphic1.Invalidate();
        }

Або ще "безпечно":

        void NumericUpDownValueChanged(object sender, EventArgs e)
        {
            if (sender is NumericUpDown)
            {
                if (sender == numericUpDownA)
                    myGraphic1.A = (double)(sender as NumericUpDown).Value;
                else if (sender == numericUpDownB)
                    myGraphic1.B = (double)(sender as NumericUpDown).Value;
            }

            myGraphic1.Invalidate();
        }

0

11

Як запрограмувати кнопку, клацання по якій зробить вихід із програми?

0

12

Rebryna V написал(а):

Як запрограмувати кнопку, клацання по якій зробить вихід із програми?

У мене вийшло підозріло :) просто:

    void Button1Click(object sender, EventArgs e)
    {
    Application.Exit();
    }

0

13

Кухар Андрій написал(а):

З врахуванням вище сказаного програма виглядатиме так:
(*.Designer.cs файли з автоматично згенерованими візуальним конструктором текстами не наведені.
Форма MainForm містить два поля вводу numericUpDownA, numericUpDownB та графік myGraphic1.)

Не можу запустити програму в такому вигляді. Очевидно, щось роблю не так.
Що за чим потрібно робити, щоб запутити проект, маючи ці два файли?

0

14

Rebryna V написал(а):

Як запрограмувати кнопку, клацання по якій зробить вихід із програми?

Пилипчук О.П. написал(а):

У мене вийшло підозріло  просто:

    void Button1Click(object sender, EventArgs e)
    {
    Application.Exit();
    }

Звичайно з програми виходять шляхом закриття головного вікна (того, що було передане під час виклику Application.Run(Form)). При закритті цього вікна робота Application.Run(Form) завершується, що призводить до завершення програми (типової). Це загальноприйнятий спосіб.

Для закриття головного вікна достатньо викликати його метод Close().  Якщо вище наведений обробник події є методом головного вікна, то він може виглядати так:

void Button1Click(object sender, EventArgs e)
{
    Close();
}

Application.Exit() в принципі коректний спосіб для .NET Framework 2.0 (не зовсім коректний для попередніх версій, так як не викликав у відкритих вікон подій Closing та Close перед завершенням програми). Але можна сказати, що такий виклик дещо порушує структуру програми. Загалом за вихід з програми повинна відповідати головна форма, і ще хтось десь, невідомо де, не повинен завершувати програму напряму, бо це може порушити зрозумілість програми та можливість повторного використання коду. Application.Exit() слід приберегти для спеціальних випадків.

0

15

Пропоную обговорити ще одне моє "творіння". Писав без візуального середовища (PSPad з підключеним компілятором). Підглядав у програму для прямокутного трикутника і довідку від MS. EXE-файл не розсилаю: скомпілюйте і отримаєте ;)

Звичайно, в першу чергу цікавлять недоліки, як дрібні, так і концептуальні. Можна використати, як проект, що розробляється протягом кількох уроків, в міру вивчення матеріалу. Звичайно, за потреби можна розширити можливості.

using System;
using System.Drawing;
using System.Windows.Forms;

namespace keytren
{
    class main
    {
        static Form F;
        static Timer T;
        static Label L;
        static Button[] B;
        static int n=2,t=0,clicks=0,interval=29;

        static void Main()
        {
           
            F = new Form();
            F.Text = "Тренажер";
            F.FormBorderStyle=FormBorderStyle.Fixed3D;
            F.StartPosition=FormStartPosition.CenterScreen;
           
            T=new Timer();
            T.Tick += new EventHandler(T_Timer);
            T.Interval=1000;

            L = new Label();
            L.Text = "Клацніть червону кнопку";
            L.AutoSize = false;
            L.Left = 0;
            L.Top = 10;
            L.Parent = F;
            L.Size=new Size(F.Size.Width,20);
            L.TextAlign=ContentAlignment.MiddleCenter;

            B = new Button[5];
            for (int j=0; j<5; j++)
                B[j] = new Button();
           
            for (int i=0; i<5; i++) {
                B[i].Text = "";
                B[i].AutoSize = true;
                B[i].Top = 40+40*i;
                B[i].Left = (F.Width - B[i].Width) / 2;
                B[i].Parent = F;
                }
            B[n].BackColor = Color.Red;
           
            for (int i=0; i<5; i++)
                B[i].Click += new EventHandler(B_Click);
               
            Application.Run(F);
        }

        static void B_Click(object sender, EventArgs e)
        {
                if (t==0) T.Start();
                if (((sender as Button).BackColor==Color.Red)&&T.Enabled)
                {
                    clicks++;
                   
                    int ki=n;
               
                    for (Random k=new Random();ki==n;ki=(int)(5*k.NextDouble()));
               
                    B[n].BackColor = SystemColors.Control;
                    n=ki;
                    B[n].BackColor = Color.Red;
                }
        }
        static void T_Timer (object sender, EventArgs e)
        {
            L.Text=(t++).ToString();
            if (t==interval) {
                T.Stop();
                L.Text="Всього наклацано: "+clicks.ToString()+" за "+interval+" секунд";
            }
        }
    }
}

Взагалі, мені сподобалося писати без візуального конструювання. Може помістити його в самому кінці посібника, як додатковий матеріал? Але ж є (?) прив'язка до середовища...

Який проект слід створювати на початку роботи, щоб набрати і запустити цю програму у MS VC#?

Кухар Андрій написал(а):

Для того, щоб не відкривалося вікно консолі додайте параметр /target:winexe в командну стрічку компілятора csc.

0

16

Пилипчук О.П. написал(а):

Звичайно, в першу чергу цікавлять недоліки, як дрібні, так і концептуальні.

Дрібні зауваження є, але дуже дрібні.

Замість такої складної конструкції (int)(5*k.NextDouble()) є метод int Next(int) для генерації цілих випадкових чисел.

З концептуальних зауважень є одне. Прямолінійна програма, що маніпулює полями стандартних об'єктів -- це не найкращий стиль. Хоч і цілком придатний для таких невеличких програм. Концептуально краще користуватися об'єктно-оріентованою декомпозицією. Створювати спеціалізовані класи (все одно, що створювати процедури).

Наприклад можна створити клас для ігрової кнопки, інкапсулюючи в нього функціональність, специфічну для такого виду кнопки.

    class PlayButton : Button
    {
        public Color MarkColor = Color.Red;
        private Color BackColorSave;
        private bool Marked = false;

        public PlayButton()
        {
            BackColorSave = BackColor;
            Text = "";
            AutoSize = true;
        }

        public void Mark()
        {
            Marked = true;
            BackColor = MarkColor;
        }

        public void Unmark()
        {
            Marked = false;
            BackColor = BackColorSave;
        }

        public bool IsMarked()
        {
            return Marked;
        }
    }

Це дозволить дещо спростити основну програму, та значно підвищити її зрозумілість. До того ж це спростить майбутнє нарощування функціональності цієї кнопки. Вона буде зосереджена в спеціальному класі, а не розпорошена по всій програмі.

Пилипчук О.П. написал(а):

Взагалі, мені сподобалося писати без візуального конструювання. Може помістити його в самому кінці посібника, як додатковий матеріал? Але ж є (?) прив'язка до середовища...

Який проект слід створювати на початку роботи, щоб набрати і запустити цю програму у MS VC#?

Прив'язки до середовища немає.

Для того, щоб створити відповідний проект в MSVC# можна:

1. Створити новий пустий проект C#
2. Додати до нього файл з цим текстом програми
3. Додати в References проекта модулі System, System.Drawing, System.Windows.Forms
4. У властивостях проекта встановити Output type: Windows application

Це все. Можна запускати.

0

17

І ще. Я набрав 52 :)

0

18

Кухар Андрій написал(а):

Замість такої складної конструкції (int)(5*k.NextDouble()) є метод int Next(int) для генерації цілих випадкових чисел.

Про випадкові числа чомусь не згадано у програмі... Чи вони "інкапсульовані"  в якусь із наявних тем? Якщо ні, то треба включити десь ближче до початку курсу. Це дозволить урізноманітнити виклад ігровими елементами. Та й для генерування файлів-тестів штука потрібна.

Кухар Андрій написал(а):

Прямолінійна програма, що маніпулює полями стандартних об'єктів -- це не найкращий стиль... Концептуально краще користуватися об'єктно-оріентованою декомпозицією. Створювати спеціалізовані класи

От я і намагаюсь навчитись. Але трохи ліниво :) Принаймні, заглядаючи в книги тільки якщо зовсім "заклинить". Хоча, можу похвалитись, що до цієї штуки:

for (int j=0; j<5; j++)
    B[j] = new Button();

додумався сам після того, як програма кілька разів "не пішла". Вирішив, що елементи масиву - вказівники на об'єкти і треба їх визначити.

Кухар Андрій написал(а):

І ще. Я набрав 52 :)

Я теж щойно спробував. Набрав 38... Видно, не у формі: все-таки майже пів-четвертої ночі.

0

19

Читаю Шилдта. Оскільки багато хто з нас вивчає мову саме за його
книгою, то відшукавши помилки у нього можна зменшити кількість помилок
у нашому майбутньому посібнику :-). Хоч надіюсь, що до прямого
плагіату справа не дійде.

У параграфі "Другие типы данных" є програма:

using System;
class Ехашр1еЗ {
public static void Main() {
int ivar; // Объявляем переменную типа int.
double dvar; // Объявляем переменную типа double.
ivar =100; // Присваиваем переменной ivar
           // значение 100.
dvar = 100.0; // Присваиваем переменной dvar
       // значение 100.0.
Console.WriteLine("Исходное значение переменной ivar: " + ivar);
Console.WriteLine("Исходное значение переменной dvar: " + dvar);
Console.WriteLine(); // Выводим пустую строку.
                     // Теперь делим оба значения на 3.
ivar = ivar / 3;
dvar = dvar / 3.0;
Console.WriteLine("ivar после деления: " + ivar);
Console.WriteLine("dvar после деления: " + dvar);
}
}

А далі написано:

>Итак, если нужно определить в программе значение с плавающей точкой, необхо-
>димо включить в его представление десятичную точку. Если этого не сделать, оно бу-
>дет интерпретироваться как целое число. Например, в С# число 100 рассматривается
>как целое, а число 100.0 — как значение с плавающей точкой.

Але якщо внести у програму такі зміни:

...
dvar = 100;
...
dvar = dvar / 3;
...

вона продовжує прапцювати правильно. А це означає, що для визначення
числа з плаваючою крапкою НЕ ОБОВ'ЯЗКОВО включати в його подання
десяткову крапку. А от коли це робити обов'язково?

0

20

Пилипчук О.П. написал(а):

А це означає, що для визначення
числа з плаваючою крапкою НЕ ОБОВ'ЯЗКОВО включати в його подання
десяткову крапку.

Виходить, що не треба. Я також читав даний приклад, але не перевіряв так глибоко.

Я написав сьогодні розв"язок третьої задачі на sbs.km.ua (турнір "Леонардо поруч"). Не знаю наскільки оптимально працюю з текстовими файлами. Що може сказати п.Андрій?
using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
namespace Sidewalk
{
    class Program
    {
        static void Main(string[] args)
        {
            FileStream fi = new FileStream("sidewalk.dat", FileMode.Open);
            StreamReader fin = new StreamReader(fi);
            FileStream fo = new FileStream("sidewalk.sol", FileMode.Create);
            StreamWriter fout = new StreamWriter(fo);
            Int64[] fib=new Int64[51];
            fib[1] = 1;fib[2] = 2;
            for(int i=3; i<51; i++)
                fib[i] = fib[i-1] + fib[i-2];
            int n=int.Parse(fin.ReadLine());
            while (n != 0)
            {
                fout.WriteLine(fib[n]);
                n = int.Parse(fin.ReadLine());
            }
            fin.Close();
            fout.Close();
        }
    }
}

0

21

Ще одне. Хотілося б знати чи є можливість працювати з довгими числами у С#? BigInteger тут не проходить?

0

22

Пилипчук О.П. написал(а):

>Итак, если нужно определить в программе значение с плавающей точкой, необхо-
>димо включить в его представление десятичную точку. Если этого не сделать, оно бу-
>дет интерпретироваться как целое число. Например, в С# число 100 рассматривается
>как целое, а число 100.0 — как значение с плавающей точкой.

Це досить невдале пояснення наступного:

Звичайно змінна має тип, вказаний в її описі, і тип її значення не може змінитися шляхом присвоювання. Будь-яке присвоюване значення буде перетворене, приведене до типу змінної (якщо це можливо, інакше виникне помилка)

Літерали теж мають свій тип. 100 -- integer, 100.0 -- double.

Звичайно присвоювання double x = 100 та double x = 100.0 не відрізняються наслідками. В обох випадках змінна буде містити число типу double значення 100. В першому випадку литерал 100 типу integer буде автоматично приведено до типу double. При чому не обов'язково при виконанні програми, а можливо ще під час компіляції. Таким чином присвоювання літералу відповідного типу не завжди є навіть оптимізацією.

Проте в деяких випадках різниця між integer та double літералами може грати роль. Наприклад
5 / 2 == 2
5 / 2.0 == 2.5

Результатом ділення двох цілих чисел є ціле число (цілочисельне ділення). Тому в C/C++/C# немає спеціального оператора аналогічного div в Паскалі.

Якщо один з аргументів оператора є дробовим числом, то інший аргумент теж буде приведений до дробового типу. Результатом ділення двох дробових чисел є дробове число. Тому типом результату в першому виразі буде integer, а в другому double.

double a = 5, b = 2;
double r = a / b; // в результаті r = 2.5

double r = 5 / 2; // в результаті r = 2.0

Маю надію, що тепер зрозуміло чому саме так.

0

23

Vitaly написал(а):

Я написав сьогодні розв"язок третьої задачі на sbs.km.ua (турнір "Леонардо поруч"). Не знаю наскільки оптимально працюю з текстовими файлами. Що може сказати п.Андрій?

Ну загалом нормально.

Об'єкти StreamReader та StreamWriter можна створювати без проміжного об'єкта FileStream.

StreamReader fin = new StreamReader("sidewalk.dat");
StreamWriter fout = new StreamWriter("sidewalk.sol");

Якщо хочеться копнути глибше, то можна подивитися на використання try/catch/finaly та using для того, щоб гарантувати закриття файлу при виникненні якоїсь неочікуваної помилки. Правда це не є потрібним у випадку олімпіадних задач.

0

24

Vitaly написал(а):

Ще одне. Хотілося б знати чи є можливість працювати з довгими числами у С#? BigInteger тут не проходить?

Як я розумію, ви маєте на увазі, чи є якась стандартна бібліотека для роботи з довгими числами. Я не зустрічав. Мабуть немає. А що таке BigInteger?

0

25

Кухар Андрій написал(а):

Якщо хочеться копнути глибше, то можна подивитися на використання try/catch/finaly та using

Копав, дивився але зараз ні мені, ні нам для проекту цього не потрібно. За пораду по поводу StreamReader... дякую, в літературі цього не знайшов.

Кухар Андрій написал(а):

Як я розумію, ви маєте на увазі, чи є якась стандартна бібліотека для роботи з довгими числами. Я не зустрічав. Мабуть немає. А що таке BigInteger?

BigInteger це тип довгих чисел. Я зустрічав програми написані на Сі з використанням цього типу, але не знаю яке це було Сі. Знаю точно, що цей тип стандартний, оскільки розв"язки задач з використанням цього типу були з турнірів.

0

26

Андрей, как мы решили называть кучу? Не очень нравится этот термин.

0

27

Кухар Андрій написал(а):

Якщо хочеться копнути глибше, то можна подивитися на використання try/catch/finaly та using

Vitaly написал(а):

Копав, дивився але зараз ні мені, ні нам для проекту цього не потрібно.

У розділі 5 проекту програми написано: "Обробка виняткових ситуацій". Так що для проекту це потрібно.

Які з виняткових ситуацій варто вибрати для ілюстрації? Перше, що приходить в голову:
- ділення на нуль в математичному виразі (без введення з клавіатури);
- введення з клавіатури некоректних даних.

Можливо, третій випадок - читання з файлу. Причому дати цей приклад краще у розділі 10 "Робота з файлами".

Крім того, обговорення цих речей на форумі буде корисне в цілому для вивчення технології програмування на C#, а отже, й для написання більш якісного матеріалу.

0

28

Стукалова И.В. написал(а):

Андрей, как мы решили называть кучу?

Словники пропонують "купа". Дещо незвично для зіпсованого суржиком вуха, але точно передає зміст (англ. heap, рос. куча). Слова "куча" в українській мові, схоже, також є, але мені подобається менше.

0

29

Давай уж лучше хип называть, купа еще хуже, чем куча.

0

30

Стукалова И.В. написал(а):

Давай уж лучше хип называть, купа еще хуже, чем куча.

Що за асоціації?  :D Купа - нормальний термін

Отредактировано Vitaly (2007-07-09 22:11:30)

0


Вы здесь » Очно-дистанційні курси інформатиків » Консультації » Науковий керівник