Обсуждение:Программирование на языке Си/§7

Содержимое страницы недоступно на других языках.
Материал из Викиверситета

just-a-guest написал: Мне кажется или задача №2 не совсем корректно составлена? Не рискну ее редактировать, может я чего не понимаю, но вроде бы здесь

  1. define N 10

void main() {

 int mat[N][N], n, yd=1,i,j,sum,sumt; 

/*где n - размерность матрицы

     yd - идентификатор, если 1 матрица "магическая", иначе нет.
     sum - сумма элементов главной диагонали
     sumt - сумма элементов строки, столбца, второй диагонали
  • /
 puts ("введите размерность квадратной матрицы\n");
 scanf("%i",&n);
 puts ("введите матрицу по строчно");
 for(i=0;i<n;i++)
  {
       printf("%i строка\n",i+1);
       for(j=0;j<n;j++)
         scanf("%i",&mat[i][j]);
   }

BANG! Размерность матрицы константа (10), а я ввожу скажем 15 на соответствующий вопрос. И здесь

         for(j=0;j<n;j++)
         scanf("%i",&mat[i][j]);

как только j==11, программа вылетает с ошибкой записи в несуществующую часть массива. P.S. Кстати, а как в самом деле инициализовать массив, размер которого заранее неизвестен? Т.е. не константа?

just-a-guest написал: Посещаемость жжет! Мне так и ответили ) Собственно по теме:

а как в самом деле инициализовать массив, размер которого заранее неизвестен?

Называеться динамический массив, инициализуеться так: int str = 100; char *mas = new char [str]; Создали указатель на массив символов (mas) размером "str". Дальше по мере надобности меняем этот размер на любое, нужное число (конечно в пределах разумного).

P.S. Тут странно сделано обсуждение -- вместо добавления новых записей можно редактировать все. Поэтому большая ко всем просьба: пожалуйста, пишите свои ники, при добавлении сообщений.

P.S. Почему бы вам не зарегистрироваться .. сможете работать через ник, а не через IP.

* А вообще Си - это прошлый век, рекомендую С#

  • С может быть, а вот С++ нет. В принципе у меня в визуал студии он тоже есть (кстати, как произноситься С# ?), но не вижу разницы.
  • Имхо, есть:
  • 1. Ассемблер.
  • 2. С/С++/С#, Pascal (читайте Delphi), Java.
  • 3. Все остальные.
  • Кроме асма все отличаются только синтаксисом. И поскольку С++ сейчас самый распространеный -- на него делают лучшие компиляторы.
  • <a few offtop>Кстати на тему выбора языка пара ссылок 1. и 2. :) Прям не поленился найти. Где-то тема была на одной странице, но видимо удалили.</a few offtop> 95.153.178.69 23:18, 25 января 2011 (UTC)just-a-guest[ответить]
    • Конечно, если будите писать что-то низкоуровневое С++ надо знать, но если что-то с интерфейсом пользователя и крупное - сразу почувствуете разницу, я уже не говорю о том, что дебагер и редактор C# крайне удобен (и не встречал ни в одном другом языке). Лишь некоторые различия - система событий, не нужны .h файлы, + более строгий подход к ООП. --S.J. 09:31, 26 января 2011 (UTC)[ответить]
  • Да, насчет интерфейса пользователя вы верно подметили. В свое время, по некоторым причинам так и не доучил Delphi. Теперь(аж только после армии:( ) взялся за голову, но перешел на С++(перешел потому, что наиболее популярный язык для работодателей, (ну еще 1С-бухгалтерия :) ) и проще уместить тоже кол-во кода на меньшем пространстве(например вместо "begin...end" просто "{...}")). И оказался в шоке -- где же столь часто мной применяемые мною формочки, кнопочки, едиточки (это не имя ) )? Как же программировать? Сейчас стало ясно: нечего ставить себе всякие Визуал Студии. У меня от Microsofta и так винда стоит -- мало что-ли? У того же Borland'a в С++ очень много всяких компонентов(Хотя как-то видел видео со Студией на заднем плане, с компонентами, но в чем соль, так и не понял -- нет их там). Т.е. это от языка не зависит -- от IDE.
  • Насчет отсутствия .h файлов -- да, это просто великолепно, ставлю плюс С# (я и так работаю в двух -- мне не жалко ) ).
  • По поводу ООП (О_о что это?!!) Если серьезно я до него еще толком не дошел.
  • Дебаггер у меня, в визуал студии крайне бестолковый (и на все языки, я так понимаю там должен быть один) Лучше использовать что-то стороннее -- к примеру OllyDbg). Но вообще при разработке приложений, пока еще ни разу не сталкивался с необходимостью им пользоваться -- может от того, что не писал пока ничего серьезного? Обычно он применяеться с иными намерениями ;)

Конечно, если будите писать что-то низкоуровневое С++ надо знать

  • Я не представляю -- как возможно писать что-то низкоуровневое?! Нет -- я не спорю, люди делают -- видели такую вещь, как .kkrieger? Весит всего 98Кб. Как туда все это можно было запихнуть (сделано на С++, с ассемблерными вставками), я не представляю, если скомпилированный, ничего не делающий проект весит 6(!)Кб? 95.153.167.26 14:49, 26 января 2011 (UTC)just-a-guest[ответить]
    • О! не писал пока ничего серьезного?+ По поводу ООП (О_о что это?!!) Если серьезно я до него еще толком не дошел. - как только дойдете, и начнете писать - вспомните что я вам советовал :) А брать все сторонние замучаетесь (+ еще про базы данных надо вспомнить), в Студии + С# все в куче и идеально (а проходили мы многое :) ) --S.J. 15:15, 26 января 2011 (UTC)[ответить]
    • Низкоуровневое - это в смысле драйверы, компиляторы и т.п., где ООП вредно и незя. --S.J. 15:18, 26 января 2011 (UTC)[ответить]
  • Ладно, уговорили: обязательно гляну Си Шарп. Но в любом случае сейчас уже надо добивать Си Плюс-Плюс, иначе смысла учить нет. Никто ведь не запрещает быть полиглотом, хм? ) Судя по похожим названиям, я так полагаю, у них синтаксис не сильно различаеться -- просто надо под особенности подстроиться.
  • Кстати насчет С++ : а вы не в курсе случайно -- почему такая ситуация: написал

double dbl = 0; dbl = dbl + 2;

Подчеркивается красной линией знак присваивания, с надписью " Error: no operator "=" matches thеsе operands"?
  • P.S. Написал тоже самое в С# - надо же: никаких ошибок! :(
  • P.P.S. Сделал выше упомянутую операцию, и аж обзавидовался -- редактор сам выводит варианты того, что дальше писать! Да-а... Я вас понимаю. Собственно эта та причина по которой я хочу снести Студию и поставить Борланд С++ -- там тоже самое.
  • P.P.P.S. Для чего я этого до сих пор не сделал (особенно начинающим не рекомендую делать) -- пока еще лучше все вводить как во времена Истинно Больших Машин IBM -- вручную (до перфокарт все же доходить не стоит -- займет поболя времени, да и перемкнуть чего не то может при попытке запихать куда-то в район ПЗУ. Особенно не приятно осознавать, что что-то однозначно происходит, ведь ОС вывела сообщение о наличии нового девайса и отсутвии дров на него. Неприятно в основном по причине перфокарты в левой руке, уведеной далеко в сторону от компьютера и присутствия правой руки где-то в недрах системного блока. Хотя я могу быть и не прав -- это личное мнение: ведь, в принципе это гарантирует лучшее понимание аппаратной части ПК ) ). Для лучшего усвоения материала. А позже, для работы можно и чего попроще взять. (Включая и С#) ) 95.153.182.76 22:01, 26 января 2011 (UTC)just-a-guest[ответить]

Кстати (я только сейчас вспомнил название символа) для подписи используються 4-ре тильды. А слэш это "/". 95.153.164.19 23:56, 26 января 2011 (UTC)just-a-guest[ответить]

  • Не знаю, у меня в С++ все нормально проходит эта элементарная конструкция. Точно тильда, я напутал ;) --S.J. 01:12, 27 января 2011 (UTC)[ответить]
  • Борланд думаю уступает, в C# там еще можно легко перейти к объявлению метода/свойства, находить все места где используется переменная или где вызов метода, делать мелкие рефакторинги типа переименновать свойство и автоматически заменит во всех местах и т.п. --S.J. 01:16, 27 января 2011 (UTC)[ответить]
  • А дебагер уникален тем, что можно прямо под дебагером продолжать программировать, удобно когда нужно написать сложные места или подправить что-то, зная значения переменных при выполнении. --S.J. 01:17, 27 января 2011 (UTC)[ответить]
  • Точно, точно, извиняюсь моя вина. Ввел в заблуждение и себя и вас еще спросил. Писал только ту часть кода где, как я подумал ошибка. Собственно:

double dbl = 0; std::cout <<" Double is equal " << (dbl = dbl + 2); Ошибка, что не поставил скобки.

  • Прошу простить: к сожалению (или к счастью?) надо на работу (небольшой "отпуск" закончился) -- ближайшие дней 5 обещаю в обсуждении не учавствовать (в смысле ввиду отсутствия компьютера в рейсе). Это я, пишу, что-б без обид насчет "неотвечания" на топики.
  • P.S. Как здесь скрытый текст писать -- <spoiler> не работает? Просто код в него намного лучше вставлять. В обсуждении потом проще разобраться. 95.153.163.34 18:21, 27 января 2011 (UTC)just-a-guest[ответить]

Господа, а каким образом выделяется память под динамический массив? Например, если я в процессе выполнения программы переопределяю переменную, задающую размерность, массив новой размерности займёт совершенно другую область памяти, или совпадающие по существующим номерам ячейки массива будут лежать в тех же ячейках памяти? Массив занимает память всё время работы программы? Если так, то как освободить занимаемую им память после того, как он стал ненужен? Fingertouch 08:35, 24 октября 2011 (UTC)[ответить]