Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > C# по Карли Ватсону


Автор: massimo2 8.8.2011, 00:18
Здравствуй, народ!
Совсем недавно я захотел попробовать заняться программированием
Перебрал кучу инфы, что к чему, с чего начинать, что изучать, как и т.д.
Ну выбрал в итоге C#. Вроде для новичков советуют. Читаю и изучаю книгу Карли Ватсона - C#
Может кто-то её изучал, или читает сейчас, прошу оставить отзывы. А также хотелось тут обсуждать упражнения которые там даются, т.к. ответов там нет. А самому сложновато разбираться. 
Вот не могу выполнить упражнение о множестве Мандельброта...(

Вот сам код 
Код

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

namespace Ch04Ex06
{
    class Program
    {
        static void Main(string[] args)
        {
            double realCoord, imagCoord;
            double realTemp, imagTemp, realTemp2, arg;
            int iterations;
            for (imagCoord=1.2;imagCoord>=-1.2;imagCoord-=0.05)
            {
                for (realCoord=-0.6;realCoord<=1.77;realCoord+=0.03)
                {
                    iterations=0;
                    realTemp=realCoord;
                    imagTemp=imagCoord;
                    arg=(realCoord*realCoord)+(imagCoord*imagCoord);
                    while ((arg<4)&&(iterations<40))
                    {
                        realTemp2=(realTemp*realTemp)-(imagTemp*imagTemp)-realCoord;
                        imagTemp=(2*realTemp*imagTemp)-imagCoord;
                        realTemp=realTemp2;
                        arg=(realTemp*realTemp)+(imagTemp*imagTemp);
                        iterations+=1;
                    }
                    switch(iterations%4)
                    {
                        case 0:
                            Console.Write(".");
                            break;
                        case 1:
                            Console.Write("0");
                            break;
                        case 2:
                            Console.Write("0");
                            break;
                        case 3:
                            Console.Write("8");
                            break;
                    }
                }
                Console.Write("\n");
            }

        }
    }
}

Надо изменить его таким образом, чтобы оно запршивало у пользователя границы рисунка и выводило выбранную часть рисунка. 

Автор: Экскалупатор 8.8.2011, 09:36
Цитата(massimo2 @  7.8.2011,  23:18 Найти цитируемый пост)
Может кто-то её изучал, или читает сейчас, прошу оставить отзывы.

ну
Цитата(massimo2 @  7.8.2011,  23:18 Найти цитируемый пост)
т.к. ответов там нет

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

код в посте это пример из книги?

Цитата(massimo2 @  7.8.2011,  23:18 Найти цитируемый пост)

Надо изменить его таким образом, чтобы оно запршивало у пользователя границы рисунка и выводило выбранную часть рисунка.  

а в чем вопрос? вот у меня вопрос есть, куда пользователь должен это все вводить(м.б. в  консоль?) и куда ему должна выводиться выбранная часть рисунка?

Автор: massimo2 8.8.2011, 12:37
Цитата
куда пользователь должен это все вводить(м.б. в  консоль?)


Код пишется либо в Notepad и сохраняется в расширении cs, а затем компилируется через командную строку, и потом можно запустить созданную программу и проверить.
Либо (если по книге) всё делаешь в Visual Studio

Цитата
и куда ему должна выводиться выбранная часть рисунка?

Ну а выводиться уже должна в консоли, т.к. работаем с консольными приложениями пока.

А насчёт книги, так вроде всё написано понятным языком, пока всё норм. Хотя я вообще ноль в программировании.

Автор: Экскалупатор 8.8.2011, 12:47
Цитата(massimo2 @  8.8.2011,  11:37 Найти цитируемый пост)
Код пишется либо в Notepad и сохраняется в расширении cs, а затем компилируется через командную строку, и потом можно запустить созданную программу и проверить.

при чем тут то куда пишется код? я спросил куда пользователь должен ввести значения? или ты хочешь их прямо в код вводить? и что значит "выводиться"? картинку(изображение) в консоль? или какие то координаты?

Цитата(massimo2 @  8.8.2011,  11:37 Найти цитируемый пост)
Хотя я вообще ноль в программировании. 


по моему личному мнению в таких случаях надо взять Си, там как то быстрее понимаются всякие нюансы мелкие, виднее что ли становиться...

Автор: massimo2 8.8.2011, 12:54
надо исправить код, что же ещё?!
а картинка состоит из символов, вот в чём дело.
вы бы запустили программу и проверили, сразу стало бы понятно

Автор: Экскалупатор 8.8.2011, 13:13
Цитата(massimo2 @  8.8.2011,  11:54 Найти цитируемый пост)
надо исправить код, что же ещё?!

 smile  smile  smile 

т.е. нужно будет каждый раз, когда пользователю вздумалось получить другой вариант, исправлять код?  smile 

с "картинкой" все понятно. для того что бы ввести значения есть http://msdn.microsoft.com/ru-ru/library/system.console.read.aspx?ppud=4/http://msdn.microsoft.com/ru-ru/library/system.console.readline.aspx

а дальше уже логика твоей программы должна решать какую часть выводить, так как картинка у тебя нигде не храниться и делается на лету, то тебе нужно будет подставить в циклы свои значения(полученные от пользователя) и пересчитать еще раз.

Автор: massimo2 8.8.2011, 13:20
да всё верно вы написали.
просто я вообще не могу въехать в этого мандельброта...

Автор: Экскалупатор 8.8.2011, 14:22
massimo2, я надеюсь, что вполне понятен тот факт что если я сделаю вместо тебя то ты скорее всего не научишься, что бы понять и разобраться надо сделать самостоятельно, задай конкретный вопрос, что именно не понятно, я попытаюсь объяснить.

Автор: massimo2 8.8.2011, 15:49
какие цифры должны быть в коде я вычислил, но как связать это с запрсом пользователя, не могу врубиться. Например будет выводиться: Какую часть рисунка показать(1 - верхняя, 2- нижняя, др. - весь рисунок). Допустим пользователь введет 1, и как сделать чтоб при вводе единицы менялась определённая переменная цикла for ?
 В принципе можно наделать ветвлений с помощью switch (каждый раз засовывая туда цикл for), но код будет очень уж объёмным! 


И всё же задание можно считать выполненным. Вот так выглядит код:
Код

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

namespace Ch04Ex06
{
    class Program
    {
        static void Main(string[] args)
        {
            double realCoord, imagCoord;
            double realTemp, imagTemp, realTemp2, arg;
            int iterations;
            int f1;
            for (imagCoord = 1.2; imagCoord >= -1.2; imagCoord -= 0.05)
            {
                for (realCoord = -0.6; realCoord <= 1.77; realCoord += 0.03)
                {
                    iterations = 0;
                    realTemp = realCoord;
                    imagTemp = imagCoord;
                    arg = (realCoord * realCoord) + (imagCoord * imagCoord);
                    while ((arg < 4) && (iterations < 40))
                    {
                        realTemp2 = (realTemp * realTemp) - (imagTemp * imagTemp) - realCoord;
                        imagTemp = (2 * realTemp * imagTemp) - imagCoord;
                        realTemp = realTemp2;
                        arg = (realTemp * realTemp) + (imagTemp * imagTemp);
                        iterations += 1;
                    }
                    switch (iterations % 4)
                    {
                        case 0:
                            Console.Write(".");
                            break;
                        case 1:
                            Console.Write("0");
                            break;
                        case 2:
                            Console.Write("0");
                            break;
                        case 3:
                            Console.Write("8");
                            break;
                    }
                } Console.Write("\n");
            }
            goth:    
            Console.WriteLine("Какую часть рисунка показать: 1 - нижняя половина, 2 - верхняя половина, 3 - верхняя правая четверть");
                f1 = Convert.ToInt32(Console.ReadLine());
                switch (f1)
                {
                    case 1:
                        for (imagCoord = 0.0; imagCoord >= -1.2; imagCoord -= 0.05)
                        {
                            for (realCoord = -0.6; realCoord <= 1.77; realCoord += 0.03)
                            {
                                iterations = 0;
                                realTemp = realCoord;
                                imagTemp = imagCoord;
                                arg = (realCoord * realCoord) + (imagCoord * imagCoord);
                                while ((arg < 4) && (iterations < 40))
                                {
                                    realTemp2 = (realTemp * realTemp) - (imagTemp * imagTemp) - realCoord;
                                    imagTemp = (2 * realTemp * imagTemp) - imagCoord;
                                    realTemp = realTemp2;
                                    arg = (realTemp * realTemp) + (imagTemp * imagTemp);
                                    iterations += 1;
                                }
                                switch (iterations % 4)
                                {
                                    case 0:
                                        Console.Write(".");
                                        break;
                                    case 1:
                                        Console.Write("0");
                                        break;
                                    case 2:
                                        Console.Write("0");
                                        break;
                                    case 3:
                                        Console.Write("8");
                                        break;
                                }
                            } Console.Write("\n");
                        }
                        break;

                    case 2:
                        for (imagCoord = 1.2; imagCoord >= 0.0; imagCoord -= 0.05)
                        {
                            for (realCoord = -0.6; realCoord <= 1.77; realCoord += 0.03)
                            {
                                iterations = 0;
                                realTemp = realCoord;
                                imagTemp = imagCoord;
                                arg = (realCoord * realCoord) + (imagCoord * imagCoord);
                                while ((arg < 4) && (iterations < 40))
                                {
                                    realTemp2 = (realTemp * realTemp) - (imagTemp * imagTemp) - realCoord;
                                    imagTemp = (2 * realTemp * imagTemp) - imagCoord;
                                    realTemp = realTemp2;
                                    arg = (realTemp * realTemp) + (imagTemp * imagTemp);
                                    iterations += 1;
                                }
                                switch (iterations % 4)
                                {
                                    case 0:
                                        Console.Write(".");
                                        break;
                                    case 1:
                                        Console.Write("0");
                                        break;
                                    case 2:
                                        Console.Write("0");
                                        break;
                                    case 3:
                                        Console.Write("8");
                                        break;
                                }
                            }
                            Console.Write("\n");
                        } break;
                    case 3:
                        for (imagCoord = 1.2; imagCoord >= 0.0; imagCoord -= 0.021)
                        {
                            for (realCoord = 0.6; realCoord <= 1.77; realCoord += 0.0150)
                            {
                                iterations = 0;
                                realTemp = realCoord;
                                imagTemp = imagCoord;
                                arg = (realCoord * realCoord) + (imagCoord * imagCoord);
                                while ((arg < 4) && (iterations < 40))
                                {
                                    realTemp2 = (realTemp * realTemp) - (imagTemp * imagTemp) - realCoord;
                                    imagTemp = (2 * realTemp * imagTemp) - imagCoord;
                                    realTemp = realTemp2;
                                    arg = (realTemp * realTemp) + (imagTemp * imagTemp);
                                    iterations += 1;
                                }
                                switch (iterations % 4)
                                {
                                    case 0:
                                        Console.Write(".");
                                        break;
                                    case 1:
                                        Console.Write("0");
                                        break;
                                    case 2:
                                        Console.Write("0");
                                        break;
                                    case 3:
                                        Console.Write("8");
                                        break;
                                }
                            }
                            Console.Write("\n");
                        }
                        break;
                }
            goto goth;
            }
        }
    }

Вначале выведется рисунок, а затем вы сможете выбрать какую часть рисунка вам показать.

Автор: Экскалупатор 8.8.2011, 17:10
у тебя написано:
Код

for (imagCoord=1.2;imagCoord>=-1.2;imagCoord-=0.05)


но ведь ты можешь написать
Код

        double i = 1.2;
for (imagCoord=i;imagCoord>=-1.2;imagCoord-=0.05)

а откуда ты возьмешь это i циклу все равно, прочитаешь из консоли или из файла или еще откуда, не имеет значения.
по поводу вывода, я не совсем въезжаю что должно получиться, но можно сделать один свитч, который будет решать че делать с тем что ввел пользователь, потом все логику рисования вынести в отдельный метод, в который в качестве параметров передавать значения, определяющие какую область нужно выводить.

Добавлено через 2 минуты и 32 секунды
не обновил страницу перед отправкой поста...
смотри как много у тебя повторяющихся блоков, вынеси все в отдельный метод и вызывай его в нужных местах. в параметрах передавай то чем блоки отличаются друг от друга

Добавлено через 4 минуты и 39 секунд
кстати, забываю спросить, а зачем тебе именно дробные значения в циклах?

Автор: massimo2 8.8.2011, 18:11
дело в том, что методы пока для меня ещё не изученная область.. вот.. 
насчёт "i" я думал, но ничего не придумал.
Так что пока только так. 
А дробные значения - это уже нюансы построения этого множества Мандельброта, так что я не знаю этого. 

Автор: Экскалупатор 8.8.2011, 18:49
ну даже если так:
Код

namespace Ch04Ex06
{
    class Program
    {
        static void Main(string[] args)
        {
            double realCoord = -0.6, imagCoord = 1.2;
            int f1;
            Program.DrawPicture(imagCoord, realCoord, 0.05, 0.03);
            while (true)
            {
                Console.WriteLine("Какую часть рисунка показать: 1 - нижняя половина, 2 - верхняя половина, 3 - верхняя правая четверть");
                f1 = Convert.ToInt32(Console.ReadLine());
                switch (f1)
                {
                    case 1:
                            DrawPicture(0.0, -0.6, 0.05, 0.03);
                            break;
                    case 2:
                            DrawPicture(1.2, -0.6, 0.05, 0.03);
                            break;
                    case 3:
                            DrawPicture(1.2, 0.6, 0.021, 0.0150);
                            break;
                }
            }
        }
        public static void DrawPicture(double _imagCoord, double _realCoord, double imagK, double realK)
        {
            for (double imagCoord = _imagCoord; imagCoord >= -1.2; imagCoord -= imagK)
            {
                for (double realCoord = _realCoord; realCoord <= 1.77; realCoord += realK)
                {
                    int iterations = 0;
                    double realTemp = realCoord;
                    double imagTemp = imagCoord;
                    double arg = (realCoord * realCoord) + (imagCoord * imagCoord);
                    while ((arg < 4) && (iterations < 40))
                    {
                        double realTemp2 = (realTemp * realTemp) - (imagTemp * imagTemp) - realCoord;
                        imagTemp = (2 * realTemp * imagTemp) - imagCoord;
                        realTemp = realTemp2;
                        arg = (realTemp * realTemp) + (imagTemp * imagTemp);
                        iterations += 1;
                    }
                    switch (iterations % 4)
                    {
                        case 0:
                            Console.Write(".");
                            break;
                        case 1:
                            Console.Write("0");
                            break;
                        case 2:
                            Console.Write("0");
                            break;
                        case 3:
                            Console.Write("8");
                            break;
                    }
                } Console.Write("\n");
            }
        }
    }
}

то уже в три раза меньше строк кода получается...

Цитата(massimo2 @  8.8.2011,  17:11 Найти цитируемый пост)
дело в том, что методы пока для меня ещё не изученная область

это нужно было выучить раньше всего, что такое класс и что такое метод, без этого дальше нельзя учить.

Автор: massimo2 8.8.2011, 19:07
значит у Ватсона своя метода изложения

Автор: Экскалупатор 8.8.2011, 21:43
Цитата(massimo2 @  8.8.2011,  18:07 Найти цитируемый пост)
значит у Ватсона своя метода изложения 

повторюсь я не читал, так что не знаю как он излагает, но по опыту могу сказать что до изучения методов в книгах, обычно(!), примеры не сложнее Hello World, а этот пример сложнее, значит, скорее всего, ты его придумал сам(молодец, на интересных задачах быстрее научишься), но к такому уровню уже нужно знать что такое классы и методы, почитай отдельно и будет тебе счастье. станет намного проще писать.

Автор: massimo2 9.8.2011, 00:41
После прочтения очередной главы новые упражнения:
1. Какие из приведенных ниже преобразований не могут выполняться неявно?
   а) int в short
   b) short в int
   c) bool  в string
   d) byte в  float
Мой ответ : a, c

2. Напишите программу, в которой описывается перечислимый тип color, использующий в качестве базового типа short и содержащий все цвета радуги, а также белый и чёрный. Может ли для такого перечислимого типа в качестве базового использоваться тип byte?

Насчёт программы я не совсем понял что требуется, но написал вот такую (по аналогии с приводимым в книге примером):
Код

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

namespace Упражнение2
{
    enum color : short
    {
        yellow,
        red,
        green,
        blue,
        orange,
        purple,
        brown,
        black,
        white
    }
        class Program
        {
        
            static void Main(string[] args)
            {
                Console.WriteLine("Это прога для описания перечислимого типа color");
                color col = color.black;
                Console.WriteLine("Это цвет \"{0}\"", col);
                short colShort;
                string colString;
                colShort = (short)col;
                colString = Convert.ToString(col);
                Console.WriteLine("Численный(short) эквивалент = {0}", colShort);
                Console.WriteLine("Строчный(string) эквивалент = {0}", colString);
            }
    }
}

 а ответ на вопрос: конечно может.

И ещё вопрос: возможно ли вывести на экран все значения типа по порядку?

Автор: SKrivosein 9.8.2011, 02:07
Цитата

Ну выбрал в итоге C#. Вроде для новичков советуют

Ну это утверждение очень спорное, я как и Экскалупатор считаю что лучше начать с Си. Но уж если сильно надо то возьми Троелсен Э. C#.NET 4 - 2010, 
причитай бегло первую часть, а от второй чётко и ясно всё расписано. А пытатся делать какие то упражнения не понимая методы, и ожидать что помогут на форуме, 
мне кажется не совсем систематический подход...
Линк посылаю в личку. 

Автор: SKrivosein 9.8.2011, 02:51
Код

namespace ConsoleApplication1
{
    enum color : short
    {
        yellow,
        red,
        green,
        blue,
        orange,
        purple,
        brown,
        black,
        white
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Это прога для описания перечислимого типа color");
            color col = color.black;
            Array enumData = Enum.GetValues(col.GetType());
            for (int i = 0; i < enumData.Length; i++)
            {
                Console.WriteLine("Численный(short) эквивалент = {0:D}, Строчный(string) эквивалент = {0}", enumData.GetValue(i));
            }
            Console.ReadLine();
        }
    }
}


Автор: massimo2 9.8.2011, 12:01
SKrivosein, спасибо, попробую Троелсена, так и быть.

А может мне стоит попробовать курсы Intuit? Не знаю, осилю ли Троелсена..мне кажется он ориентируется на человека уже с базой каких-то знаний.

Автор: SKrivosein 9.8.2011, 13:35
Пойми меня правильно, я нечего неимею против Карли Ватсана, но прочитав внимательно I-ю II-ю часть Троелсена, ты эти упражнения (судя по этим двум) будеш знать как решать. 
Вот потом их и решиш, тоже непомешает.

Автор: massimo2 12.8.2011, 21:25
Новые упражнения:

1.В следующих двух функциях содержатся ошибки. Какие именно?
static bool write()
{
     Console.WriteLine("Text output from function.");
}

static void myFunction(string label, params int[] args, bool showLabel)
{
     if (showLabel)
          Console.WriteLine(label);
     foreach (int i in args)
          Console.WriteLine("{0}",i);
}

2. Напишите приложение, которое использует два аргумента командной строки для присваивания значений строковой и целой переменным соответственно, а затем выводит эти значения.

3. Создайте делегат и используйте его вместо функции Console.ReadLine() в запросе ввода от пользователя.

4. Модифицируйте приведенную ниже структуру, включив в неё функцию, которая возвращает суммарную стоимость заказа:
struct order                                  // заказ //
{
     public string itemName;          // наименование //
     public int unitCount;               // число единиц //
     public double unitCost;           // стоимость одной единицы //
}

После недолгих мучений я сделал 3 упражнения, проверьте меня:

1. Первая фунцкия должна возвращать логическое значение, а она вообще ничего не возвращает, т.к. нету слова return.
Во второй функции params int[] должно стоять после всех параметров.

2. 
Код

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

namespace Ch06Ex05
{
    class Program
    {

       static void Main(string[] args)
        {
            Console.WriteLine("HELLO");

            if (args.Length >= 2)
            {
                string a = args[0];
                int b = Convert.ToInt32(args[1]);
                Console.WriteLine("Строковый аргумент: " + a + "\n" + "Целый аргумент: " + b);
            }
            else Console.ReadLine();
        }
    }
}

3. 
Код

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

namespace Упражнение3
{
    class Program
    {

        delegate string A();

                
        static void Main(string[] args)
        {
            string y;
            A process;
            process = new A(Console.ReadLine);

            Console.WriteLine("Enter word");
            y = process();
            Console.WriteLine("Вы ввели " + y);
            
        }
    }
}

Автор: massimo2 12.8.2011, 22:13
ну а вот и четвёртое:
Код

class Program
    {
        struct order
        {
            public string itemName;
            public int unitCount;
            public double unitCost;

            public double sumOrder()
            {
                return unitCount*unitCost;
            }
        }
        
        static void Main(string[] args)
        {
            order h;
            h.itemName = "Телевизор";
            h.unitCost = 500;
            Console.WriteLine("Сколько телевизоров хотите?");
            h.unitCount = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Суммарная стоимость: " + h.sumOrder() + "$");
            Console.ReadLine();
        }
    }

Не захотел уже додумывать, и сделал по-простому.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)