Вопросы по C#
Сейчас в универе изучаю C#. Ранее с программированием не сталкивался, но большая часть мне пока понятна.
По этой небольшой непонятной части и возник вопрос сейчас, поэтому буду благодарен наставлению на путь истинный!
Дано задание: вывести на консоль все простые числа до 1000.
Выполнил с использованием метода так:
using System;
class PruefungDerZahl
{
// This Method returns TRUE, if the number saved in variable "zahl" is prime
static bool istPrimzahl(int zahl)
{
// Checks if the number saved in variable "zahl" can be divided by numbers
// starting from 2 to ("zahl" - 1) without the rest. If no - returns TRUE.
for (int j = 2; j < zahl; j++)
if ((zahl % j) == 0)
return false;
return true;
}
static void Main()
{
// Takes the numbers from 2 to 1000 and saves to the variable "i"
for (int i = 2; i <= 1000; i++)
{
// Sends the value of variable "i" to the variable "zahl" of the method istPrimzahl
// If the method istPrimzahl returns TRUE, then writes the number on the screen
Console.Write(istPrimzahl(i) ? i + "\t" : "");
}
Console.ReadLine();
}
}
Теперь хочу выполнить это же задание БЕЗ использования метода, используя один for в другом, но не понимаю как реализовать.
using System;
class PruefungDerZahl
{
static void Main()
{
bool prim = true;
// Берем значение от 2 до 1000, сохраняем в i
for (int i = 2; i <= 1000; i++)
{
// Для каждого значения i проверяется деление без
// остатка на числа от 2 до i/2
for (int j = 2; j < i; j++)
{
if (i % j == 0)
{
prim = false;
}
}
}
}
}
Пытался сделать так: если число делится без остатка false, с остатком true. Но не понял, как реализовать проверку деления одного значения i на ВСЕ j, при этом, если хоть при одном значении j модуло == 0, возвращается false и число не выводится на экран. Если true, то число i выводится на экран 1 раз после перебора всех делителей j.
Натолкните на мысль, в какую сторону двигаться?
Спасибо!
-----
Как ни странно - Перестать делать так как написано в учебнике...

В том смысле, что <i> & <j> - используются не как индексы, а как значимые значения и должны иметь понятные названия.
// Берем значение от 2 до 1000, сохраняем в и
-----
Хммм... тут что-то не так... пока не понятно - не понимание или неумение изложить
// остатка на числа от 2 до и/2
<for (int j = 2; j < i; j++)>
-----
Написано - правильно, но... не делается как написано.
Натолкните на мысль, в какую сторону двигаться?
оставить метод istPrimzahl(int zahl) в коде.
Несколько замечаний:
1. Лучше использовать английский язык в коде;
2. Как уже написал Мурр, переменные должны иметь смысловые названия. Например, поменять j на divisor.
3. Метод istPrimzahl написан в плохом стиле. Для for и if нужно добавить фигурные скобки.
4. Лишний вывод в консоль, если число не является простым. Заменить Console.Write(istPrimzahl(i) ? i + "\t" : ""); на
if (istPrimzahl(i))
{
Console.Write(i.ToString() + "\t");
}
5. for (int j = 2; j <= i/2; j++)
for (int i = 2; i <= 1000; i++)
{
bool prim = true;
// Для каждого значения i проверяется деление без
// остатка на числа от 2 до i/2
for (int j = 2; j <= i / 2; j++)
{
if (i % j == 0)
{
prim = false;
break;
}
}
if (prim)
{
Console.WriteLine(i);
}
}
Теперь хочу выполнить это же задание БЕЗ использования метода, используя один for в другом, но не понимаю как реализовать.


Вообще, мне и самому больше нравится через метод делать это задание, но хотел для практики и знаний попробовать сделать без метода.
Томассон, спасибо за рекомендации!

Обратить внимание на наименование различных частей программы и расстановку скобок. Там же обычно есть упоминание о том, что у функции должен быть один return.
Прочитать про решето Эратосфена на будущее.
Забыть про комментарии типа этого
"// Takes the numbers from 2 to 1000 and saves to the variable "i""
возле цикла. И когда я вижу слово Save у меня никогда не возникнет мысли что сохранение происходит в переменную
Вот еще очень полезный коммент, как жалко что подобных комментов мало в программах

//сохраняем число 5 в целой константе Мах
const int Max=5;

В общем, код такой написал:
using System;
namespace Spiel21
{
class Program
{
static void Main()
{
// Title text
Console.WriteLine("Spiel 21\n ======");
Console.WriteLine("Nimm zwischen 1 und 4 Hölzer. Wer das letzte Holz nimmt, hat verloren.");
Console.WriteLine("Du fängst an.");
// The starting amount of matches is 21
int sumMatches = 21;
Console.Write("Streichhölzer auf dem Tisch: ");
// Prints 21 match on the screen
for (int i = 1; i <= sumMatches; i++)
{
Console.Write("| ");
}
Console.WriteLine();
do
{
int playerMatches;
bool Matches = true;
do
{
// Asks to enter the amount of matches
Console.Write("Wie viele Hölzer nimmst Du: ");
playerMatches = Convert.ToInt32(Console.ReadLine());
// Checks if the amount of matches is from 1 to 4.
// If no, asks to re-enter the amount.
if (playerMatches > 4 || playerMatches < 1)
{
Matches = false;
Console.WriteLine("Falsche Zahl. Wiederhole die Eingabe.");
}
else
{
break;
}
}
while(!Matches);
// Calculates amount of remaining matches and print them on the screen
sumMatches = sumMatches - playerMatches;
Console.Write("\nStreichhölzer auf dem Tisch: ");
for (int i = 1; i <= sumMatches; i++)
{
Console.Write("| ");
}
Console.WriteLine();
// Calculates amount of matches taken by a computer
int compMatches = 5 - playerMatches;
if (compMatches > 1)
{
Console.WriteLine("Ich nehme {0} Hölzer.", compMatches);
}
else
{
Console.WriteLine("Ich nehme {0} Holz.", compMatches);
}
// Calculates amount of remaining matches and print them on the screen
sumMatches = sumMatches - compMatches;
Console.Write("\nStreichhölzer auf dem Tisch: ");
for (int i = 1; i <= sumMatches; i++)
{
Console.Write("| ");
}
Console.WriteLine();
}
// Repeats until there remains only one match
while (sumMatches > 1);
// If there remains only one match, prints that you have lost.
if (sumMatches == 1)
{
Console.WriteLine("\nDu hast VERLOREN!");
}
Console.ReadLine();
}
}
}
Пока не совсем в курсе, как правильно писать комментарии, пишу везде, где покажется нужным.
Вопрос: как в программу, дополнительно к проверке ввода числа от 1 до 4, приписать еще и проверку на то, что вводится именно число, а не буква или символ. В общем, чтобы программа не выдавала ошибку при вводе буквы, а предлагала ввести правильное значение.
Пока нашел такой вариант:
if (!int.TryParse(Console.ReadLine(), out playerMatches))
{
Console.WriteLine("Falsche Zahl. Wiederhole die Eingabe.");
Matches = false;
}
Не понимаю, как этот кусок туда внедрить, ибо переменная playerMatches уже использует Console.ReadLine().
Переделал кусок кода так:
do
{
int playerMatches;
string inputLine;
bool Matches = true;
do
{
// Asks to enter the amount of matches
Console.Write("Wie viele Hölzer nimmst Du: ");
inputLine = Console.ReadLine();
// Checks if amount of matches is from 1 to 4. Only digits are allowed.
// If no, asks to re-enter the amount.
if (!int.TryParse(inputLine, out playerMatches))
{
Matches = false;
Console.WriteLine("Falsche Zahl. Wiederhole die Eingabe.");
}
else if (playerMatches > 4 || playerMatches < 1)
{
Matches = false;
Console.WriteLine("Falsche Zahl. Wiederhole die Eingabe.");
}
else
{
break;
}
}
while(!Matches);
playerMatches = Convert.ToInt32(inputLine);
// Calculates amount of remaining matches and print them on the screen
sumMatches = sumMatches - playerMatches;
там по идее еще дальше нужно организовывать код. Например, enumeration Player и делать универсальный GameStep с этим параметром.
Избавляться от двойного вызова DrawMatches(matchesCount: matchesRemainder) и т.д.
Но мне уже было лень :-)