Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.65/34: Рейтинг темы: голосов - 34, средняя оценка - 4.65
183 / 121 / 26
Регистрация: 18.05.2015
Сообщений: 509

С++ с нуля

20.02.2022, 23:08. Показов 7747. Ответов 101

Студворк — интернет-сервис помощи студентам
Всем привет!
не кидайте тапками )
Изучаю Си и Си++ с нуля, книга Стивен Прата, и некоторые примеры набираю в Visual Studio, создал файл с расширением .с
Залез в компилятор и установил старый, msvc, но это не прокатывает.

Не компилируется, хотя в книге написано должно C90

int m = 3;
int a[m];

выходит ошибка.
.
Как посоветуете изучать си и си++?
Какой стандарт выбрать?

Всем удачи и здоровья!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.02.2022, 23:08
Ответы с готовыми решениями:

Сравнить два массива на чисела: больше нуля, меньше нуля и равно нулю
С помощью множества сравнить два массива на чисел: больше нуля, меньше нуля и равно нулю.

Вычислить среднее арифметическое элементов, расположенных до первого нуля и после последнего нуля
В одномерном массиве, состоящем из п элементов, вычислить: среднее значение элементов, расположенных в массиве между первым последним...

Посоветуйте книгу или статью по OpenGL с нуля (на языках любых кроме Delphi). С нуля
Посоветуйте книгу или статью по OpenGL с нуля (на языках любых кроме Delphi). С нуля. Я сколько не побывал искать, находил и не могу...

101
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
21.02.2022, 21:27
Студворк — интернет-сервис помощи студентам
tahir_, после C++ перейти на Си не трудно (если вдруг вообще такая надобность вдруг возникнет)

Не по теме:

Правда, будет мучать тоска по конструкторам и деструкторам (и другим удобствам)

1
2405 / 1936 / 763
Регистрация: 27.07.2012
Сообщений: 5,575
21.02.2022, 21:38
Цитата Сообщение от tahir_ Посмотреть сообщение
Идея была Си изучить потом Си++
Раз она продолжение Си, то мне показалось так правильнее.
Это неправильная постановка вопроса. Си - язык процедурного программирования: функции, переменные и вот это всё. С++ же объектно-ориентированный ЯП, соответственно на его основе можно изучать ООП как другой, более высокоуровневый, подход к решению задач. И последовательное изучение Си, а потом С++ надо рассматривать именно в контексте последовательного изучения сначала процедурного стиля программирования и перехода к ООП. В этом плане их синтаксическая схожесть с одной стороны помогает быстрее получить практические результаты, но с другой может затормозить переход от одной парадигмы программирования к другой.

Добавлено через 1 минуту
Цитата Сообщение от Алексей1153 Посмотреть сообщение
если вдруг вообще такая надобность вдруг возникнет
Всякие микроконтроллеры и прочие низкоуровневые вещи ещё долго будут жить на С. В реальной работе такая надобность вполне вероятна.
2
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
21.02.2022, 21:51
John Prick, кто с контроллерами возится - он так и будет на Си работать. А ТС явно контроллерами не занимается
1
2405 / 1936 / 763
Регистрация: 27.07.2012
Сообщений: 5,575
21.02.2022, 22:08
Цитата Сообщение от Алексей1153 Посмотреть сообщение
кто с контроллерами возится - он так и будет на Си работать.
Задачи нынче сложнее становятся. К контроллерам часто надо ещё утилитки на ПК писать, и даже в какую-нить общую систему встраивать, где и удалённое управление может быть, и веб, и т.п. Да и границы между контроллерами и миникомпьютерами под операционкой понемногу стираются, а там уже и С++ вступает.
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
21.02.2022, 22:39
Цитата Сообщение от John Prick Посмотреть сообщение
Это неправильная постановка вопроса. Си - язык процедурного программирования: функции, переменные и вот это всё. С++ же объектно-ориентированный ЯП, соответственно на его основе можно изучать ООП как другой, более высокоуровневый, подход к решению задач.
В C++ конструкторы и деструкторы вызываются автоматически, в Си ты ручками прописываешь вызов regcomp и regfree. Которые все равно конструируют и разрушают объекты из объектно-ориентированного ЯП. В C++ ты пишешь sort(array.begin(),array.end()) и компилятор сам инлайнит все нужные компараторы. В Си ты пишешь вырвиглазное qsort(arrayBegin,arrayEnd-arrayBegin,sizeof(T),&objectComp) с очень "эффективными" указателями на функции вместо инлайна. Это правильнее называть не "процедурным программированием", а велосипедами и костылями.
1
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
21.02.2022, 23:04
Вот например игра "Морской бой" человек с компьютером. Есть поле 10х10, есть 2 персонажа - чел и комп, которые хоть и играют в одну игру, алгоритм действий у них разный: чел просто вводит координаты хода, комп должен рассчитать свой ход (хоть рэндомом, чем сложнее - тем лучше будет его игра). Есть корабль, есть отдельные палубы, из которых корабль состоит. Вот собсна и всё.
Как сделать процедурным программированием - понятно. Поле - статический массив 10х10. Корабли и вообще картинка на экране - числа в массиве. Ходы - функции, и т.п.

Вопрос - как тут прикрутить ООП, что делать классом - поле, игроков, корабли? От чего чему наследоваться - ну, что-бы было полноценное ООП?
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
21.02.2022, 23:14
alexu_007, зачем обязательно наследоваться ? Класс поля, класс корабля, класс игрока
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
21.02.2022, 23:15
Цитата Сообщение от alexu_007 Посмотреть сообщение
Вопрос - как тут прикрутить ООП, что делать классом - поле, игроков, корабли? От чего чему наследоваться - ну, что-бы было полноценное ООП?
Допустим, чтобы рассчитать свой ход, комп мысленно расставляет неизвестные ему корабли так, чтобы они не пересекались с уже известными. И потом стреляет по этим воображаемым кораблям, понадеявшись что расставил их правильно. Вот, значит, в "воображении" компа появляется еще одно поле. А раз полей стало два, лепим для них класс. Теперь, один из игроков палит во вражеский кораблик и подбивает одну клеточку. Нужно сказать ранен корабль или убит. Для этого нам надо где-то запомнить сколько у кораблика осталось хитпоинтов. Делаем еще один класс.

Короче, в чем проблема то? Все прекрасно оформляется в ООП-стиле.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
21.02.2022, 23:29
Цитата Сообщение от alexu_007 Посмотреть сообщение
Как сделать процедурным программированием - понятно.
Сделать также в C++, ведь это мультипарадигменный язык.
0
2405 / 1936 / 763
Регистрация: 27.07.2012
Сообщений: 5,575
21.02.2022, 23:35
Цитата Сообщение от alexu_007 Посмотреть сообщение
Вот например игра "Морской бой" человек с компьютером.
<...>
Вопрос - как тут прикрутить ООП <...>?
Вопрос. Но я бы начал не с него, а вот с этого:
Цитата Сообщение от alexu_007 Посмотреть сообщение
Как сделать процедурным программированием - понятно. Поле - статический массив 10х10. Корабли и вообще картинка на экране - числа в массиве. Ходы - функции, и т.п.
Не сказал бы, что так уж и понятно. Например, поле - массив чего? Чисел int? А что это за числа? Символов? Поле содержит игровую информацию и одновременно элементы визуализации? Ну так себе решение: если вдруг надо будет что-то поменять в логике игры или дизайне, придётся менять и логику и дизайн.

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

И вот уже вырисовывается то, что в объектном варианте станет классом. Собственно, общая структура программы при переходе на ООП останется во многом схожей, но модульность станет более отчётливой. Взаимодействие игровых сущностей перейдёт от прямой записи переменных к вызову коллбэков, например, при изменении (попадании) в поле. То, что в функции в процедурном варианте передавалось указателем на структуру, станет классом, а эти функции - его функциями-членами. И т.д. и т.п.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
22.02.2022, 00:49
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Класс поля, класс корабля, класс игрока
Поле это двумерный массив с цифрами, например: 0 - ничего нет, 1 - палуба, 2 - раненая палуба, 3 - убитая палуба, 4 - мимо и т.д. Для игры нужно два поля. Разница только в том, что на поле компа не отображаются единички (человек не видит куда стреляет). Зачем тут нужен класс, если можно обойтись простыми массивами - непонятно.

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

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

Добавлено через 2 минуты
Цитата Сообщение от John Prick Посмотреть сообщение
Например, поле - массив чего? Чисел int? А что это за числа?
Поле - массив чисел int. А в зависимости от этих чисел на экран выводятся картинки. Ну, имеется ввиду графический интерфейс, не в консоли же...

Добавлено через 3 минуты
Цитата Сообщение от John Prick Посмотреть сообщение
Выходит, что поле - это, скорее, должен быть массив структур с информацией о том, что содержит поле, текущее состояние, возможно, указатель на корабль на этом поле и т.д. А за отображение будет отвечать уже другой модуль, содержащий функции, которые умеют представить игровое поле в визуально понятном виде.
Ну вот, этого я и боялся. Из простой и понятной программы вырастает трудно представимый монстр: массив структур, текущее состояние, указатели на корабли...

Добавлено через 14 минут
Цитата Сообщение от John Prick Посмотреть сообщение
Взаимодействие игровых сущностей перейдёт от прямой записи переменных к вызову коллбэков, например, при изменении (попадании) в поле. То, что в функции в процедурном варианте передавалось указателем на структуру, станет классом, а эти функции - его функциями-членами. И т.д. и т.п.
При "выстреле" генерируются (неважно как) всего две координаты. И проверяется, что по этим координатам находится в таблице. Если ноль - это просто мимо. Если туда уже был выстрел (или это область вокруг убитого корабля, где не может быть ничего, т.к. корабли не соприкасаются) - ошибка. Не будем наживаться на ошибочных кликах человека "не туда". Интерес представляет только попадание - компьютер (и человек) должен дать ответ "ранен" или "убит". Ну это несложно сделать функцией - достаточно проверить поля сверху-снизу-справа-слева. Если там есть ещё неубитая палуба корабля - значит ранен. Так что можно (и не очень сложно) обойтись без структур, указателей и т.п.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
22.02.2022, 00:52
Цитата Сообщение от alexu_007 Посмотреть сообщение
Но это так же легко реализовать и функциями. Каких-то значительных преимуществ я не вижу.
Упорядочивание функций, относящихся к кораблю, к игроку, к полю и т.д.

Точно так же как в С упорядочиваешь переменные по структурам (хотя ничто не мешает хранить все переменные отдельно, и передавать в аргументы функции отдельно) так в С++ функции упорядочиваются по классам.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,538
Записей в блоге: 1
22.02.2022, 04:40
alexu_007, сильное впечатление складывается, что все твои вопросы в этой теме - риторические.
Ты их задаёшь, получаешь ответ... и тут же начинаешь с ответом спорить и пытаться его опровергнуть.
Тебе в этой теме ответы нужны или пустой холивар? Если ты и так всё для себя решил, зачем прикидываешься наивным новичком, который не знает ничего про С++???

-Ой, Вот это написано на С или С++? Я тут новичок и ничего не знаю!
-Вот тебе ответ...
-Атыдокажи ахаха-лол, а вот тебе ещё пачка вопросов: а это скомпилируется? а С++ это Си с классами? Нафига учить устаревшие сишные циклы, отвечай мне да или нет? Или вот про Морской бой...?
Очень напоминает эту отвратительную стереотипную еврейскую манеру риторики. Вопросом на вопрос, вопросом на вопрос. И все вопросы риторические...
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
22.02.2022, 06:15
alexu_007, класс - это чёрный ящик. И неважно, массив у него там внутри или база данных. Для прототипирования можно накидать пустышки классов с методами - вообще без данных

Добавлено через 2 минуты
alexu_007, в Си ты точно так же используешь классы, только каждый класс у тебя размазан ровным слоем по всему коду, из-за чего становится сложно его модифицировать, а иногда - и просто работать с ним

в реальном мире всё состоит из объектов, поэтому объекты - это естественный способ моделирования.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
22.02.2022, 06:44
Цитата Сообщение от Алексей1153 Посмотреть сообщение
alexu_007, в Си ты точно так же используешь классы, только каждый класс у тебя размазан ровным слоем по всему коду, из-за чего становится сложно его модифицировать, а иногда - и просто работать с ним
Это не совсем так, но спорить дальше неохота. Сдаюсь.
0
2405 / 1936 / 763
Регистрация: 27.07.2012
Сообщений: 5,575
22.02.2022, 08:58
Цитата Сообщение от alexu_007 Посмотреть сообщение
Ну вот, этого я и боялся. Из простой и понятной программы вырастает трудно представимый монстр: массив структур, текущее состояние, указатели на корабли...
Простота - понятие относительное. Любая программа по мере разработки начинает обрастать мелкими деталями, которые не учитывались при первых набросках типа "тут поле-массив 10х10, корабли, ну понятно..." И в скором времени за ворохом этих мелочей начинает теряться вся суть.

Вот взять даже приведнное вами:
Цитата Сообщение от alexu_007 Посмотреть сообщение
При "выстреле" генерируются (неважно как) всего две координаты. И проверяется, что по этим координатам находится в таблице.
Да, вроде бы, действительно проще некуда, однако далее следует:
Цитата Сообщение от alexu_007 Посмотреть сообщение
Интерес представляет только попадание - компьютер (и человек) должен дать ответ "ранен" или "убит". Ну это несложно сделать функцией - достаточно проверить поля сверху-снизу-справа-слева. Если там есть ещё неубитая палуба корабля - значит ранен.
Так, что у нас тут? Значит при попадании в поле, если там корабль, то смотрим соседние поля, и если там корабль, но без попадания. то "ранен", а если с попаданием или нет корабля - то "убит". Только в одном этом предложении 3 ветвления. Хотя это ведь ещё не все случаи. А если мы попали в "край" корабля, который в центре уже подбит, а с другого края ещё нет? Значит просмотра соседних полей не достаточно, надо идти по всем, где может быть корабль. А потом ещё, если он будет всё-таки убит, проделать эту операцию заново, чтобы исключить из игры соседние с кораблём поля. Чё-т как-то уже не так уж "просто и понятно" становится.

В объектно-ориентированном коде обработка попадания была бы примерно такой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void GameMap::processShot(int x, int y) {
    fields[x][y].processShot();
}
 
void Field::processShot() {
    if (ship != nullptr)
        ship->takeShot();
}
 
void Ship::takeShot() {
    --lives;
    if (lives == 0)
        notifyDead();
}
Понятно, что полные определения классов будут иметь приличный объём кода, но для демонстрации "монструозности и труднопредставимости" хватит и этого.
0
 Аватар для vlisp
1070 / 991 / 153
Регистрация: 10.08.2015
Сообщений: 5,416
22.02.2022, 11:04
число элементов массива должно быть постоянным, поэтому
Цитата Сообщение от tahir_ Посмотреть сообщение
int m = 3;
int a[m];
не имеет смысла
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
22.02.2022, 11:11
Цитата Сообщение от vlisp Посмотреть сообщение
число элементов массива должно быть постоянным
Это variable-length array. Разрешено в Си, в плюсах доступно как расширение компилятора. Если мне память не изменяет, планировалось и в стандарт плюсов внести, то все утонуло в каких-то спорах о деталях реализации.
0
 Аватар для YUEN HOIFEF
252 / 185 / 47
Регистрация: 31.01.2021
Сообщений: 934
22.02.2022, 11:42
vlisp,
Ничего необычного, так-же, если увидете:
C++
1
2
3
4
void func( int m, int a[ m ] )
  {
......
  }
Это v.l.a

Добавлено через 2 минуты
не имеет смысла
Так-что есть, смысл...
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
22.02.2022, 12:08
Цитата Сообщение от John Prick Посмотреть сообщение
Хотя это ведь ещё не все случаи.
Я не стал полностью алгоритм описывать. Понятно, в реальности чуть сложнее, там рекурсией выполняется обход всех раненых палуб, если не находится не раненой - значит убит.

Цитата Сообщение от John Prick Посмотреть сообщение
А потом ещё, если он будет всё-таки убит, проделать эту операцию заново, чтобы исключить из игры соседние с кораблём поля.
Ну да, совершенно верно, и тоже рекурсией - выполняется обход убитого корабля и выставляется защитное поле (я так его назвал). Кликнуть в защитное поле ещё раз мышкой бесполезно - не сработает. Вот так это выглядит на игровом поле - звёздочки - выстрелы мимо, более тёмная "вода" вокруг убитого корабля - защитное поле. На снимке есть и раненые и убитые корабли:
Миниатюры
С++ с нуля  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.02.2022, 12:08

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

Посоветуйте книгу или статью по DirectX с нуля (на языках любых кроме Delphi). С нуля
Посоветуйте книгу или статью по DirectX с нуля (на языках любых кроме Delphi). С нуля. Я сколько не побывал искать, находил и не могу...

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

Двухмерный массив. Вычислить количество строк, сумма элементов которых меньше нуля, равна нулю или больше нуля
В двухмерном массиве вычислить количество строк, сумма элементов которых меньше нуля, равна нулю или больше нуля. Добавлено через 7...

Расстояние от нуля экрана до нуля документа
в документе одни координаты, а при открытии окон другие... как бы выяснить разницу, состоящую в толщине toolbar'a браузера и title окна,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru