PDA

Просмотр полной версии : С/C++


Elverion
23.06.2010, 22:42
Язык программирования C++

http://savepic.ru/1373910.gif

Официальные страницы:

DMOZ (http://www.dmoz.org/World/Russian/%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D 1%80%D1%8B/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D 0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5/%D0%AF%D0%B7%D1%8B%D0%BA%D0%B8/C++/)
Комитет по стандартизации языка C++ (http://www.open-std.org/jtc1/sc22/wg21/)


C++ (Си++) — компилируемый статически типизированный язык программирования общего назначения. Поддерживает разные парадигмы программирования, но, в сравнении с его предшественником — языком Си, — наибольшее внимание уделено поддержке объектно-ориентированного и обобщённого программирования. Название «C++» происходит от Си (C), в котором унарный оператор ++ обозначает инкремент переменной.
1
Среда разработки
http://5ka.su/download/referat/programming/2003-a-17753.png
1
Пример программирования на C++
#include <iostream>
#include <numeric>
#include <boost/iterator/counting_iterator.hpp>
#include <boost/iterator/transform_iterator.hpp>

int odd(int i)
{
return 2 * i + 1;
}

int square(int i)
{
return i * i;
}

typedef boost::counting_iterator <int> counter;
typedef boost::transform_iterator <int (*)(int), counter> transformer;

transformer odds(int n)
{
return transformer(counter(n), odd);
}

transformer squares(int n)
{
return transformer(counter(n), square);
}

int main()
{
using namespace std;

cout << "Enter vector length: ";
int n; cin >> n;

cout << inner_product( odds(0), odds(n), squares(0), 0 ) << endl;
}

1

FAQ
Q.: Зачем нужна тема?
A.: Здесь вам могут помочь понять, местами просто помочь, местами научить. Только помните: решать задачи и писать весь код за вас никто не будет.

Полезные ссылки (http://forum.igromania.ru/showthread.php?t=51956)

Если вы хотите помощи — вставляйте непонятный вам код в тег .

Полная статья на "Википедии (http://ru.wikipedia.org/wiki/C%2B%2B)".

Redlle
16.09.2012, 16:22
Всем привет :)
Есть тут люди знакомые с MPI (параллельное прог-е)?
Если есть, то нужен ваш совет:

Есть hello world для mpi реализации MPICH2 который на ура компилируются в кодблоксе и запускается ч/з ком. строку с параметрами "mpiexec.exe -n 5 D:\hw.exe" тоже, но тут возникает один нюанс:
"Программа должна выводить свой ранг из числа действующих процессоров и как ни странно она это делает, но делает очень криво в том смысле, что каждый раз строчки выводятся в разном порядке то бишь - может ( 0 из 3, 2 из 3, 1 из 3), а может может ( 1 из 3, 0 из 3, 2 из 3) и так далее.."

Пытался зацикливать программу до тех пор пока 1вым не будет 0 пц, но все бесполезно.
Вот код программки:


#include <iostream>
#include "mpi.h"

using namespace std;

int main(int argc, char *argv[])
{

int pc_rank,
pc_size;

MPI_Init(&argc, &argv);

MPI_Comm_rank(MPI_COMM_WORLD, &pc_rank);
MPI_Comm_size(MPI_COMM_WORLD, &pc_size);

cout<<"\nHello! I'm rank "<<pc_rank<<" of "<<pc_size<<" processor";

MPI_Finalize();

return 0;

}

Вот собственно и вопрос кто-нибудь знает, как заставить программу работать с пц по порядку?

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


if(pc_rank==0){

printf("\n PC size: %i ",pc_size);
printf("\n Enter the number of partitions:\n [> ");
scanf("%i",&n);

startwtime = MPI_Wtime();
}
тут программа сначала выдаст: _, а далее после ввода Enter the number of partitions:\n [>

Как сделать так, чтобы она сначала выводила, что ввести, а потом предлагала? А не наоборот, как это происходит сейчас

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

PC_GAMER
23.10.2012, 17:37
Задание:
Написать программу, функция main которой включает вызов 3х функций:
- 1-я функция осуществляет ввод исходных данных;
- 2-я функция осуществляет расчет результатов;
- 3-я функция выводит результаты расчета на экран.
В программе использовать два способа передачи параметров в функцию: по значению и по адресу.
Составьте программу –временной интервал. Заданы моменты начала и конца некоторого промежутка времени в часах и минутах (в пределах одних суток). Найти продолжительность этого промежутка в тех же единицах измерения.

Сделал:
// 222.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <iostream>
using namespace std;

double Rezult(double hour1, double min1, double hour2, double min2);// параметр по назначению и по адресу
double Cin(); void Cout(double HM); // функция ввода и вывода
int main() {
setlocale( LC_ALL,"Russian" );
double hour1, min1, hour2, min2;
double HM,r;
r=Cin(); //вызов функции ввода
HM=Rezult(hour1, min1, hour2, min2);
Cout(HM); //вызов функции вывода
cin>>hour1;
cin>>min1;
return 0;}
double Rezult (double hour1, double min1, double hour2, double min2) { // задание функции
double HM;
HM=(hour2-hour1)*60+(min2-min1);
return HM;}
double Cin(){
double b;
double g;
cout<<"Введите начальное время: ";
cin>>b;
cout<<"Введите конечное время: ";
cin>>g;
return 0;}
void Cout(double HM){
cout<<"Результат в минутах: "<<HM;
}


Выдаёт ошибку:
Run-Time Check Failure #3 - The variable 'min2' is being used without being initialized.
Run-Time Check Failure #3 - The variable 'hour2' is being used without being initialized.
Run-Time Check Failure #3 - The variable 'min1' is being used without being initialized.
Run-Time Check Failure #3 - The variable 'hour1' is being used without being initialized.
Поток 'Поток Win32' (0x15a0) завершился с кодом -1073741510 (0xc000013a).
Программа "[5520] 222.exe: Машинный код" завершилась с кодом -1073741510 (0xc000013a).
Подскажите пожалуйста, что я не правильно написал?

Keltar
23.10.2012, 18:35
hour1, min1, hour2, min2;
у тебя переменным ничего не присвоено, задай начальные значения. Т.е эти строки
cin>>hour1;
cin>>min1;
точно должны быть раньше, чем HM=Rezult(hour1, min1, hour2, min2);
к тому же hour2, min2; нигде не заданы вообще.

PC_GAMER
23.10.2012, 21:03
у тебя переменным ничего не присвоено, задай начальные значения. Т.е эти строки

точно должны быть раньше, чем HM=Rezult(hour1, min1, hour2, min2);
к тому же hour2, min2; нигде не заданы вообще.

Мне ведь нужно вписывать свои значения, а если их я задам, то какой смысл мне создавать ещё и ввод?
Я б вообще забил, но мне нужно это всё использовать :lamo:
Help me, please :frown:

CMETAHA
23.10.2012, 22:17
PC_GAMER, Прежде чем использовать переменные их нужно инициализировать. Ты же сначала передаёшь переменные в функцию в качестве параметра, и только потом их инициализируешь. Собственно об этом и говорят ошибки компилятора.

Анкар
24.10.2012, 20:17
Меня заверили, что компилятор никогда не поставит никакую переменную на нечетную позицию, благодаря выравниванию и несколько последних битов можно без проблем считать лишней памятью. Для своих замыслов решил это реализовать.
inline bool link_up(node* a){
return reinterpret_cast<uint_64>(a) & 1;
}

inline node* tag(node* a){
uint_64 q = reinterpret_cast<uint_64>(a);
return reinterpret_cast<node*>(q | 1);
}

inline node* untg(node* a){
uint_64 q = reinterpret_cast<uint_64>(a);
return reinterpret_cast<node*>(q - (q&1));//Здесь
}
Отчего-то untg для NULL выдает огромный адрес, хотя должен работать как 0 - 0. Я в раздумьях.
-
UPD. Дело в приоритетах операций. Поправил во имя истории.

PC_GAMER
04.11.2012, 09:56
Задали курсовую работу по C++. Тема "Эмуляция пункта меню MS Word: формат-шрифт". Тему написал, чтобы вы имели представление, что я имею ввиду.
У нас работы с визуальным оформлением в С++ ещё не было, я будет как раз тогда, когда я буду сдавать работу....
Подскажите пожалуйста статьи, учебники или что-нибудь ещё, что поможет разобраться в этой теме, хотя бы немного.

GURON27
05.11.2012, 10:19
Всем привет! Подскажите хороший компилятор.

CMETAHA
05.11.2012, 13:34
GURON27, GCC (http://gcc.gnu.org/)

Анкар
05.11.2012, 14:52
CMETAHA, тогда уж http://www.mingw.org/ Хотя он а винде тормозной, ппц.

Hast
06.11.2012, 21:03
CMETAHA, тогда уж http://www.mingw.org/ Хотя он а винде тормозной, ппц.Чем он тормозной? Я этим компилятором все лабораторные в универе делал, все нормально было.

[CCCP] Monster
07.11.2012, 11:12
GURON27, Смотря для чего. G++ может полностью раскрыть себя только в составе unix-систем, имеет ряд существенных недостатков, вроде монолитной компоновки транслятора и недостаточных интеграционных возможностей, что не дает его использовать для развертывания сложных конструкций вроде шаблонов и не дает орагнизовать нормальную отладку, опять же, с возможностью посмотреть на данные внутри типов, использующих шаблоны.

Если тебе нужно под винду, то лучше чем Visual Studio найти невозможно. А если ты собираешься писать под DirectX11, то это вообще единственное вменяемое решение, которое позволяет внутри себя даже шейдеры отлаживать и смотреть промежуточные результаты рендеринга.

http://www.microsoft.com/visualstudio/rus/products/visual-studio-express-for-windows-desktop

А вот как выглядит процесс отладки рендера:
http://habrahabr.ru/company/microsoft/blog/140638/

PC_GAMER
24.11.2012, 17:17
"Работаю" в Borland 6 C++.
Как сделать такие же выплывающие пункты вместе с ComboBox (отметил красным)?
http://mepic.ru/up/pic_b/45863a888a7d3ad4c724a5548a9ffb21.png

[CCCP] Monster
25.11.2012, 18:43
PC_GAMER, На 6-ке - только одним способом. Унаследоваться TWinControl и нарисовать самому. Ribbon и набор comctl32 версии 6 там просто так не подключишь.

PC_GAMER
29.11.2012, 12:19
Как в Visual Studio C++ 2010 можно присвоить кнопке команду, для скроллинга списка в combobox? Подскажите, пожалуйста.

[CCCP] Monster
30.11.2012, 01:18
PC_GAMER, CLI, WIN32, MFC?

PC_GAMER
30.11.2012, 17:24
[CCCP] Monster, Visual C++ -> CLR.

CMETAHA
01.12.2012, 19:52
PC_GAMER, Ты даже не понял вопрос.

PC_GAMER
01.12.2012, 19:59
CMETAHA, и что же я не понял?
Спросили какой условный шаблон, я и сказал какой.

CMETAHA
01.12.2012, 20:31
PC_GAMER, насколько я помню, то в visual c++ можно создать либо консольный проект clr, либо пустой проект clr. Что у тебя?

PC_GAMER
01.12.2012, 20:37
CMETAHA, windows forms.

CMETAHA
01.12.2012, 20:45
CMETAHA, windows forms.

Тогда win32, я так понимаю.

PC_GAMER
01.12.2012, 21:10
CMETAHA, тогда я уж действительно не пойму.

Причём здесь http://mepic.ru/up/pic_b/3cae1fcce66864f0f51ae0ca6a566ddf.png
win32???

Вы можете подсказать как сделать кнопку, которая листает combobox вниз, или вверх (то есть листает его содержимое, как, например, мы бы прокручивали его мышкой)?

[CCCP] Monster
02.12.2012, 11:52
CLR имеет экспортер функций в C++ (правда, чудовищно замороченный даже по сравнению с MFC), так что все нормально. В комбо-боксе нельзя управлять открытым выпавшим списком нативо из среды CLR. Но можно посылать окнам сообщения в стиле старого доброго Win32. У всех контролов CLR есть метод GetWindow, который записывает в переданный ему указатель дескриптор окна типа HWND. А дальше тебе помогут страницы
http://msdn.microsoft.com/en-us/library/windows/desktop/bb775792(v=vs.85).aspx
и
http://msdn.microsoft.com/en-us/library/windows/desktop/bb787529(v=vs.85).aspx

PC_GAMER
08.12.2012, 17:35
Visual C++ 2010 => CLR => Windows Forms. Как сделать, чтобы ComboBox изначально был заполнен? Читал книгу, по Visual Studio 2008, там описано свойство SelectedIndex, которое при значении -1 пустое, и соответственно при значении 0 и т.д., по возрастающей, значения появляются. Но этого свойства я не обнаружил в Visual Studio 2010, оно просто напросто не расположено в свойствах.
Как сделать, чтобы ComboBox был заполнен?

XTREM-94
29.01.2013, 21:22
Как в Visual Studio 2008 подключить библиотеку pthread.h?

Вопрос снят...

SEMION
22.02.2013, 13:36
Как в С++ при выводе в файл не целых чисел, выводить их с точкой, а не с запятой. Например: 0.1 вместо 0,1

[CCCP] Monster
24.02.2013, 13:09
SEMION,
Запятую, к сожалению, никак. Функции форматирования текста и вывода чисел с плавающей запятой подчиняются штатовским правилам форматирования, и у них там везде точка. Так что единственный путь - это найти и заменить точки на запятые. При парсинге, соответственно, наоборот.

Вот на всякий случай два источника, для стандарта С++ и С соответственно:
http://www.cplusplus.com/reference/ios/
http://ru.wikipedia.org/wiki/Printf

Booch@rt
21.06.2013, 14:39
14*.Ввести четырёхзначное число (целиком в одну переменную) и подсчитать сумму первой и третьей цифры,
а также произведение второй и четвертой цифры этого числа.

кто наведет на правильное решение, или просто подсказать?
Задачка по С

pokibor
21.06.2013, 15:05
Booch@rt, цифры получаются элементарно, через комбинацию деления и получения остатка от деления:
Первая цифра = N % 10;
Вторая цифра = (N % 100) / 10
Третья цифра = (N % 1000) / 100
Четвертая цифра = (N % 10000) / 1000
Думаю, написать сумму и произведение цифр сами сможете :)
P.S. Почему задача со звёздочкой, не понял. Элементарщина.

Booch@rt
21.06.2013, 15:24
pokibor, думал насчет этого деления по модулю, но материала дали мало на эту тему, только на нахождение последней цифры 1927%10 = 7

благодарю

Razor_94
12.08.2013, 11:59
Привет!
У меня проблема:lamo:
VS11 выдает ошибку в программе
#include "stdafx.h"
#include <stdio.h>
#include <math.h>
int power (int x, int y);

int main()
{
int i;
for (i = 0; i < 10; ++i)
printf ("%d, %d, %d\n", i, power (2, i), power (-3, i));
return 0;
}
Собственно, сама ошибка
error LNK2019: ссылка на неразрешенный внешний символ "int __cdecl power(int,int)" (?power@@YAHHH@Z) в функции _main

Понятия не имею, на что ругается, учу С по учебнику.
Подскажите, что не так?

[CCCP] Monster
12.08.2013, 12:33
Razor_94, Ты определил функцию power(int x, int y) и забыл ее реализовать.

Razor_94
12.08.2013, 14:03
[CCCP] Monster, так ведь в printf она. Разве так она не реализована?

Анкар
12.08.2013, 16:46
Razor_94, она там вызывается. Реализовать - это что-то типа

int power(int x, int y){
int res = x + y;
return res;
}

Razor_94
12.08.2013, 17:41
Анкар, это пишется как формальность и на результат не влияет?

Keltar
12.08.2013, 17:52
Razor_94, это описывает работу функции, без этого просто ничего работать не будет. А ты случаем не вызываешь функцию возведения в степень в своем примере (pow(a,b))? Т.к. это стандартная функция библиотеки math.h, то описывать ее не нужно.

[CCCP] Monster
13.08.2013, 15:11
Razor_94, Мне кажется, ты сейчас забрался в середину курса, вместо того, чтобы двигаться последовательно. Возможно, ты движешься последовательно по учебнику, просто он криво составлен. Так или иначе, вот неплохой учебник:

http://cpp.com.ru/lippman/index.html

А вот глава про функции:

http://cpp.com.ru/lippman/c07.html

Там довольно хорошо все описано.

$HPALKER
07.06.2014, 15:38
Не особо посещаемый раздел, но все же: нужно написать программку для построения трехмерных графиков. Мне посоветовали компонент gl.ocx. Подскажите, кто знает как установить его на Builder 6, или какую-нибудь инфу по построению сеток в OpenGL. Заранее спасибо

[CCCP] Monster
08.06.2014, 19:48
http://www.gamedev.ru/code/articles/OpenGL_Delphi

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

http://www.opengl.org/sdk/docs/man2/xhtml/glDrawElements.xml

Cyclops
23.09.2014, 12:55
Поссаны, а в чем проблема? Я не понимаю. Криво C++ поставился?
Скрин:
http://s008.radikal.ru/i303/1409/e3/d337d1882168.jpg

Hast
23.09.2014, 14:27
Cyclops, лучше быть героиновым наркоманом, чем использовать русскую VS.

http://stackoverflow.com/questions/19792377/header-files-iostream-not-found-visual-studio-2010
Попробуй, может помочь.

Homma
23.09.2014, 15:05
Cyclops, это код из какой-то книги/сайта что ли? Предполагаю, что не хватает #include "stdafx.h" перед #include <iostream>.

Cyclops
23.09.2014, 18:33
Homma, тут не в этом дело, тут дело в том, что у меня любой код не запускается, а если создаешь пустое приложение, то некуда код вбивать.

З.Ы Даже лабы, которые с универа приношу.

Homma
23.09.2014, 18:47
Предполагаю, что не хватает #include "stdafx.h" перед #include <iostream>.
Ты пробовал это?
И создавать нужно не пустое приложение, а консольное приложение вин32(или как-то так).

Nemonymous
18.02.2015, 18:24
[сдувая пыль с полки]
Хай. Учусь программированию с с++, дома имеется microsoft visual studio 2010.
Так вот. Дома когда я пишу код и подключаю директиву #include <, то у меня отображаются все варианты библиотек, ну понятно, т.е. вводишь например после < букву "m" а прога выдает варианты math и тп. А вот в универе имеется среда microsoft visual 2010 (даже еще поздний вроде) ULTIMATE (!!!) активированный и все такое, и вот там у мну подключать эти директивы не получается, программа тупо не выдает варианты, а если так просто написать не работают. Может в самой проге чото там подключить понастроить надо?

[CCCP] Monster
18.02.2015, 21:01
Anonymyx, Нужно проверить параметр Сервис\Параметры\Текстовый редактор\С/С++\Дополнительно\Отключить IntelliSence. Должно быть false. Плюс есть горячие клавиши Ctrl+O и Ctrl+пробел, которые открывают подсказку в любом месте.

Еще можно посмотреть стороннее расширение Visual Assist. Оно добавляет описанный функционал плюс еще много всего, вроде автоформатирования текста и т.п.

eXotic
13.03.2015, 20:07
Начнем с того, что я почти полный ноль в программировании. Итак, появилось желание изучить С++. Своей первой целью я поставил разработку небольшого приложения под андроид (оно ещё должно будет иметь связь с сетью для обновления\получения информации). Собственно, вопросы:
1) MSVS или Qt? И чем они вообще отличаются, на чем лучше начинать\кодить?
2) Изучаю сейчас язык и, попутно, пишу легкий код по учебнику "С++ за 21 день. Сиддхартха Рао, 2013". Естественно, начинается все это с консольных приложений, но в дальнейшем я, как уже стало ясно, буду писать графическое приложение. Тут я столкнулся с полным непониманием того, что вообще происходит. Принцип написания консольных приложений и графических одинаковый? Мне стоит пока продолжать изучать язык в общем или лучше найти что-то по поводу конкретно графических приложений? И хватит ли мне полученных знаний от изучения консольных приложений для успешного написания кода для графического приложения? Есть ли вообще между ними связь?
3) Не несу ли я сейчас полный бред?
В общем, буду очень признателен за помощь.

[CCCP] Monster
13.03.2015, 20:28
eXotic, Хм. Ну, прежде всего, в отличие от консольного приложения, графическое имеет событийную модель поведения. Означает это примерно следующее. Консольная прога исполняется строго по порядку сверху вниз по функции main. Графическое приложение реагирует на события, о которых ему сообщает операционная система. Ты на них пишешь функции, в которых описывается реакция на событие. Для более детального описания процесса нужно обращаться к API конкретной ОС. В случае с андроидом - не знаю, не писал.

Qt - кроссплатформенная библиотека и среда разработки Qt Creator. Они позволяют создавать приложения, которые можно откомпилировать под нужную ОС (из списка поддерживаемых). У них свой API, который является надстройкой над API других ОС. Своя концепция слотов и сигналов, которые реализуют событийную систему реакции на действия пользователя. Не знаю, поддерживает ли оно андроид - не приходилось такого писать. MSVC позволяет писать приложения только под Windows, поэтому если будешь писать под Андроид, то это не твой вариант.

deadCoo
09.07.2015, 17:09
Хай. Надо написать небольшой интерпретатор, с помощью map.
Короче, включается консоль, вводим команду и 2 операнда. Сначала присваиваем ячейкам map'а (string, int) значения, и дальше выполянем над ними различные мат. дейсвтия.
например: вводим mov A 5, и консоль присваивает ячейке A значение 5. Дальше еще раз вводим и присваиваем еще одной ячейке другое значение. Дальше выполняем над ячейками операции. Например:
add A B - прибавляем значение из ячейки А к знач из ячейки B.
|Вот что-то напортачил, но чего-то не выходит никак. Раньше с map никогда не работал.


#include <iostream>
#include <conio.h>
#include <string>
#include <map>

using namespace std;
string command;



int c;
int x;
char a;
int b;

int main()
{
map <string,int> Mem;
Mem["A"]=0;
Mem["B"]=0;
Mem["C"]=0;
Mem["D"]=0;
Mem["E"]=0;
Mem["F"]=0;
Mem["G"]=0;
Mem["H"]=0;
Mem["I"]=0;



setlocale (0, "Russian");
cout << "\t\tИнтерпретатор\t\t\n\n";

while(x==0)
{
cout << "Введите команду:\n";
cin >> command >> a >> b;




if(command == "mov")
{
Mem[] += b;
cout << "В ячейку " << a << " положено значение " << Mem[] << endl;
}






}
_getch();
return 0;

}


Буду очень благодарен если поможете! Спасибо!

Nebel
09.07.2015, 19:02
Mem[] += b;
cout << "В ячейку " << a << " положено значение " << Mem[] << endl;
Mem[] это колекция ячеек, тебе надо явно указать нужную ячейку:
Mem["A"] += b;
cout << "В ячейку " << a << " положено значение " << Mem["A"] << endl;



#include <sstream>

char a; // читаем чар

map <string,int> Mem; // а используем стринг

cout << "Введите команду:\n";

cin >> command >> a >> b;

//конвертим чар в стринг
stringstream ss;
string a_str;
ss << a;
ss >> a_str;

if(command == "mov")
{
Mem[a_str] += b;
cout << "В ячейку " << a << " положено значение " << Mem[a_str] << endl;
}

deadCoo
09.07.2015, 19:33
Nebel, все работает! Спасибо огромное! Очень помогли :)
А как сделать допустим команду mul (умножить), т.е. есть 2 ячейки со значениями, вводим mul a b, и программма перемножает значения из этих ячеек.

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

Nebel
09.07.2015, 19:42
А как сделать допустим команду mul (умножить), т.е. есть 2 ячейки со значениями, вводим mul a b, и программма перемножает значения из этих ячеек.
вот простой калькулятор:
// CalculatorSwitch.cc
// Simple arithmetic calculator using switch() selection.

#include <iostream>
using namespace std;

int main()
{
float a, b, result;
char operation;

// Get numbers and mathematical operator from user input
cin >> a >> operation >> b;

// Character constants are enclosed in single quotes
switch(operation)
{
case '+':
result = a + b;
break;

case '-':
result = a - b;
break;

case '*':
result = a * b;
break;

case '/':
result = a / b;
break;

default:
cout << "Invalid operation. Program terminated." << endl;
return -1;
}

// Output result
cout << result << endl;
return 0;
}


в твоем случае должно быть так:
// CalculatorSwitch.cc
// Simple arithmetic calculator using switch() selection.

#include <iostream>
using namespace std;

int main()
{
float a, b, result;
char operation;

// например "D mul E"
cin >> a >> operation >> b;

// Character constants are enclosed in single quotes
switch(operation)
{
case '+':
result = Mem[a] + Mem[b]; //Mem["D"] + Mem["E"];
break;

case '-':
result = Mem[a] - Mem[b];
break;

case '*':
result = Mem[a] * Mem[b];
break;

case '/':
result = Mem[a] / Mem[b];
break;

default:
cout << "Invalid operation. Program terminated." << endl;
return -1;
}

// Output result
cout << result << endl;
return 0;
}

deadCoo
09.07.2015, 19:52
Nebel, надо чтобы ввод был "плавным".
Вот ввели мы mov a 5
потом mov b 2
есть а (5) и b(2)

дальше просто вводим mul a b и консоль выдает 10.

Nebel
09.07.2015, 20:39
deadCoo
https://code-live.ru/post/cpp-loops/

deadCoo
10.07.2015, 14:27
#include <sstream>
#include <map>
#include <string>
#include <conio.h>
#include <iostream>
#include <cstdlib>
#include <stdlib.h>
#include <sstream>
using namespace std;



int main()
{
setlocale (0, "Rus");
string command;

char a;
int b;
char c;
int res;



map <string,int> Mem;
while (true)
{

cout << "Введите команду:\n";
cin >> command >> a >> b;



if(command == "mov"){


stringstream ss;
string a_str;
ss << a;
ss >> a_str;

Mem[a_str] = b;
cout << "В ячейку " << a << " положено значение " << Mem[a_str] << endl;
}


if(command == "add"){


stringstream ss;
string a_str;
ss << a;
ss >> a_str;


string b_str;
ostringstream convert;
convert << b;
b_str = convert.str();



res=(Mem[a_str] += Mem[b_str]);
cout << res << endl;
}




}

_getch();
}
что не так? после того как ввели значения в 2 ячейки, дальше водим add a b, и прога по идее должна сложить 2 ячейки. Но почему-то выводит значение 1ой.
ъ

Alex_Nolan
10.07.2015, 14:44
deadCoo, конвертация через string b_str;
ostringstream convert;
convert << b;
b_str = convert.str();
ostringstream вполне вероятно выдаёт результат в какой-нибудь другой кодировке, чем введена b_str изначально в мапу. по крайней мере res = (a+=b) выдаст a только если b = 0.

лучше а и б сделать однотипными, а потом преобразовывать их или не преобразовывать в зависимости от типа введённой операции.

deadCoo
13.07.2015, 13:15
SEMsemEncMoz, так и сделал, оба стринг, в общем, решено.
Щяс другой проект:
Ну вот не пойму как считать из файла по словам, допустим есть exmpl.txt, в ней есть вот такой набор симоволов:

add 2 3
mul 2 3
sub 2 3
div 2 3

надо чтобы каждое слово и каждая цифра былы в своих переменных.
типа в стринг str1 было слово add потом int символ 2 и т.д. Цифры из файла пользователь может менять.

Добавлено через 8 минут
Ну или корочепользователь меняет цифры из файла, и прогамма выдает результат, например в данном случае add 5
mul 6
sub -1
div 0.6

Alex_Nolan
13.07.2015, 13:34
Ну вот не пойму как считать из файла по словам
в стандартной библиотеке это по моему fgets

add 2 3
mul 2 3
sub 2 3
div 2 3

надо чтобы каждое слово и каждая цифра былы в своих переменных.
типа в стринг str1 было слово add потом int символ 2 и т.д. Цифры из файла пользователь может менять.
создаёшь массив из string элементов, либо динамический массив, либо вектор, в цикле через fgets читаешь файл, получаешь массив строк.
потом в цикле посимвольно (через string (https://ru.wikipedia.org/wiki/String_%28C%2B%2B%29) довольно просто организовывается) читаешь каждую строку и разбираешь на подстроки при совпадении символа с пробелом.

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

Alex_Nolan
13.07.2015, 15:38
deadCoo,
#include <iostream>
#include <string>
#include <vector>
#include <stdio.h>

using namespace std;

int main()
{
FILE *f;
char *input;
string s,temp;

vector<string> in;
vector<string>::iterator I_in;
I_in = in.begin();
//вектор со строками из файла

f = fopen ("C://QT//test.txt","r");

while (!feof(f) && fgets(input,100,f)){
s.assign(input);
I_in = in.insert(I_in, s);
s.clear();
} //читаем построчно

cout << "==========input file==================" << endl;
for (I_in = in.begin(); I_in != in.end(); I_in++)
cout << *I_in << endl;
cout << "=========end of input file============" << endl;
//показываем что прочитали

for (I_in = in.begin(); I_in != in.end(); I_in++){
temp = *I_in;
s.clear();
string::iterator I_s= temp.begin(); ;
while (I_s != temp.end())
{
if (*I_s != ' ') s+=*I_s; //пока не пробел, сохраняем подстроку
if (*I_s == ' ') {
cout << "substring " << s << endl; //нашли пробел, значит прочитали команду или цифру, делаем с подстрокой что хотим
s.clear();
}
I_s++;
if (I_s == temp.end()) {
cout << "substring " << s << endl; //дошли до конца строки, значит прочитали команду или цифру, делаем с подстрокой что хотим
s.clear();
}
}
}
//разбираем строки
return 0;
}



набросал по быстрому что-то. вроде работает.
насколько я помню, вообще можно было без итераторов стринг просто через квадратные скобки перебирать, но мингв, встроенный в кьют креатор на это ошибками плюётся.
работает.
http://rghost.ru/6dhWXZXwP/image.png

deadCoo
13.07.2015, 15:53
SEMsemEncMoz, пишет что input используется без инициализации, without initialization...

Alex_Nolan
13.07.2015, 15:55
deadCoo,ну поставь
char input[100];

deadCoo
13.07.2015, 16:02
SEMsemEncMoz, да ствил, не компилится.

Alex_Nolan
13.07.2015, 16:06
deadCoo, ну присвой значение тогда какое-нибудь. without initialization переводится как не инициализировано, то есть не присвоено значения.

rainwalker
06.10.2015, 14:15
ребят, задачку не поможете решить? Изучаю С. В конце очередного раздела учебника такое упражнение:

-Составить прогу, которая просит ввести букву, и при помощи петель сделать такую пирамидку (допустим букву А):
______А
_____АВА
____АВСАВ
___ABCDCBA
__ABCDEDCBA

(в готовом посте пирамидки почему-то не получается, поэтому я заменил пробелы на _)

Суть какая. Надо использовать одну петлю для рядов, и три внутренние петли: одна для пробелов, вторая для букв в правильном порядке и третью для букв в обратном порядке.
Эта долбаная хрень пропустила мой мозг через шредер. Основная суть ясна.

for(a=0; a<5; a=a-1) эта внешняя петля, она обеспечит пять рядов.
Но принцип дальнейших действий я не понимаю.
думается сначала создаешь вот так:
_______А
______АВ
_____АВС
____ABCD
___ABCDE
А потом достраиваешь вторую половину, которая в обратном порядке.
Но как создать петлю с пробелами в начале?..

Хелп ребяты, я не могу есть, не могу спать, я на грани безумия, говоря словами стивена кинга - это моя ТЕМНАЯ БАШНЯ..

Hast
06.10.2015, 15:02
Три раза перечитал, и только тогда понял, что такое "петля".
Не понял в чем проблема. В основном цикле будет 3 дополнительных:

1) Печатает пробелы
2) Печатает цифры в прямом порядке
3) Печатает цифры в обратном порядке

Дальше основной цикл делает перевод строки и все начинается заново.

rainwalker
06.10.2015, 15:48
lets[26]="abcdefghijklmnopqrstuvwxyz";

for(a=0; a<6; a=a+1)
{
for(b=0; n>b; b=b+1)
{
printf("%c", lets[v]);
v=v+1;
}
b=0;
n=n+1;
v=0;
printf("\n");
}

Вот эта байда рожает
A
AB
ABC
ABCD
ABCDE

Нетпойму как сделать с пробелами
_______A
______AB
_____ABC
____ABCD
___ABCDE

Mad-Dan
06.10.2015, 16:34
rainwalker,
заводишь переменную, изначально равную количеству выводимых строк деленную пополам. На первой строчке выводишь циклом это количество пробелов. Во второй строчки это количество пробелов минус один. И так далее.

Nebel
06.10.2015, 17:45
rainwalker,
#include <iostream>
#include <string>
#include <conio.h>

int start = 65; //http://gimnnik.narod.ru/open-office/TextProcessor/images/ascii1.gif
int stop = 90;

std::string az(int val, int start, int stop)
{
std::string str;
for (int i=start; i<=start+val; i++)
{
str += char(i);
}
return str;
}

std::string za(int val, int start, int stop)
{
std::string str;
for (int i=val+start; i>start; i--)
{
str += char(i);
}
return str;
}

std::string sp(int val)
{ std::string str;
for (int i=0; i<val; i++)
{
str += " ";
}
return str;
}



int main()
{

for (int i=0; i<=(stop-start); i++)
{
std::cout << sp((stop-start)-i) + za(i,start, stop) + az(i,start, stop) + "\n";
}

_getch();
}

rainwalker
06.10.2015, 17:55
Nebel, спс, дружище, но я так пока не умею


Mad-Dan,
Вот смотри. Фиолетовый цикл печатает пробелы. Красный цикл - буквы. Но один перекрывает другой:(
lets[26]="abcdefghijklmnopqrstuvwxyz";
char c=' ';

for(a=0; a<6; a=a+1)
{
for(x=0, y=4; x<y; x=x+1)
{
printf("%c", c);
}
x=0;
y=y-1;
for(b=0; n>b; b=b+1)
{
printf("%c", lets[v]);
v=v+1;
}
b=0;
n=n+1;
v=0;
printf("\n");
}

Mad-Dan
06.10.2015, 22:58
rainwalker,
Держи
char letters[27] = "abcdefghijklmnopqrstuvwxyz";
int length = 6;
for (int i = 0; i<length; i++)
{
for (int j = 0; j < length-i-1; j++)
{
printf(" ");
}

for (int j = 0; j<i+1; j++)
{
printf("%c", letters[j]);
}

for (int j = i-1; j>=0; j--)
{
printf("%c", letters[j]);
}
printf("\n");
}
Насчет формулы для количества пробелов в предыдущем посте ошибся.

rainwalker
11.10.2015, 21:30
Народ, спс всем за поддержку. Все получилось. Подскажите плз с другой задачкой.

Надо посчитать такое выражение

1+2-3+4-5....+n-(n+1). Количество шагов задается самостоятельно.

Получилось:

a - количество шагов цикла
d - конечный результат выражения
n - число, модуль которого каждый шаг цикла увеличивается на 1 и котрое
меняет знак

Создаю две отдельные функции:
batman() - создает модуль числа n каждый шаг цикла
superman() - меняет знак каждый шаг цикла

d=1;
n=2;
scanf("%d", &a);
for(b=o; a>=b; b+1, n=(batman(n)+1)*superman(n)) т. о. n увеличивается на 1 и меняет знак каждый шаг цикла

{
d=d+n;
printf("%d", n);
}
printf("%d", d); /конечный результат выражения

int batman(int y) / эта часть работает нормально. Создает модуль n
{
int x;
x=y;
while(x<0)
{
x=x*(-1);
}
return x;
}


int superman(int z) / а вот с этой какие-то проблемы. Должна менять знак каждый шаг цикла
{
int u;
int t;
t=1;
while(z>0, t<2)
{
u=-1;
t=2;
}
while (z<0; t<2)
{
u=1;
t=2;
}
return u;
}

Mad-Dan
11.10.2015, 23:05
rainwalker, ты все усложняешь. Тебе одного цикла достаточно. Знак можно поменять банальным возведением -1 в степень равную шагу цикла.

В коде у тебя полно бреда. К примеру, зачем ты в batman заводишь переменную x, и затем приравниваешь ее к аргументу функции y? Почему просто не использовать y? Я понимаю, что сейчас памяти много у компа, но к чему лишние переменные?

Зачем ты используешь while в супермене? У тебя там один шаг всего же. Достаточно if. И зачем нужно условие t<2?
Условия внутри while записаны неправильно.
должно быть не while (z<0; t<2), а либо while (z<0 || t<2) или (z<0 && t<2). Почитай про логические операции.

Кстати, число можно в легкую посчитать и без компа. Выйдет (1-n)

Nebel
12.10.2015, 00:14
Надо посчитать такое выражение

1+2-3+4-5....+n-(n+1). Количество шагов задается самостоятельно.
кактотак:
for (i=0;i<n;i++)
{
if(i%2!=0 && i>1) k-=i;
else k+=i;
}

Mad-Dan
12.10.2015, 00:31
Nebel,
тогда уж

k=1
for (i=2;i<=n+1;i++)
{
if(i%2!=0) k-=i;
else k+=i;
}

rainwalker
12.10.2015, 17:02
спс. If в следующей теме идет, надо без него просто.
К примеру, зачем ты в batman заводишь переменную x, и затем приравниваешь ее к аргументу функции
потому что если он будет делать положительным n, то superman() всегда будет выдавать -1. Мне нужно чтобы batman() выдавал отдельное число равное модулю n, а не сразу делал само n положительным.
И зачем нужно условие t<2?
чтобы цикл делал только один шаг. Иначе же он бесконечный, разве нет?.

Охренеть...

while (z<0 && t<2)
вот в чем дело. я писал while (z<0, t<2) (в посте ошибся). И супермен каждый шаг выдавал -1.
Сейчас все как по маслу пошло!:) Пасиб парни. Хотя в учебнике про это ни слова..

Mad-Dan
12.10.2015, 20:50
If в следующей теме идет, надо без него просто.
Функции раньше if у вас проходят? Это что-то новое. Это именно курс и преподаватель такое потребовал? Или просто так главы расположены?

чтобы цикл делал только один шаг. Иначе же он бесконечный, разве нет?.
пользуйся break, что бы выйти из цикла; или return, что бы выйти из функции.
или заведи переменную типа bool

потому что если он будет делать положительным n, то superman() всегда будет выдавать -1. Мне нужно чтобы batman() выдавал отдельное число равное модулю n, а не сразу делал само n положительным.
Ты в курсе, как функции работают?
этот y существует только внутри batman, на n он никак не влияет. Почитай про глобальные и локальные переменные.

rainwalker
12.10.2015, 22:12
Mad-Dan, я сам обучаюсь по англ учебнику C primer plus. Дорешал задачи к 5ой главе, там как раз были loops (петли, как я их сначала перевел:)): while(), for(). С 6-ой начинаются все то, о чем ты говориш: if, else, break итп. Но задачи то к 5-ой. Поэтому работаю с тем, что есть.
Ты в курсе, как функции работают?
этот y существует только внутри batman, на n он никак не влияет. Почитай про глобальные и локальные переменные
класс:) сколько мне еще предстоит сюрпризов..

Mad-Dan
12.10.2015, 22:54
rainwalker, можно без всяких while и if
например

sum=1
for (i=2;i<n+1;i=i+2)
{
sum=i-(i+1)
}

А если всерьез, то не бойся забегать вперед. Тебе часто предстоит лазить в незнакомые дебри