Member 14075859 Ответов: 3

Напишите программу для отображения предыдущего и следующего дня заданного днем недели на языке Си#


Спасибо что помогли мне мои друзья
С Новым Годом

Что я уже пробовал:

Я не знаю
я еще ничего не пробовал

3 Ответов

Рейтинг:
1

Richard MacCutchan

Вы должны использовать индексированный цикл для поиска в списке имени дня, которое вводит пользователь. Если имя найдено, то текущим индексом будет его позиция в списке. Если он не найден, то вам нужно отправить сообщение об ошибке. Помните, что Предыдущее значение индекса для понедельника не будет равно -1. Точно так же следующее значение после воскресенья не будет 7.

int index = -1;
for int i = 0; i < daysofweek.Length; ++i)
{
    if input.Equals(daysofweek[i])
        break;
}
// at this point index should have a value equal to the day's index (0 to 6)
// if the name was not found then it will be greater than 6.


Member 14075859

Как мне это сделать
Я новичок на самом деле, так что любая помощь?

Richard MacCutchan

Смотрите мой обновленный код.

Maciej Los

Хорошая мысль, пятерка!
Смотри мой ответ, Ричард. ;)

Рейтинг:
1

Maciej Los

Член 14075859 написал:
я сдался лол


Эй, не сдавайся!
Пожалуйста, смотрите эту статью MSDN: Выполнение арифметических операций с датами и временем | Microsoft Docs[^]
Там больше всего информации, необходимой для решения вашей проблемы.

Примечание: Вы можете написать программу, которая работает по датам:
//needs reference to System.Globalization
CultureInfo ci = new CultureInfo("en-us");

DateTime givenDay = new DateTime(2019,01,01);
DateTime prevDay = givenDay.AddDays(-1);
DateTime nextDay = givenDay.AddDays(1);

Console.WriteLine("given day: {0} ({1})", givenDay.ToString("yyyy-MM-dd"), givenDay.ToString("dddd", ci));
Console.WriteLine("prev day: {0} ({1})", prevDay.ToString("yyyy-MM-dd"), prevDay.ToString("dddd", ci));
Console.WriteLine("next day: {0} ({1})", nextDay.ToString("yyyy-MM-dd"), nextDay.ToString("dddd", ci));

Результат:
given day: 2019-01-01 (Tuesday)
prev day: 2018-12-31 (Monday)
next day: 2019-01-02 (Wednesday)


или на перечислениях (Типы перечислений - руководство по программированию на C# | Microsoft Docs[^]):
public enum WeekDays { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };

int givenDay = (int)WeekDays.Sunday; //(int)WeekDays.Tuesday;
int prevDay = givenDay-1;
if(prevDay<0) prevDay = (int)WeekDays.Saturday;
int nextDay = givenDay+1;
if(nextDay>6) nextDay = (int)WeekDays.Sunday;

Console.WriteLine("given day is: {0} (value of: {1})", Enum.GetName(typeof(WeekDays), givenDay), givenDay);
Console.WriteLine("prev day is: {0} (value of: {1})", Enum.GetName(typeof(WeekDays), prevDay), prevDay);
Console.WriteLine("next day is: {0} (value of: {1})", Enum.GetName(typeof(WeekDays), nextDay), nextDay);

Результат:
given day is: Sunday (value of: 0)
prev day is: Saturday (value of: 6)
next day is: Monday (value of: 1)


или даже на массиве (как Ричард Маккатчан указал мне на первоначальный вопрос):

string[] WeekDays = new string[]{ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };

Console.WriteLine("Days of week:");
for(int i=0; i<WeekDays.Length; i++)
    Console.WriteLine("{0} - {1}", i, WeekDays[i]);
Console.WriteLine("Choose the day (corresponding number):");

string choosenDay = Console.ReadLine();
int givenDay = Int32.Parse(choosenDay);
int prevDay = givenDay-1<0 ? 6 : givenDay-1;
int nextDay = givenDay+1>6 ? 0 : givenDay+1;

Console.WriteLine("given day is: {0} (value of: {1})", WeekDays[givenDay], givenDay);
Console.WriteLine("prev day is: {0} (value of: {1})", WeekDays[prevDay], prevDay);
Console.WriteLine("next day is: {0} (value of: {1})", WeekDays[nextDay], nextDay);

Результат:
Days of week:
0 - Sunday
1 - Monday
2 - Tuesday
3 - Wednesday
4 - Thursday
5 - Friday
6 - Saturday
Choose the day (corresponding number):
given day is: Tuesday (value of: 2)
prev day is: Monday (value of: 1)
next day is: Wednesday (value of: 3)


Richard MacCutchan

+5, очень хорошо объяснено. Но мой ответ относился к исходному вопросу (взгляните на версию 1), который OP отредактировал.

Maciej Los

Я видела это, Ричард. Мне было интересно, почему вы и OriginalGriff рекомендуете использовать for петля. Итак, я должен был увидеть оригинальный вопрос.
[РЕДАКТИРОВАТЬ]
Я забыл сказать: спасибо.

Рейтинг:
0

OriginalGriff

Проблема с этим подходом заключается в том, что происходит, когда пользователь входит в понедельник или воскресенье?
Вам нужно использовать пользовательский ввод для поиска в вашем массиве введенного имени дня. (Попробуйте а for петля)
Если его не найдут, скажите ему, что это не тот день, и попросите его попробовать еще раз.
если это так, то переменная цикла является индексом К "сегодня".
Чтобы вычислить индекс предыдущих дней, добавьте 6 к индексу, а затем используйте оператор модуля, чтобы вернуть его к "правильному" значению. Чтобы вычислить следующие дни, добавьте один, а затем снова используйте модуль.

int prevIndex = (index + 6) % 7;
int nextIndex = (index + 1) % 7;
Это работает, потому что модуль дает вам остаток и всегда будет между 0 и 6 включительно. (Таким образом, добавление шести и взятие модуля 7 эффективно дает вам минус один, который "оборачивается" вокруг конца массива!)

Подсказка: строки C# чувствительны к регистру: поэтому "вторник" не будет соответствовать "вторнику": я бы сравнил их, преобразовав их в нижний регистр перед фактическим сравнением.


Member 14075859

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

OriginalGriff

Я мог бы, но не собираюсь! Это ваше домашнее задание, а не мое - и вы узнаете гораздо больше, делая его (и делая ошибки), чем просто глядя на мою работу и сдавая ее.

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

Попробуйте: сначала сделайте первый бит. Прочтите входные данные и найдите текущий день - это всего лишь пара строк кода! Используйте отладчик, чтобы точно видеть, что происходит во время выполнения кода.

Когда это сработает, добавьте следующий бит.
Это не сложно, если смотреть на это маленькими кусочками.

Member 14075859

Итак я уже создал массив и его элементы
я создал переменную для хранения входных данных
я спросил пользователя о текущем дне
а потом?

OriginalGriff

Затем используйте цикл for, чтобы найти входные данные в массиве.
Я уверен, что вы делали что-то подобное в предыдущих упражнениях.

Member 14075859

ну это мое второе упражнение
мой первый я использовал цикл for для генерации квадратных чисел вот и все
этот гораздо сложнее
мой преподаватель сказал нам попробовать

OriginalGriff

На самом деле это не намного сложнее - это просто собрать воедино то, что вы узнали по-разному.
показатель инт ;
for (index = 0; index < 7; index++)
{
...
}
// здесь индекс равен либо 0..6, и в этом случае он нашел день, либо 7, и в этом случае он этого не сделал.
Это довольно просто, не так ли?
Посмотрите, сможете ли вы заполнить петлю - это действительно не сложно!

Member 14075859

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

daysofweek[index] = конвертировать.ToString(индекс + 1 % 7);

вот что я написал лол

OriginalGriff

Нет, это не так!
Пользователь вводит строку "среда" - и ее нужно сравнить с каждым элементом вашего массива по очереди, пока вы его не найдете.

Я уверен, вы помните, как сравнивать вещи в C#!

Member 14075859

я сдался лол

OriginalGriff

Тогда вы не будете иметь ничего, чтобы вручить. ЛОЛ.

Maciej Los

Хорошая мысль, пятерка!
Смотри мой ответ, ОГ ;)