Просмотр полной версии : С/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)".
Всем привет :)
Есть тут люди знакомые с 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).
Подскажите пожалуйста, что я не правильно написал?
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:
PC_GAMER, Прежде чем использовать переменные их нужно инициализировать. Ты же сначала передаёшь переменные в функцию в качестве параметра, и только потом их инициализируешь. Собственно об этом и говорят ошибки компилятора.
Меня заверили, что компилятор никогда не поставит никакую переменную на нечетную позицию, благодаря выравниванию и несколько последних битов можно без проблем считать лишней памятью. Для своих замыслов решил это реализовать.
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, GCC (http://gcc.gnu.org/)
CMETAHA, тогда уж http://www.mingw.org/ Хотя он а винде тормозной, ппц.
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.
PC_GAMER, Ты даже не понял вопрос.
PC_GAMER
01.12.2012, 19:59
CMETAHA, и что же я не понял?
Спросили какой условный шаблон, я и сказал какой.
PC_GAMER, насколько я помню, то в visual c++ можно создать либо консольный проект clr, либо пустой проект clr. Что у тебя?
PC_GAMER
01.12.2012, 20:37
CMETAHA, windows forms.
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?
Вопрос снят...
Как в С++ при выводе в файл не целых чисел, выводить их с точкой, а не с запятой. Например: 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*.Ввести четырёхзначное число (целиком в одну переменную) и подсчитать сумму первой и третьей цифры,
а также произведение второй и четвертой цифры этого числа.
кто наведет на правильное решение, или просто подсказать?
Задачка по С
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 она. Разве так она не реализована?
Razor_94, она там вызывается. Реализовать - это что-то типа
int power(int x, int y){
int res = x + y;
return res;
}
Razor_94
12.08.2013, 17:41
Анкар, это пишется как формальность и на результат не влияет?
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
Поссаны, а в чем проблема? Я не понимаю. Криво C++ поставился?
Скрин:
http://s008.radikal.ru/i303/1409/e3/d337d1882168.jpg
Cyclops, лучше быть героиновым наркоманом, чем использовать русскую VS.
http://stackoverflow.com/questions/19792377/header-files-iostream-not-found-visual-studio-2010
Попробуй, может помочь.
Cyclops, это код из какой-то книги/сайта что ли? Предполагаю, что не хватает #include "stdafx.h" перед #include <iostream>.
Homma, тут не в этом дело, тут дело в том, что у меня любой код не запускается, а если создаешь пустое приложение, то некуда код вбивать.
З.Ы Даже лабы, которые с универа приношу.
Предполагаю, что не хватает #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. Оно добавляет описанный функционал плюс еще много всего, вроде автоформатирования текста и т.п.
Начнем с того, что я почти полный ноль в программировании. Итак, появилось желание изучить С++. Своей первой целью я поставил разработку небольшого приложения под андроид (оно ещё должно будет иметь связь с сетью для обновления\получения информации). Собственно, вопросы:
1) MSVS или Qt? И чем они вообще отличаются, на чем лучше начинать\кодить?
2) Изучаю сейчас язык и, попутно, пишу легкий код по учебнику "С++ за 21 день. Сиддхартха Рао, 2013". Естественно, начинается все это с консольных приложений, но в дальнейшем я, как уже стало ясно, буду писать графическое приложение. Тут я столкнулся с полным непониманием того, что вообще происходит. Принцип написания консольных приложений и графических одинаковый? Мне стоит пока продолжать изучать язык в общем или лучше найти что-то по поводу конкретно графических приложений? И хватит ли мне полученных знаний от изучения консольных приложений для успешного написания кода для графического приложения? Есть ли вообще между ними связь?
3) Не несу ли я сейчас полный бред?
В общем, буду очень признателен за помощь.
[CCCP] Monster
13.03.2015, 20:28
eXotic, Хм. Ну, прежде всего, в отличие от консольного приложения, графическое имеет событийную модель поведения. Означает это примерно следующее. Консольная прога исполняется строго по порядку сверху вниз по функции main. Графическое приложение реагирует на события, о которых ему сообщает операционная система. Ты на них пишешь функции, в которых описывается реакция на событие. Для более детального описания процесса нужно обращаться к API конкретной ОС. В случае с андроидом - не знаю, не писал.
Qt - кроссплатформенная библиотека и среда разработки Qt Creator. Они позволяют создавать приложения, которые можно откомпилировать под нужную ОС (из списка поддерживаемых). У них свой API, который является надстройкой над API других ОС. Своя концепция слотов и сигналов, которые реализуют событийную систему реакции на действия пользователя. Не знаю, поддерживает ли оно андроид - не приходилось такого писать. MSVC позволяет писать приложения только под Windows, поэтому если будешь писать под Андроид, то это не твой вариант.
Хай. Надо написать небольшой интерпретатор, с помощью 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;
}
Буду очень благодарен если поможете! Спасибо!
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;
}
Nebel, все работает! Спасибо огромное! Очень помогли :)
А как сделать допустим команду mul (умножить), т.е. есть 2 ячейки со значениями, вводим mul a b, и программма перемножает значения из этих ячеек.
сори за тупость, срочно надо а руки кривые.
А как сделать допустим команду 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;
}
Nebel, надо чтобы ввод был "плавным".
Вот ввели мы mov a 5
потом mov b 2
есть а (5) и b(2)
дальше просто вводим mul a b и консоль выдает 10.
deadCoo
https://code-live.ru/post/cpp-loops/
#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.
лучше а и б сделать однотипными, а потом преобразовывать их или не преобразовывать в зависимости от типа введённой операции.
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) довольно просто организовывается) читаешь каждую строку и разбираешь на подстроки при совпадении символа с пробелом.
читаешь каждую строку и разбираешь на подстроки при совпадении символа с пробелом.
но вот как??? Не ролучается именно разобрать на элементы.
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
SEMsemEncMoz, пишет что input используется без инициализации, without initialization...
Alex_Nolan
13.07.2015, 15:55
deadCoo,ну поставь
char input[100];
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
А потом достраиваешь вторую половину, которая в обратном порядке.
Но как создать петлю с пробелами в начале?..
Хелп ребяты, я не могу есть, не могу спать, я на грани безумия, говоря словами стивена кинга - это моя ТЕМНАЯ БАШНЯ..
Три раза перечитал, и только тогда понял, что такое "петля".
Не понял в чем проблема. В основном цикле будет 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
rainwalker,
заводишь переменную, изначально равную количеству выводимых строк деленную пополам. На первой строчке выводишь циклом это количество пробелов. Во второй строчки это количество пробелов минус один. И так далее.
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");
}
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;
}
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)
Надо посчитать такое выражение
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;
}
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.
Сейчас все как по маслу пошло!:) Пасиб парни. Хотя в учебнике про это ни слова..
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 он никак не влияет. Почитай про глобальные и локальные переменные
класс:) сколько мне еще предстоит сюрпризов..
rainwalker, можно без всяких while и if
например
sum=1
for (i=2;i<n+1;i=i+2)
{
sum=i-(i+1)
}
А если всерьез, то не бойся забегать вперед. Тебе часто предстоит лазить в незнакомые дебри
vBulletin® v3.8.0, Copyright ©2000-2025, Jelsoft Enterprises Ltd.