Информация: Уважаемые посетители! В течение нескольких месяцев на форуме существовала проблема с регистрацией новых пользователей, о которой администрации стало известно недавно. Если вы ранее пытались зарегистрироваться на форуме, но не получили на ваш e-mail письмо с ссылкой для подтверждения регистрации, просим вас зарегистрироваться повторно. Приносим извинения за доставленные неудобства. Если вы все еще испытываете проблемы с регистрацией на форуме, обратитесь за помощью на e-mail: mr.angelo@railroadsim.net

Вопросы по языкам C,C#,С++

Всё о компьютерном железе и программах

Вопросы по языкам C,C#,С++

Сообщение ALSN » 22.11.2011, 18:39

Вопросы по языкам C,C#,С++

Задаём вопросы по языкам C,C#,С++.

1. Помним про подключаемые библиотеки:
Например, если у вас в коде есть переменная типа string , то без строки #include <string> в начале кода, она работать не будет.

2. Помним основные переменные :
int - целочисленный тип данных (целое число)
float - тип данных с плавающей запятой (дробь)
double - тип данных с плавающей запятой двойной точности (более точная дробь)
char - символьный тип данных (символ)
bool - логический тип данных (правда или ложь)
long - приставка к переменным, уединяет их объём.

3. Помним про локали :
Для корректного отображения кириллицы (буквы русского языка) в int main добавляем строчку setlocale(0, ""); или setlocale(LC_ALL, "Russian");.

4. Помним про "=" :
Если требуется сравнить переменные (с помощью if и else), то пишем ==.
Если в условии мы напишем if (PEREMENNAYA = 101), то мы присвоим переменной PEREMENNAYA значение 101, и в программе будут ошибки.

5. Помним про "()" :
Даже если у функции или чего либо нет аргументов, то пустые скобки ставить всё равно обязательно.

6. Указатели для переменных продлевают срок жизни оперативной памяти :
Для создания переменной с указателем:
ТИП_ПЕРЕМЕННОЙ *НАЗВАНИЕ = new ТИП_ПЕРЕМЕННОЙ(ЗНАЧЕНИЕ ПЕРЕМЕННОЙ);
Для удаления:
delete НАЗВАНИЕ_ПЕРЕМЕННОЙ;

И причём, переменные удаляются в порядке, обратном порядку их создания.

Пример:
Код: Выделить всё
using namespace std;
int main()
{
    int *a = new int; // Объявление указателя для переменной типа int
    float *b = new float(5); // Инициализация указателя

    *a = 10;
    *b = *a + *b;
    delete b
    delete a;
    return 0;
}
Последний раз редактировалось ALSN 29.01.2012, 19:46, всего редактировалось 3 раз(а).
Аватара пользователя
ALSN
 
Сообщения: 227
Зарегистрирован: 09.08.2011, 11:35
Откуда: Москва
Благодарил (а): 167 раз.
Поблагодарили: 122 раз.
Блог: Просмотр блога (6)
Играю в: Train Simulator Classic
Роль: Фотограф
Имя: Игорь

Re: Вопросы по языкам C,C#,С++

Сообщение ALSN » 22.11.2011, 18:39

А вот мои вопросы (по языку C++):
1. Есть ли какой-нибудь тип переменной, который сможет принять значение нескольких английских букв? А то char наотрез отказался принимать такое значение.
2. Сейчас я пишу программу, и у меня набралось много void-ов, я вынес их в отдельный functions.cpp файл, но при подключении этого файла к main.cpp компилятор выдаёт ошибку. Пожалуйста, покажите (или дайте ссыль) как правильно подключать .cpp файлы.
Аватара пользователя
ALSN
 
Сообщения: 227
Зарегистрирован: 09.08.2011, 11:35
Откуда: Москва
Благодарил (а): 167 раз.
Поблагодарили: 122 раз.
Блог: Просмотр блога (6)
Играю в: Train Simulator Classic
Роль: Фотограф
Имя: Игорь

Re: Вопросы по языкам C,C#,С++

Сообщение kemal » 22.11.2011, 19:19

1 нужно использовать строку.
2 что такое много void-ов???
<kuid:216981:******>
куид.ру не нужен
Аватара пользователя
kemal
 
Сообщения: 375
Зарегистрирован: 10.02.2006, 18:21
Откуда: Казань
Благодарил (а): 4 раз.
Поблагодарили: 7 раз.
Блог: Просмотр блога (4)
Играю в: Auran Trainz
Роль: Разработчик
Имя: Камиль

Re: Вопросы по языкам C,C#,С++

Сообщение Mita » 22.11.2011, 20:00

Попугай писал(а):А вот мои вопросы (по языку C++):
1. Есть ли какой-нибудь тип переменной, который сможет принять значение нескольких английских букв? А то char наотрез отказался принимать такое значение.
2. Сейчас я пишу программу, и у меня набралось много void-ов, я вынес их в отдельный functions.cpp файл, но при подключении этого файла к main.cpp компилятор выдаёт ошибку. Пожалуйста, покажите (или дайте ссыль) как правильно подключать .cpp файлы.


>>1. Есть ли какой-нибудь тип переменной, который сможет принять значение нескольких английских букв? А то char наотрез отказался принимать такое значение.

Маcив чаров, он же строка, char* str = .....
Ну или std::string, CSrting (MFC) и так далее. Дофига разных стриногв есть.


А вы попробуйте перименовать в *.h, вдруг получится? )
Аватара пользователя
Mita
 
Сообщения: 262
Зарегистрирован: 25.10.2006, 00:50
Откуда: Минск
Благодарил (а): 35 раз.
Поблагодарили: 44 раз.
Играю в: Train Simulator Classic

Re: Вопросы по языкам C,C#,С++

Сообщение sciff » 22.11.2011, 23:02

Касательно C++:

Попугай, тип такой переменной называется string, строка по-русски (работает только при наличии #include <string> в хедере) . Ну или можно использовать так называемый array (матрица или массив, не знаю как правильно по-русски). Тогда можно будет обратиться к любой ячейке этой матрицы к примеру следующим образом:

Код: Выделить всё
cout << variable[номер ячейки, имея в виду, что 1-я имеет номер 0, и если ячеек 10, то они носят номера от 0 до 9 включительно];


Но при инициализации (декларации) такой переменной внутри main'а или перед ним (если переменная глобальная) так же как и с другими переменными задаётся её тип, т.е.

Код: Выделить всё
char variable[размер матрицы, компилятор не понимает матриц неопределённого размера];


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

kemal, void это тип функции, которая выполняет какую-то операцию (к примеру сохраняет что-то в переменную или выводит на экран (cout) её содержимое), но не возвращает значение. В обычной фукции (НЕ void) в конце обычно есть такая строка:

Код: Выделить всё
return <нечто, будь то переменная, или какая-то арифметическая операция с ней и другими переменными, или переменными и числовыми значениями, или только числовыми значениями>;


В случае функции void эта строка не нужна.

Если возникнут ещё вопросы, пишите, разберёмся :)
Последний раз редактировалось sciff 23.11.2011, 09:06, всего редактировалось 2 раз(а).
Аватара пользователя
sciff
 
Сообщения: 900
Зарегистрирован: 21.12.2010, 01:51
Откуда: Дублин; Латвия
Благодарил (а): 391 раз.
Поблагодарили: 927 раз.
Блог: Просмотр блога (1)
Роль: Видео-оператор
Имя: Ян

Re: Вопросы по языкам C,C#,С++

Сообщение sciff » 22.11.2011, 23:14

Должен добавить, что в отличие от обычной переменной string в array сохранить слово методом cin >> array или array = variable не получится. Для сохранения букв слова в array необходимо использовать следующую штуковину:

Код: Выделить всё
for (i=0; i<10; i++)
cin >> array[i];


i в данном случае отвечает за номер ячейки, а цикл for что выше позволяет поочерёдно ввести буквы во все ячейки начиная с первой заканчивая десятой, номера от 0 до 9. Но этот способ конечно нелогичен и для простого хранения единичных слов в переменной необходимо использовать тип переменной string. Матрицы полезны только в том случае, если вам необходима возможность лёгкой навигации по буквам :)

Поправьте меня, знатоки, если я тут чего попутал :)
Аватара пользователя
sciff
 
Сообщения: 900
Зарегистрирован: 21.12.2010, 01:51
Откуда: Дублин; Латвия
Благодарил (а): 391 раз.
Поблагодарили: 927 раз.
Блог: Просмотр блога (1)
Роль: Видео-оператор
Имя: Ян

Re: Вопросы по языкам C,C#,С++

Сообщение kemal » 23.11.2011, 13:51

sciff писал(а):kemal, void это тип функции ...

Вот именно, что тип функции! А Попугай что сказал?
Попугай писал(а):у меня набралось много void-ов

Вот я и переспросил, что значит много void-ов.

Массив символов, думаю, зря в пример привели. Был бы вопрос по C - другое дело!

офф:
Код: Выделить всё
for (i=0; i<10; i++)
cin >> array[i];

работать не будет, надо хотя бы так:
Код: Выделить всё
for (i=0; i<10; i++)
array[i]=cin.get();
array[10]=0;
<kuid:216981:******>
куид.ру не нужен
Аватара пользователя
kemal
 
Сообщения: 375
Зарегистрирован: 10.02.2006, 18:21
Откуда: Казань
Благодарил (а): 4 раз.
Поблагодарили: 7 раз.
Блог: Просмотр блога (4)
Играю в: Auran Trainz
Роль: Разработчик
Имя: Камиль

Re: Вопросы по языкам C,C#,С++

Сообщение ALSN » 23.11.2011, 18:19

Mita,sciff,kemal, спасибо.

Массив char-ов не к сожалению не получился (напутал со string, пытался колдовать со struct, внутри которого string, вышла белиберда), void-ы вынес на .h файл.

Вот мой способ для получения команды:

Код: Выделить всё
void GetCMD ()
{
   int cmd;
   cout << "Команда: ";
   cin >> cmd;

   if (cmd == 0)
   {
      Help ();//хэлп
   }
    else if (cmd == 1)
   {
      Calculator ();//калькулятор
   }
   else if (cmd == 2)
   {
        Formula ();// под формулу
   }
   else
   {
      cout << "Ошибка, данная команда не исполняется этой программой. Для получения спраки наберите 0.";
        GetCMD ();//заново
   }
}


Тут команды:
0 - хэлп
1 - калькулятор
2 - под формулу
А хотелось бы, чтобы команды были из слов. Большая просьба, покажите пожалуйста на примере этого кода, как можно сделать char-массив :help: .

Вот я и переспросил, что значит много void-ов.


У меня набралось в начале программы много void-ов, вот например, команда GetCMD (которую я вверху выложил) для получения команды пользователя (сначала выберется действие программы, потом на выбор: калькулятор, вбить значения в формулу, ну и конечно хэлп, в общем паутина сплошная 0_о):

Ну соответственно есть void Help, void Calculator, void Formula, а для void Formula есть ещё несколько void-ов, и так больше 15 (объединил по максимуму, просто не хочу всё в инт мэин пихать), ну и вынес их на отдельный файл, main.cpp разгрузил.
Аватара пользователя
ALSN
 
Сообщения: 227
Зарегистрирован: 09.08.2011, 11:35
Откуда: Москва
Благодарил (а): 167 раз.
Поблагодарили: 122 раз.
Блог: Просмотр блога (6)
Играю в: Train Simulator Classic
Роль: Фотограф
Имя: Игорь

Re: Вопросы по языкам C,C#,С++

Сообщение kemal » 23.11.2011, 20:37

Ну вот опять! Не void-ы, а функции типа void.
void Help, void Calculator, void Formula

Никогда, запомни, никогда так не пиши! В Си в отличии от Паскаля скобки у функций пишутся в любом случае, даже если нет аргументов. Поэтому у Си программистов при виде функции без скобок происходит срыв шаблона...
Соответственно, надо было написать: void Help(), void Calculator(), void Formula()

Так вот, как вынести их в отдельный файл. Ещё раз напомню, это функции.
Допустим, файл называется functions.cpp тогда можно в файле main.cpp написать:
#include "functions.cpp"
важно, что здесь ствятся ковычки, а не угловые скобки и писать это надо после остальных инклудов.

Хоть это и не совсем правильно, попробуй сначала так.

Плохая идея при ошибке вызывать ту же функцию. Рекурсия здесь ни к чему. Лучше вернуть bool, а в основной программе засунуть в цикл.

Хотел было посоветовать switch(), но раз будут строки он тут не поможет.

Структура-то здесь зачем? Массива символов в чистом виде здесь было бы достаточно. Хотя, раз у нас Си++, какой-нибудь стринг здесь подошёл бы лучше. В них, если честно, не силён...
<kuid:216981:******>
куид.ру не нужен
Аватара пользователя
kemal
 
Сообщения: 375
Зарегистрирован: 10.02.2006, 18:21
Откуда: Казань
Благодарил (а): 4 раз.
Поблагодарили: 7 раз.
Блог: Просмотр блога (4)
Играю в: Auran Trainz
Роль: Разработчик
Имя: Камиль

Re: Вопросы по языкам C,C#,С++

Сообщение sciff » 23.11.2011, 21:21

kemal писал(а):
sciff писал(а):kemal, void это тип функции ...

Вот именно, что тип функции! А Попугай что сказал?
Попугай писал(а):у меня набралось много void-ов

Вот я и переспросил, что значит много void-ов.

<ugagaga> Ха-ха, не ну вам же всё равно понятно что имел в виду он не вакуум, а тип функции :football:

kemal писал(а):
Код: Выделить всё
for (i=0; i<10; i++)
cin >> array[i];

работать не будет, надо хотя бы так:
Код: Выделить всё
for (i=0; i<10; i++)
array[i]=cin.get();
array[10]=0;

Почему не будет? Только что проверил, работает. Вводишь слово, жмёшь enter, это слово побуквенно записывается в матрицу и потом (в случае моего кода) выводится на экран (повторно и целиком). Для последнего сделал функцию

Код: Выделить всё
void printout (char array[]) {

    int i;
    for (i=0;i<10;i++)
    cout << array[i];

}
Последний раз редактировалось sciff 23.11.2011, 21:52, всего редактировалось 1 раз.
Аватара пользователя
sciff
 
Сообщения: 900
Зарегистрирован: 21.12.2010, 01:51
Откуда: Дублин; Латвия
Благодарил (а): 391 раз.
Поблагодарили: 927 раз.
Блог: Просмотр блога (1)
Роль: Видео-оператор
Имя: Ян

Re: Вопросы по языкам C,C#,С++

Сообщение sciff » 23.11.2011, 21:49

Попугай писал(а):А хотелось бы, чтобы команды были из слов. Большая просьба, покажите пожалуйста на примере этого кода, как можно сделать char-массив :help:

Какие проблемы? Это легко и просто! Только char массив здесь безсмысленен :)

Код: Выделить всё
#include <iostream>
#include <string>//без этого тип переменной string будет недоступен
using namespace std;

void Help ();
void Calculator ();
void Formula ();

int main () {

    setlocale(LC_ALL, "Russian");
    string cmd;
    cout << "Команда: ";
    cin >> cmd;
    cout << endl;//переносим строку, чтоб не было всё в кучу

    if (cmd == "help" || cmd == "hlp" || cmd == "Help"  || cmd == "HELP" || cmd == "HLP")//проверка на все возможные варианты
        Help ();//хэлп

    //если после if или else выполняется всего одна операция, скобки {} не нужны

    else if (cmd == "calc" || cmd == "calculator" || cmd == "Calculator" || cmd == "Calc" || cmd == "CALC" || cmd == "CALCULATOR" )
        Calculator ();//калькулятор
    else if (cmd == "formula" || cmd == "form" || cmd == "FORM" || cmd == "Form" || cmd == "Formula" || cmd == "FORMULA"  || cmd == "FRM" || cmd == "frm" )
        Formula ();// под формулу
   else
      cout << "Ошибка, данная команда не исполняется этой программой. Для получения спраки наберите help" << endl;//если за клавиватурой сидела обезьяна и произвольно нажимала на клавиши

    main ();//заново

    system("PAUSE");//это лишним не будет, чтобы программа не вырубалась сразу, если зацикливание выше отключено

    return 0;

   }

void Help () {
    cout << "Не будет тебе никакого хелпа!" << endl;

}

void Calculator () {
    cout << "Батарейка сдохла!" << endl;

}


void Formula () {
    cout << "E = mc^2" << endl;

}

;


Проверено в CodeBlocks, работает :up:

Изображение
Аватара пользователя
sciff
 
Сообщения: 900
Зарегистрирован: 21.12.2010, 01:51
Откуда: Дублин; Латвия
Благодарил (а): 391 раз.
Поблагодарили: 927 раз.
Блог: Просмотр блога (1)
Роль: Видео-оператор
Имя: Ян

Re: Вопросы по языкам C,C#,С++

Сообщение maestro » 23.11.2011, 22:24

sciff писал(а):
Попугай писал(а):А хотелось бы, чтобы команды были из слов. Большая просьба, покажите пожалуйста на примере этого кода, как можно сделать char-массив :help:

Какие проблемы? Это легко и просто! Только char массив здесь безсмысленен :)

Код: Выделить всё
    if (cmd == "help" || cmd == "hlp" || cmd == "Help"  || cmd == "HELP" || cmd == "HLP")//проверка на все возможные варианты
        Help ();//хэлп

    //если после if или else выполняется всего одна операция, скобки {} не нужны

    else if (cmd == "calc" || cmd == "calculator" || cmd == "Calculator" || cmd == "Calc" || cmd == "CALC" || cmd == "CALCULATOR" )
        Calculator ();//калькулятор
    else if (cmd == "formula" || cmd == "form" || cmd == "FORM" || cmd == "Form" || cmd == "Formula" || cmd == "FORMULA"  || cmd == "FRM" || cmd == "frm" )
        Formula ();// под формулу
   else
      cout << "Ошибка, данная команда не исполняется этой программой. Для получения спраки наберите help" << endl;//если за клавиватурой сидела обезьяна и произвольно нажимала на клавиши




Лучше сравнение строк вынести в отдельную функцию, из которой возвращать введённую команду как именованную константу (определённую через #define ). Полученное значение проверять в блоке switch. Если пишешь под Windows, то в kernel32.dll есть функция lstrcmpi(char*, char*), которая сравнивает строки без учёта регистра.

Код: Выделить всё
#define CMD_UNKNOWN 0
#define CMD_HELP 1
#define CMD_CALC 2
#define CMD_FORMULA 3

int GetCmd(char *s)
{
    if(lstrcmpi(s,"help")==0) return CMD_HELP;
    if(lstrcmpi(s,"calc")==0) return CMD_CALC;
    // и т.д.
    return CMD_UNKNOWN; // Ни с чем не совпало
}

void main()
{
    // получение строки -> cmd
    switch(GetCmd(cmd))
    {
        case CMD_HELP:
            // вывод справки
            break;
        // другие случаи
    }
}


Такой код по крайней мере будет читабельным. Правда, при большом количестве команд следует использовать немного другой способ (могу описать, но для этого нужно на достаточном уровне понимать C++). Интерпретатор введённого выражения потребуется в любом случае.
maestro
 
Сообщения: 246
Зарегистрирован: 18.03.2011, 15:13
Благодарил (а): 0 раз.
Поблагодарили: 144 раз.
Играю в: Train Simulator Classic
Роль: Разработчик
Имя: Виталий

Re: Вопросы по языкам C,C#,С++

Сообщение kemal » 24.11.2011, 00:15

sciff писал(а): <ugagaga> Ха-ха, не ну вам же всё равно понятно что имел в виду он не вакуум, а тип функции :football:

Откуда я знаю, может переменные! Изъясняйтесь чётче и будет вам счастье!
sciff писал(а):
kemal писал(а):
Код: Выделить всё
for (i=0; i<10; i++)
cin >> array[i];

работать не будет, надо хотя бы так:
Код: Выделить всё
for (i=0; i<10; i++)
array[i]=cin.get();
array[10]=0;

Почему не будет? Только что проверил, работает.

Если вводить только буквы и только 9 символов, то будет работать. Но на будущее надо знать о подводных камнях.
<kuid:216981:******>
куид.ру не нужен
Аватара пользователя
kemal
 
Сообщения: 375
Зарегистрирован: 10.02.2006, 18:21
Откуда: Казань
Благодарил (а): 4 раз.
Поблагодарили: 7 раз.
Блог: Просмотр блога (4)
Играю в: Auran Trainz
Роль: Разработчик
Имя: Камиль

Re: Вопросы по языкам C,C#,С++

Сообщение Mita » 24.11.2011, 01:44

kemal писал(а):
sciff писал(а):kemal, void это тип функции ...

Вот именно, что тип функции! А Попугай что сказал?
Попугай писал(а):у меня набралось много void-ов

Вот я и переспросил, что значит много void-ов.

Мда, приехали.

void - это ЛЮБОЙ тип. Если вы объявили указатель типа типа void*, то он может указывать на любую переменную. Вам такое понятие, как приведение типов знакомо?
В случае функции, это означает что функция ....ничего не возвращает, или как говорят возвращает значение типа void.
Здесь именно терминология важна.
Аватара пользователя
Mita
 
Сообщения: 262
Зарегистрирован: 25.10.2006, 00:50
Откуда: Минск
Благодарил (а): 35 раз.
Поблагодарили: 44 раз.
Играю в: Train Simulator Classic

Re: Вопросы по языкам C,C#,С++

Сообщение Mita » 24.11.2011, 01:47

Mita писал(а):
kemal писал(а):
sciff писал(а):kemal, void это тип функции ...

Вот именно, что тип функции! А Попугай что сказал?
Попугай писал(а):у меня набралось много void-ов

Вот я и переспросил, что значит много void-ов.

Мда, приехали.

void - это ЛЮБОЙ тип. Если вы объявили указатель типа типа void*, то он может указывать на любую переменную. Вам такое понятие, как приведение типов знакомо?
В случае функции, это означает что функция ....ничего не возвращает, или как говорят возвращает значение типа void.
Здесь именно терминология важна.


По-поводу матриц-шматриц....
НЕ матрица это никакая - это массив! Матрица - это в частном случае двухмерный массив, например

int a[5][7]; - значит что у вас матрица элементов типа int с 5 столбцами и 7 строками.


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

Короче - учите матчасть, таварищи.
Аватара пользователя
Mita
 
Сообщения: 262
Зарегистрирован: 25.10.2006, 00:50
Откуда: Минск
Благодарил (а): 35 раз.
Поблагодарили: 44 раз.
Играю в: Train Simulator Classic

След.

Вернуться в Компьютерные вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 4