👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

«запол массив рез» — наверное «заполнить массив результатом»
а може,
«заполучить массивную резину»?
Коменти, дуже важлива річ, я б сказав, навіть важливіше за самий код.
Посто тре виробляти якийсь стиль.
Або пишем самокоментований код, або «правильні» коменти.

Бо потім «сам чорт роги зламає».

Таня,
там придрались из-за сокращения, что смешно звучит
«запол массив рез» — наверное «заполнить массив результатом»

И не прислушивайтесь ко всему, что здесь говорят, здесь много народа что постоянно «пацталом».

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

единственно правильная форма записи комментариев выглядит вот так;

/* Это правильный комментарий */

Да ладно, нормальный коментарий...Чем он плох?

. Вот как раз в недавно написал функцию на 3000 строк, машина состояний — ничего никуда не вынесешь.

Ну вынести может и не получится, а вот упрятать в макросы-шаблоны-инлайны ИМХО можно вполне.

data [i].ВывестиНа (tw);

пацсталом

2Tania

Можна прокоментувати комент:

// запол массив рез

п.с.

не зміг втриматись.

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

Идеала не бывает. Вот как раз в недавно написал функцию на 3000 строк, машина состояний — ничего никуда не вынесешь. Правильнее лучше будет говорить «функция должна выполнять атомарное (неделимое) действие».

Tania, это основной вопрос «самосовершенствования», наверно:) Это самое сложное.
На эту тему и литературы много, и подходы есть (паттерны проектирования, например).
Джоэл.
Очень сложно найти именно вот эту «грань». Между «универсальностью», «понятностью» и «все в одну кучу». У меня процесс обучения и самосовершенствования (в т.ч. в плане «красоты» кода) — идет постоянно, впрочем, я думаю, так у большинства.
Сначала многие валят все в одну кучу, потом понимают, что плохо, начинают универсализировать... Доходит до того, что в коде ВООБЩЕ разобраться нельзя, потому что так все зауниверсализировано, что ничего понять нельзя, и код получается ни чуть не лучше, чем «все в одну кучу». Все равно ничего не понятно:)
Ну... Я в последнее время стараюсь делать так: писать максимально просто и понятно (с учетом внутренних правил «семантического» наполнения кода), и то, что нужно. Не универсализируя «заранее» (все равно, зачастую, не пригождается вот это вот «а вдруг...»). Если понадобилось что-то, а я вспоминаю, что это было «где-то» (а зачастую так и бывает), то не занимаюсь копипастом (хотя раньше, каюсь, было...), а расширяю то, что есть. Рефакторинг.
Мешать все в одну кучу, конечно, не стоит:)

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

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

Почитайте, там много хорошего.

Существует ли предел универсальности программного кода? Ведь даже не используемые в некотором случае его элементы, могут пригодится для решения иной задачи.Или же в таком случае необходимо делить код на отдельные функциональные части, может даже на независимые программы? Валить все в одну кучу не очень хорошо, да и делить не резонно...Что делать?

Конечно, там где не нужно (явно) использовать строки — их не стоит использовать:)
Как минимум — цифры проще «сравнивать» (грубо говоря), с ними проще работать:)
Да и вообще, со строками работа в принципе сложнее, чем с цифрами.
Но везде (даже там, где явно необходимы строки) — использовать цифры — тоже неразумно.
Главное, вдумчиво делать.
И не перегибать палку.

Но, конечно, люди пишут так, как считают нужным в любом случае.

Аналогично, бывает нужно вывести строку в сообщении.
Не цифра же:)

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

Tania, смотря где.
Если у Вас тэг в XML — Вы его цифрой или буквой запишете?
И процедуры парс/распарс XML — это две разные процедуры.
По-идее:)
А обоих случаях Вы будете читать/писать в тэг.

У Вас тэг будет цифрой?

Разве использование литералов является хорошим стилем программирования?

Впрочем, там непосредственно от самой сути кода зависит.
Просто вдумчиво делать, то, что нужно и не перегибать палку.
Как излишняя униврсализация портит все (наунерсализировали, а не используете), так и излишнее упрощение.
Мне нравится, как здесь написано:

www.insidecpp.ru/art

Tania, главное только — не увлекаться. Если вы используете число только в одном месте — лучше оставить числом.

Понадобилось в другом — завели константу, подставили константу в оба места.

Tania, ИМХО — смотря, что.
Данные могут быть на любом.
Теги (с которыми непосредственно в ПО работаете) — я бы оформляла латиницей.
Они тоже участвуют в «коде».
На самом деле, лучше всего оформлять их вообще константами, тогда у Вас не будет проблемы поменять значение тэга во ВСЕХ местах, где используете. Аналогично с цифрами. «Мэджик-намберы» — зло.

Если нужно будет менять (и он у Вас числом, а не константой) — замучаетесь править. А так — значение константы поменяли, и все работает.

я вполне согласна, что программу гораздо легче воспринимать на одном языке.А на каком языке надо оформлять XML?

seniour_dev, как тролль троллю — если человека не копать, и на ошибки не указывать — он не научится;)

как сениору — пора бы знать

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

seniour_dev, и если Вас волнуют гендерные вопросы, то я «имею право», т.к. «и сама девушка»:)
только мне и в страшном сне не могло присниться кириллицу использовать в коде

жесть, конечно

seniour_dev, правильно, давайте с лаб в ВУЗах писать гауууу...нооооо!:)
она же потом с подобным подходом на работу придет

РАБОЧИЙ код писать

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

"Мопед не Ваш, вы просто разместили объяву"©: -D

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

Ну, это так. На будущее.

Tania, ну... Кагбэ... Вы когда-нибудь что-нибудь про кодировки слышали? Что (грубо говоря) есть латиница, которая занимает ВСЕГДА первую половину (128 символов), и есть вторя «на выбор», в которые идут кириллица, ЛИБО японский язык, ЛИБО юникод, ну и т.д.
В юникод, конечно, можно впихнуть все...
Но вы подумайте, если там, где буду собирать этот код будет НЕ юникод, и НЕ кириллица...

Это кроме того, что мешать языки — это дурной тон.

Усложняет читабельность кода, когда видишь Console.WriteLine (Book.Автор), смешаны 2 языка

Почему такое враждебное отношение к кириллице?

Всем не понравилось, что Вы использовали кириллицу для объявлений полей и методов. Это плохая практика и лучше даже с самого «начала» от нее отучаться.

Раз заработала, то нужно показать сиськифотки!

Программа заработала!!! а ошибка, соглашусь, была тупая...

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

В общем, мне на работе сейчас нефиг делать и я решил таки скопипастить этот код в студию:)
Заодно и узнал, что можно вот так на русском писать о_О
Таня, ошибка у вас на проперти «ГодИздания» (начало класса Book), а именно в get {return ГодИздания;} -
происходит рекурсивное обращение к самому проперти, то есть напишите return ГодИздания_;

(про сам код я уж промолчу...)

Можно ли расширить Stack для конкретной программы, не меняя исходного программного кода, или же потребность в расширении Stack вызвана некорректностью данного кода?

Убиться тапком...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Collections;
namespace klass
{
public class Book
{
private string НазваниеКниги_;
private int ГодИздания_;
private string ФамАвт_;
/// < summary>
/// Обеспечивает доступ к полю, которое хранит название книги
/// </summary>
public string НазваниеКниги
{
set {НазваниеКниги_ = value;}
get {return НазваниеКниги_;}
}
/// < summary>
/// Обеспечивает доступ к полю, которое хранит год издания книги, накладывает ограничения на значение данного поля
/// </summary>
public int ГодИздания
{
set
{
if (value > 2010)
ГодИздания_ = 2010;
else
ГодИздания_ = value;
}
get {return ГодИздания;}
}
/// < summary>
/// Обеспечивает доступ к полю, которое хранит фамилию автора книги
/// </summary>
public string ФамАвт
{
set {ФамАвт_ = value;}
get {return ФамАвт_;}
}
/// < summary>
/// Разбивает строку на элементы
/// </summary>
/// < param name= «str» > Передаваемая строка</param>
public void ИзСтроки (string str)
{
String [] str_el = str.Split (’ ’);
ФамАвт = str_el [0];
НазваниеКниги = str_el [1];
ГодИздания = int.Parse (str_el [2]);
}
/// < summary>
/// Превращает информацию о книге в строку
/// </summary>
/// < returns> Результат преобразования</returns>
public string ВСтроку ()
{
return «Книга» + " " + ФамАвт + «. » + «Название» + " " + НазваниеКниги + «. » + «Год» + " " + ГодИздания.ToString () + «.»;
}
/// < summary>
/// Вывод строки в файл (на консоль)
/// </summary>
/// < param name= «tw» > Переменная-имя файла (консоли) </param>
public void ВывестиНа (TextWriter tw)
{
tw.WriteLine (ВСтроку ());
}
/// < summary>
/// Ввод строки с файла (консоли)
/// </summary>
/// < param name= «tr» > Переменная-имя файла (консоли) </param>
public void ВвестиИз (TextReader tr)
{
ИзСтроки (tr.ReadLine ());
}
}
// Сведения о книге состоят из фамилии автора, названия и го¬да издания. Дан набор из 20 таких сведений.
//Найти название книг данного автора, изданных с 1970 по 1990гг.
//Упорядочить сведения о книгах по первой букве фамилии автора.
//Замелить старый год издания на 1992 г., предполагая, что одна из книг переиздана.
class Books: IComparer< Book>
{
private Book [] data;
public Books ()
{
data = new Book [0];
}
/// < summary>
/// Добавление информации о книге в массив данных
/// </summary>
public void ДобавитьКнигу ()
{
Book [] t_data = new Book [data.Length + 1];
for (int i = 0; i < data.Length; i++)
t_data [i] = data [i];
t_data [data.Length] = new Book ();
data = t_data;
}
/// < summary>
/// Ввод обновленного массива данных из файла (консоли)
/// </summary>
/// < param name= «tr» > Переменная-имя файла (консоли) </param>
public void ВводИз (TextReader tr)
{
String line = tr.ReadLine ();
while (line! = «~» )
{
ДобавитьКнигу ();
data [data.Length — 1].ИзСтроки (line);
line = tr.ReadLine ();
}
}
// [SerializableAttribute]
// [ComVisibleAttribute (true)]
//public sealed class StackOverflowException: SystemException
/// < summary>
/// Вывод данных в файл (на консоль)
/// </summary>
/// < param name= «tw» > Переменная-имя файла (консоли) </param>
public void ВыводНа (TextWriter tw)
{
for (int i = 0; i < data.Length; i++)
data [i].ВывестиНа (tw);
}
/// < summary>
/// Поиск книги по фамилии автора
/// </summary>
/// < param name= «author» > Передаваемый параметр-фамилия автора</param>
/// < returns> Возвращается массив результата поиска</returns>
public Books НайтиКнигуПоФамилии (string author)
{
// определить кол книг из заданного диапазона
int number = 0;
for (int i = 0; i < data.Length; i++)
if (data [i].ФамАвт == author)
number++;
// cоздаем массив рез
Books rez = new Books ();
rez.data = new Book [number];
// запол массив рез
number = 0;//rez.date
for (int i = 0; i < data.Length; i++) //i-date
if (data [i].ФамАвт == author)
rez.data [number++] = data [i];
return rez;
}
/// < summary>
///Поиск книг с годом большим либо равным заданному
/// </summary>
/// < param name= «year» > Передаваемый параметр-год издания</param>
/// < returns> Возвращается массив результата поиска</returns>
public Books НайтиКнигиСГодомБольшимЛибоРавным (int year)
{
// определить кол книг из заданного диапазона
int number = 0;
for (int i = 0; i < data.Length; i++)
if (year < = data [i].ГодИздания)
number++;
// cоздаем массив рез
Books rez = new Books ();
rez.data = new Book [number];
// запол массив рез
number = 0;//rez.date
for (int i = 0; i < data.Length; i++) //i-date
if (year < = data [i].ГодИздания)
rez.data [number++] = data [i];
return rez;
}
/// < summary>
/// Поиск книг с годом меньшим либо равным заданному
/// </summary>
/// < param name= «year» > Передаваемый параметр-год издания</param>
/// < returns> Возвращается массив результата поиска</returns>
public Books НайтиКнигиСГодомМеньшимЛибоРавным (int year)
{
// определить кол книг из заданного диапазона
int number = 0;
for (int i = 0; i < data.Length; i++)
if (data [i].ГодИздания < = year)
number++;
// cоздаем массив рез
Books rez = new Books ();
rez.data = new Book [number];
// запол массив рез
number = 0;//rez.date
for (int i = 0; i < data.Length; i++) //i-date
if (data [i].ГодИздания < = year)
rez.data [number++] = data [i];
return rez;
}
/// < summary>
/// Обновление данных о книге
/// </summary>
/// < param name= «avtor» > Передаваемый параметр-фамилия автора</param>
/// < param name= «name» > Передаваемый параметр-название книги</param>
/// < param name= «year» > Передаваемый параметр-год издания</param>
/// < param name= «new_avtor» > Передаваемый параметр-новая фамилия автора</param>
/// < param name= «new_name» > Передаваемый параметр-новое название книги</param>
/// < param name= «new_year» > Передаваемый параметр-новый год издания</param>
public void ОбновитьКнигу (string avtor, string name, int year, string new_avtor, string new_name, int new_year)
{
for (int i = 0; i < data.Length; i++)
if ((year == data [i].ГодИздания) && (data [i].ФамАвт == avtor) && (data [i].НазваниеКниги == name))
{
data [i].ФамАвт = new_avtor;
data [i].НазваниеКниги = new_name;
data [i].ГодИздания = new_year;
}
}
/// < summary>
///Сортировка массива данных о книгах по фамилии автора
/// </summary>
public void СортировкаПоАвтору ()
{
Book b;
for (int i = 0; i < data.Length — 1; i++)
for (int j = i; j < data.Length; j++)
if (String.Compare (data [i].ФамАвт, data [j].ФамАвт) > 0)
{
b = data [i];
data [i] = data [j];
data [j] = b;
}
}
/// < summary>
/// Сортировка массива данных о книгах по названию книги
/// </summary>
public void СортировкаПоНазванию ()
{
Book b;
for (int i = 0; i < data.Length — 1; i++)
for (int j = i; j < data.Length; j++)
if (String.Compare (data [i].НазваниеКниги, data [j].НазваниеКниги) > 0)
{
b = data [i];
data [i] = data [j];
data [j] = b;
}
}
public void СортировкаПоГодам ()
{
Array.Sort< Book> (data, this);
}
/// < summary>
/// Определяет количество элементов массива данных
/// </summary>
/// < returns> Возвращаемый результат-количество элементов массива</returns>
public int КоличествоКниг ()
{
return data.Length;
}
#region Члены IComparer< Book>
public int Compare (Book x, Book y)
{
return x.ГодИздания — y.ГодИздания;
}
#endregion
}
class Program
{
static void Main (string [] args)
{
Books books = new Books ();
int v = 0;
do
{
Console.Clear ();
Console.Write (
@«Введите задание
0-ВЫХОД;
1-ввод данных;
2-вывод данных;
3-сортировка по автору;
4-сортировка по названию;
5-обновить книгу;
6-найти книги по автору и годам;
7-Сортировка неизвестно по каким признакам; : «);
try {
v = int.Parse (Console.ReadLine ());
if (v == 1)
{
Console.Write („Введите имя файла с данными (ввод пустой строки — чтение с консоли): “);
string str = Console.ReadLine ();
if (str == »«)
{
Console.WriteLine («Введите информацию о книгах (фамилия автора, название книги, год издания). Информацию о каждой книге вводите в одной строке. Для прекращения ввода введите символ ~.»);
books.ВводИз (Console.In);
}
else
{
StreamReader sr = new StreamReader (str);
books.ВводИз (sr);
sr.Close ();
}
Console.WriteLine («Ввод данных завершён...»);
}
if (v == 2)
{
Console.Write («Введите имя результирующего файла (ввод пустой строки — чтение с консоли): »);
string str = Console.ReadLine ();
if (str == «„)
{
if (books.КоличествоКниг ()! = 0)
books.ВыводНа (Console.Out);
else
Console.WriteLine („Данных нет! “);
}
else
{
StreamWriter sw = new StreamWriter (str);
books.ВыводНа (sw);
sw.Close ();
}
Console.WriteLine („Вывод данных завершён...“);
}
if (v == 3)
{
books.СортировкаПоАвтору ();
Console.WriteLine („Сортировка по автору завершена...“);
}
if (v == 4)
{
books.СортировкаПоНазванию ();
Console.WriteLine („Сортировка по названию завершена...“);
}
if (v == 5)
{
Console.Write („Введите имя автора: “);
string name1 = Console.ReadLine ();
Console.Write („Введите название книги: “);
string name2 = Console.ReadLine ();
Console.Write („Введите год издания книги: “);
int year1 = int.Parse (Console.ReadLine ());
Console.WriteLine („Если Вы не хотите изменять некоторые запрашиваемые параметры, передайте пустую строку.“);
Console.Write („Введите новое имя автора: “);
string name12 = Console.ReadLine ();
if (name12 == “»)
name12 = name1;
Console.Write («Введите новое название книги: »);
string name21 = Console.ReadLine ();
if (name21 == «„)
name21 = name2;
Console.Write („Введите новый год издания книги: “);
int year2 = int.Parse (Console.ReadLine ());
if (year2.ToString () == “»)
year2 = year1;
//Console.WriteLine («Массив обновленных данных: »);
Console.WriteLine («");
books.ОбновитьКнигу (name1, name2, year1, name12, name21, year2);
Console.WriteLine («Данные обновлены...»);
}
if (v == 6)
{
Console.Write («Введите имя автора: »);
books = books.НайтиКнигуПоФамилии (Console.ReadLine ());
Console.Write («Введите начальный год поиска: »);
books = books.НайтиКнигиСГодомБольшимЛибоРавным (int.Parse (Console.ReadLine (:);
Console.Write («Введите Конечный год поиска: »);
books = books.НайтиКнигиСГодомМеньшимЛибоРавным (int.Parse (Console.ReadLine (:);
}
if (v == 7)
{
//Array.Sort< Живое> (data, data [0]);
//Console.WriteLine ();
//Array.Sort< Book> (books.data [], books);
books.СортировкаПоГодам ();
books.ВыводНа (Console.Out);
}
} catch {
Console.Write ( «error» );
} Console.WriteLine ();
Console.Write («Для продолжения нажмите Enter...»);
Console.ReadLine ();
} while (v! = 0);
}

} }

Господа, по моему нас тролят!

По делу: этот иксепшн типичный признак бесконечной рекурсии. Надо не стек увиличивать, а багу править. Код в студию.

Что означает сообщение: Process is terminated due to StackOverflowEcseption?

http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx

Как поступать в таком случае и чем вызвана ошибка?

StackOverflowException is thrown for execution stack overflow errors, typically in case of a very deep or unbounded recursion.

Это.Net что-ли? Нет, правильный подход для.Net, out of stack — увеличить размер стека:) Посмотрите внимательно все обработчики exception’ов у себя в коде, как правило такие ошибки вызываются рекурсивными исключениями из обработчика исключений.

Что означает сообщение: Process is terminated due to StackOverflowEcseption? Как поступать в таком случае и чем вызвана ошибка?

Типа добавить еще один элемент и все...

На то он и стэк, имхо

Ну и вопрос! эээ... stack какой? где? когда? и главное для чего

2seniour_dev — ой и не воспринимайте

вообщето...

как наезд, просто так получилось приложение...

просто мне показалось что человек хочет управлять размером стека на лету

2seniour_dev — вообщето спрашивали про програмную реализацию, а не правку make-file так как я понял человек хочет менять размер стека на лету, а не compile time,
если нужно поменять для рутового треда, то просто считайте IMAGE_OPTIONAL_HEADER из файла, поставьте нужный размер и запускайте себе новое приложение с нужным стеком:)
как считать можно найти в инете:), первая ссылка support.microsoft.com/kb/90493

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

параметер dwStackSize нужно вместе с флагом STACK_SIZE_PARAM_IS_A_RESERVATION и учесь что этот способ не поможет изменить рамер стека главного потока.
Дело в том что значений размера стека целых два — начальный размер и сколько резервируется под стек. Писать во второй параметер большие значения не очень хорошо — лишняя трата ресурсов. Но иногда, если на компе много памяти и хотят оптимизировать какой-нибуть сервер, этот размер увеличивают.

обычно стек у бинарника увеличивают с помощью утилиты editbin опций /STACK: reserve [, commit]

точно про ОСь забыл, но учитывая что 7ка поддерживает POSIX конфигурацию, то можно предположить что это должно работать:

computing.llnl.gov/...pthreads/#Stack

Скорее всего User mode тогда держите ссылочко: msdn.microsoft.com/...ibrary/ms682453 (VS.85).aspx
там есть замечательный параметр:

__in SIZE_T dwStackSize,

Підписатись на коментарі