Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка, Сортировка массива в структуре 
:(
    Опции темы
posthuman
Дата 10.12.2009, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 29.10.2009
Где: Люберцы

Репутация: нет
Всего: нет



Столкнулся с такой проблемой.
Дана задачка:
Описать структуру с именем NOTE, содержащую следующие поля:
-фамилия, имя;
-номер телефона;
-дата рождения(массив из трех чисел).
Написать программу, выполняющую следующие действия:
-ввод с клавиатуры данных в массив, состоящий из восьми элементов типа NOTE(записи должны быть размещены по алфавиту);
-вывод на экран информации о людях, чьи дни рождения приходятся на месяяц, значение которого введено с клавиатуры(если тких нет, вывести соответствующее сообщение).
Вот пример кода(не законченный):
Код

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

namespace pr1
{
    struct NOTE
    {
        public string surname_name;
        public string phone_number;
        public int[] birthday;
    }
    class Program
    {

        static void Main(string[] args)
        {
            NOTE[] note = new NOTE[8];
            //ввод данных
            for (int i = 0; i <= 7; i++)
            {
                Console.Write("Введите ФАМИЛИЮ и ИМЯ: ");
                note[i].surname_name = Console.ReadLine();
                Console.Write("Введите ТЕЛЕФОН: ");
                note[i].phone_number = Console.ReadLine();
                Console.Write("Введите ДАТУ РОЖДЕНИЯ(дд.мм.гггг): ");
                string TempBirthday = Console.ReadLine();
                string[] TempMassive = TempBirthday.Split('.');
                int[] birthday = new int[] { int.Parse(TempMassive[0].ToString()), int.Parse(TempMassive[1].ToString()), int.Parse(TempMassive[2].ToString()) };

                //note[i].surname_name = surname_name.Trim();
                //note[i].phone_number = phone_number.Trim();
                note[i].birthday = new int[2];
                note[i].birthday = birthday;
            }

            //сортировка по фамилии
            string tmp;
            for (int i = 0; i < note.Length; i++)
            {
                for (int j = i + 1; j < note.Length; j++)
                {
                    if (note[i].surname_name.CompareTo(note[j].surname_name) > 0)
                    {
                        tmp = note[i].surname_name;
                        note[i].surname_name = note[j].surname_name;
                        note[j].surname_name = tmp;

                        tmp = note[i].phone_number;
                        note[i].phone_number = note[j].phone_number;
                        note[j].phone_number = tmp;
                    }
                }
            }

            //вывод введеных с клавиатуры данных
            Console.WriteLine();
            for (int j = 0; j <= 7; ++j)
            {
                Console.WriteLine("{0}\t\t{1}\t\t{2}.{3}.{4}", note[j].surname_name, note[j].phone_number, note[j].birthday[0], note[j].birthday[1], note[j].birthday[2]);
            }

            //вывод данных по введенному месяцу
            Console.Write("Введите МЕСЯЦ, чтобы показать людей с днем рождения приходящим на этот месяц: ");
            string input_month = Console.ReadLine();
            for (int n = 0; n <= 7; n++)
            {
                if (Convert.ToInt32(input_month) == note[n].birthday[1]) Console.WriteLine("{0}\t\t{1}\t\t{2}.{3}.{4}", note[n].surname_name, note[n].phone_number, note[n].birthday[0], note[n].birthday[1], note[n].birthday[2]);
                else Console.WriteLine("Людей, с днем рождения приходящим на введый Вами МЕСЯЦ не существует.");
            }
            //конец
            Console.ReadLine();
        }
    }
}


Фамилии и телефоны сортирует номально, как сделать чтобы к фамилиям и сортировались соответствующие им даты рождения?
И можно ли исправить этот момент:
-вывод на экран информации о людях, чьи дни рождения приходятся на месяяц, значение которого введено с клавиатуры(если тких нет, вывести соответствующее сообщение).
Вот код этих действий:
Код

            //вывод данных по введенному месяцу
            Console.Write("Введите МЕСЯЦ, чтобы показать людей с днем рождения приходящим на этот месяц: ");
            string input_month = Console.ReadLine();
            for (int n = 0; n <= 7; n++)
            {
                if (Convert.ToInt32(input_month) == note[n].birthday[1]) Console.WriteLine("{0}\t\t{1}\t\t{2}.{3}.{4}", note[n].surname_name, note[n].phone_number, note[n].birthday[0], note[n].birthday[1], note[n].birthday[2]);
                else Console.WriteLine("Людей, с днем рождения приходящим на введый Вами МЕСЯЦ не существует.");
            }

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

Это сообщение отредактировал(а) posthuman - 10.12.2009, 22:56
PM MAIL ICQ Skype   Вверх
Heinzz
Дата 10.12.2009, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 12.12.2008
Где: .net

Репутация: 5
Всего: 9



не надо сортировать вручную, воспользуйтесь например List<> и его метод Sort(), а вашему классу надо реализовать интерфейс IComparable и тогда будет доступна сортировка на любой вкус.


--------------------
user posted image
PM MAIL   Вверх
posthuman
Дата 10.12.2009, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 29.10.2009
Где: Люберцы

Репутация: нет
Всего: нет



А это как сделать? у меня Структура а не класс. Вроде для IComparable надо свой класс писать или я ошибаюсь?
PM MAIL ICQ Skype   Вверх
Heinzz
Дата 10.12.2009, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 12.12.2008
Где: .net

Репутация: 5
Всего: 9



Пожалуйста, структура Person сортируется и по фамилии и по имени.

Код

    class Program
    {
        static void Main(string[] args)
        {
            List<Person> list = new List<Person>();
            list.Add(new Person("Ivanov", "Ivan"));
            list.Add(new Person("Petrov", "Oleg"));
            list.Add(new Person("Ivanov", "Stepan"));
            list.Add(new Person("Ivanov", "Andrey"));

            list.Sort();

            foreach (Person p in list)
            {
                Console.WriteLine(p.ToString());
            }
            Console.ReadKey();
        }
    }
    struct Person: IComparable
    {
        string lastName;
        string name;
        public Person(string _lastName, string _name)
        {
            this.lastName = _lastName;
            this.name = _name;
        }
        public override string ToString()
        {
            return lastName + "\t" + name;
        }

        #region IComparable Members

        public int CompareTo(object obj)
        {
            if (obj is Person)
            {
                Person p2 = (Person)obj;
                if (this.lastName.CompareTo(p2.lastName) == 0)
                { return this.name.CompareTo(p2.name); }
                else
                { return this.lastName.CompareTo(p2.lastName); }
            }
            else
            { throw new Exception(); }
        }

        #endregion
    }



--------------------
user posted image
PM MAIL   Вверх
posthuman
Дата 11.12.2009, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 29.10.2009
Где: Люберцы

Репутация: нет
Всего: нет



а как тут быть, если у меня в структуре поле типа массив?
PM MAIL ICQ Skype   Вверх
Heinzz
Дата 11.12.2009, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 12.12.2008
Где: .net

Репутация: 5
Всего: 9



без разницы. главное что сравнивать можно по полям поддерживающим IComparable


--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0455 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.