Софтуерно Инженерство
Loading...
+ Нов въпрос
aurora96 avatar aurora96 2 Точки

Помощ със задача 10 от книгата "Въведение в Програмирането с C#".

Здравейте колеги, поразрових се из форума, гугъл но за съжаление не успях да намеря подобна тема, затова пускам своята.
Условието на задачата е: Напишете програма, която извежда първите 100 члена на редицата: 2, -3, 4, -5, 6 , -7 , 8.

Намерих решението което е :

using System;

 

class PrintSequenceApp

{

  

    static void Main()

    {

        for (int i = 0; i < 100; i++)

        {

            if (i % 2 == 0)

            {

                Console.Write("{0,4} ", i + 2);

            }

            else

            {

                Console.Write("{0,4} ", -(i + 2));

            }

        }

        Console.WriteLine();

    }

 

}

Компилира се без проблем но аз не мога да разбера как точно се решава, знам какво е console.write, writeline но не разбирам от къде идва това 0,4 , % от 2 и т.н.
for (int i = 0; i < 100; i++) това си го обяснявам, като i = 0 т.е. всички числа са = на 0, следователно всичко да е по-малко от 100 и да нараства до 100.
Надявам се да ми помогнете, благодаря.

Тагове:
BTreppechov avatar BTreppechov 5 Точки

Здравей,доколкото виждам трябва да принтираш числата на редица , в зависимост дали са Odd и да ги изпишеш позитивни или Even и да ги изпишеш отрицателни.

Т.е  -ако са Even делиш числото на 2 ,което трябва да няма остатък. Т.е  i % 2 == 0;

     - ако са Odd ,обратното , т.е правиш един if , else . Ако се дели даденото число без остатък,е положително , ако  се дели с остатък , отрицателно.

А това 0,4 е просто да го принтираш по-красиво в дадения случай, а не слято.Напиши placeholder c# в google ,ако се интересуваш.

Поздрави.

1
aurora96 avatar aurora96 2 Точки

Прочетох отговорът Ви, но въобще не мога да разбера как се случва всичко това, ако е възможно може ли да ми пишете по скайп : nikol4o9681 

0
DiyanTonchev92 avatar DiyanTonchev92 233 Точки

Eто ти едно решение =>  http://pastebin.com/dEZsE6Mw (закоментираното е малко по-цивилизовано решение)

0
evvladimirov avatar evvladimirov 2 Точки

Привет,

Console.Write e метод (според мен не е лошо в случая да си го представим като функция), чиято основна цел е да отпечата зададения параметър (в скобите, в случая настоящата стойност на боряча на цикъла). Преди него обаче може да се зададе като друг параметър - формата, под който да се отпечатват отделните стойности (ей тука съм гепил един линк от подобна тема в stackoverflow - http://www.dylanbeattie.net/cheatsheets/dot_net_string_format_cheat_sheet.pdf). Разгледай го, поиграй си в задачката и мисля, че ще придобиеш достатъчно интуитивна представа какво представлява {0,4} като параметър на горния метод. Сам си разгадай какво е 0 и какво е 4, за да не ти отнемам удоволствието :P

По-здрав. :)

0
05/07/2015 23:28:22
fredddy avatar fredddy 27 Точки

Здравей!  Значи това за което питаш Console.Writeline({0,4},i) се нарича както колегата е казал placeholder основно "{0}" означава че ще ти принтира стойноста на променливата, която е първа след края на кавичките в случая ,i.  В един ред можеш да принтираш много променливи напр. Console.WriteLine("Prime numbers less than 10: {0}, {1}, {2}, {3}, {4}", 1, 2, 3, 5, 7);

{0,4} в плейсхолдера означва да има разстояние след изписването на променливата 4 символа и е като  "{0}    "

for (int i = 0; i < 100; i++) това се нарича цикъл ще го срещнеш малко по нататъка в книгата, но най общо казано върти за променливата i като и сменя последователно стойноста от 0 до 100 и прави нещо в къдравите скоби отдолу. В случая понеже от условито се изискват първите 100 члена за това цикъла е о 0 до 100 но е малко объркващо понеже после се налага да добавя на всяко завъртане +2 към стойноста на i защо първия член на редицата по условие е 2 но от това просто няма смисъл. По правилно според мен е цикъла да се завърти така 
   for (int i = 2; i < 102; i++)

        {

            if (i % 2 == 0)

            {

                Console.Write("{0,4} ", i );

            }

            else

            {

                Console.Write("{0}    ", -i );

            }

        }

        Console.WriteLine();

 

0
05/07/2015 23:34:25
aurora96 avatar aurora96 2 Точки

Благодаря на всички, не разбрах нищо. :D Ще прочета главите в книгата от 1 до 6-та глава която се пада "Цикли".

0
DiyanTonchev92 avatar DiyanTonchev92 233 Точки

По-добре първо изгледай видеата от Programing Basics, след това прочети главите, след това се опитай пак, и чак тогава питай във форума. Всеки ще ти отговори по негов си начин и ще ти даде различно решение, което само ще те обърка, особено когато си начинаещ. Отделно, човекът от форума няма как да знае какво ти знаеш и какво не, че да се съобрази. :)

0
Kosta.Kanev avatar Kosta.Kanev 27 Точки

Здравей.

Това е малко по опростено мисля, че ще го схванеш по лесно.

1 for (int i = 2; i < 102; i++)
2        {
3            if (i % 2 == 0)
4            {
5                Console.Write(i + " ");
6            }
7            else
8            {
9                Console.Write(-i + " ");          

10          }

11      }
12          Console.WriteLine();

 

Първо да уточня... for цикъла се състой от 3 елемента ако мога така да ги нарека. Първият елемент е задаването на стойност на целочислена променлива , която всъщност е нашият брояч за този цикъл ( Int i = 2 в този случай) т.е броячът започва от 2. Във втория елемент задаваме проверка която да се изпълнява след всяко едно завъртане на цикъла ( i < 102 ), което означава че стигне ли броячът до стойност различна от i < 102 нашия цикъл приключва. Третия задължителен елемент е този в който задаваме стъпка с коята броячът ни ( i ) да се увеличава ( i++) което е еквивалентно на ( i + 1) т.е след всяко завъртане (итерация) на цикъла стойността на броячът ще се увеличава с 1.

 

На ред 1 започва цикъла като първо се задава стойност на i (int i = 2), след това се изпълнява проверката ( i < 102 ) ако проверката е вярна програмата влиза в тялото на цикъла , което е всичко между отварящата { и затварящата } фигурни скоби на цикъла.

 

На ред 3 имаме проверка if ( i % 2 == 0 ) , която гласи " Ако остатъкът от делението на i с 2 е равен на 0" проверката е вярна. Операторът % при аритметични операции означава остатък от деление. Това е разликата мъжу / и %. Операторът / връща резултатът от делението напр. 4 / 2 = 2 , а операторът % връща самия остатък напр. 4 % 2 = 0 , защото остатъкът от 4 / 2 е нула.Тази проверка се прави за да разберем дали текущото число е четно или нечетно. Знаем , че всяко четно число разделено на 2 дава остатък нула, ние искаме да отпечатаме всички четни числа като положителни, затова ако числото е четно влизаме тялото на проверката (ред 5) и отпечатваме на конзолата числото + един интервал след него за да могат числата ни да изглеждат разделени едно от друго на конзолата.

Ако проверката на ред 3 не е вярна т.е единствената възможност да не е вярна е ако числото разделено остатъчно на 2 е различно от нула, което означава , че числото ни е нечетно. Отиваме на ред 7 влизаме в else тялото и отпечатваме числото с отрицателен знак.

 

Следващата стъпка е броячът ни който всъщност е и числото с което работим ... да се увеличи с 1 да се изпълни проверката на цикъла и той да започне отначало и така докато числото ни стане различно от ( i < 102 ).

 

След края на целия цикъл се отпечатва един нов ред за да изглежда изходът по добре и програмата приключва :) Надявам се да си успял да разбереш написаното и аз да съм успял да помогна. Книгата на Наков ще ти помогне страшно много. В подробности какво е това {0,4}  , i + 2 и т.н. ще разбереш от нея. Моята препоръка е ако не си се запознал с материала до цикли да го прочетеш внимателно и да потренираш и всичко ще ти се изясни. Поздрави и успехи за напред.

 

 

 

0
06/07/2015 01:38:49
fredddy avatar fredddy 27 Точки
Колега с ( i +1) ще получиш безкраен цикъл, защото не присвояваш стойност а само събираш. Трябва да е присвояваш стойност (i = I+1)
-2
Kosta.Kanev avatar Kosta.Kanev 27 Точки

С ( i + 1 ) програмата въобще няма да се компилира. Написал съм го за да бъде по разбираемо, за да се разбере че на всяко завъртане трябва да се увеличава с единица. Когато стигне до операторите ще му стане ясно какво е i + 1 , i = i + 1. Може и ( i += 1 ) ако щеш , но човекът няма да го разбере при положение , че не е научил материала до циклите. Нарочно не навлизам в такива подробности! На този етап мисля , че няма смисъл.

0
aurora96 avatar aurora96 2 Точки

Kosta.Kanev,
Извинявай решението ти има "if" и "else" ,би ли ми обяснил какво е "if" и "else" и какво правят/как се ползват ? В книгата от примитивни типове и променливи (2ра глава) също ги има на едно място но не е обяснено. (:

0
06/07/2015 18:48:52
mmirchev avatar mmirchev 5 Точки

Здравей,

Ето как съм решил тази задача laugh

1.Правиш една променлива, която ти съдържа числото, от което ти започва числовата редица.

2. Правиш втора променлива и й задаваш да е равна на 1-вата, колкото да се инициализира с дадената стойност.(Тази втората променлива ще използваш за да отпечатваш стойностите в конзолата)

3. Правиш си трета променлива, на която просвояваш стойност -1, с това -1 ще сменяш знака на всяко следващо число при завъртане на цикъла.

А именно:

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

namespace SequenceOfThousandNumbers
{
    class Program
    {
        static void Main(string[] args)
        {
            int firstNumber = 2;
            int currentNumber = firstNumber;
            int signChange = -1;
            for (int i = 0; i < 100; i++)
            {               
                Console.Write(currentNumber + ", ");
                firstNumber++;
                currentNumber = firstNumber * signChange;
                signChange = signChange * -1;                                              
            }
        }
    }
}

0
Rextor92 avatar Rextor92 150 Точки

mmirchev , реално нямаш нужда нито от currentNumber, нито от signChange. Ако проверяваш за остатък при делене на две използваш Console.Write(number) или Console.Write(-number), по твоя начин върши работа само Console.Write(number); number=-number; number++; в цикъл.

Може да прочетете за тернарния оператор ?: тук . Моето решение го използва, изглежда така

static void Main(string[] args)
    {
        int number = 2;
        for (int i = 0; i &amp;lt; 10; i++)
        {
            Console.Write((number % 2 == 0) ? number : -number);
            if (i != 9)
            {
                Console.Write(", ");
            }
            number++;
        }
    } // еnd main

 

2
06/07/2015 22:12:24
g_todorov avatar g_todorov 98 Точки

здравей aurora96,

накратко задачата се решава с for цикъл. Обичайно този тип цикли съдържат 3 елемента:

1.начало на цикъла( int i=0; в конкретния случай) - почва от 0    

2.брояч на цикъла( i<100; в конкретния случай) - докато i<100 цикълът ще се върти( до 99)

3.стъпка на цикъла (i++ в конкретния случай е 1) 

за повече информация по циклите изгледай лекция Loops от предни инициализации на курса.

if конструкция - ако в скобите условието е вярно се изпълнява първото поместено между къдравите скоби и се прескача поместеното във вторите къдрави скоби, ако не е вярно условието се изпълнява помесетното във вторите къдрави скоби.

Условието if(i % 2 ==0) означава, че при всяко поредно завъртане на цикъла i нараства с 1 прави се остатъчно деление на 2(взема се само остатъка от делението - това след дес. запетая) и ако остатъкът е идентичен (==) на 0 (тоест четно) се изпълнява това между първите къдрави скоби, ако не е изпълнено условието се изпълнява поместеното между 2-рите къдрави. 

Console.Write - означава изпиши на същия ред.  

"{0,4}", i+2 Това е т.нар. place-holder - на мястото на 0 м/у къдравите скоби конзолата изчислява и  изписва това което се намира веднага след запетаята, в случая формулата i+2, а 4 вътре в къдравите скоби сочи колко спейса да изпише конзолата преди да изчисли и отпечати формулката (служи за по-естетично изглеждащ резултат - махни 4 и запетаята преди нея и пробвай да видиш)

Успех!

 

0