Автор Тема: Програмирование на C++  (Прочитано 76910 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Програмирование на C++
« : 22 Январь 2011, 20:42:34 »
Решил создать ещё и такую тему, может кто ещё из начинающих подтянется  :) До этого была по паскалю и ассемблеру, их уже выучил и теперь вот начинаю изучать c++. Ещё раз спасибо тем кто помогал тогда ( HardWareMan, topos84, Vegas, EdHell,Йобан Матич, ...)
Хотелось бы услышать пару советов, как для начинающего. Хотя я уже и нашёл себе более-менее подходящий компилятор (gnu c++ для виндовс) и книжку в электронном виде (Дейтела 5е издание, если кто знает где в электронном виде есть 6е на русском то ... вы меня поняли), но всё же может есть и что получше для новичков.

В общем-то из актуальных проблем у меня сейчас то что русские буквы в консольных приложениях не выводятся  :( Что где покрутить чтобы было иначе? Компилировал как в VS2010 так и в gnu c++,  результат одинаковый  - кракозябры при выводе (в редакторе конечно всё ок).
На гугл только не посылайте, выгуглить получилось что-то странное на тему изменения хитрым способом шрифта в консоли на Lucila на 46 строк кода и так каждый раз... в общем изврат я какой-то нагуглил, думаю есть способ полегче. Откройте тайну пожалуйста кто уже знает c++.

Оффлайн BmpCorp

  • Пользователь
  • Сообщений: 1413
  • Пол: Мужской
  • Серьёзнее не бывает
    • Steam
    • Youtube
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #1 : 22 Январь 2011, 22:05:43 »
А это и не с консолью проблема, это досовская кодировка. Вместо обычного вывода типа

str = "Текст";
cout << str;

используй

AnsiToOem("Текст", str);
cout << str;

Должно сработать. Возможно, правда, что придётся подключить <windows.h>.

Добавлено позже:
Для обратного преобразования при вводе используй функцию OemToAnsi. Работает аналогично.
« Последнее редактирование: 22 Январь 2011, 22:41:48 от BmpCorp »

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #2 : 22 Январь 2011, 22:40:07 »
C++ тут не при чём, это особенности Windows, а конкретно - консоли и её кодировки.

Оффлайн Chameleon

  • Пользователь
  • Сообщений: 389
  • Пол: Мужской
  • Bellum omnium contra omnes
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #3 : 22 Январь 2011, 22:52:06 »
У меня есть файлик исправляющий кракозябры, прикрепляю, не помню как,то ли кодировку меняет то ли что но работает........
После запуска предложит нажать любую клавишу, правда кракозябрами.
После этого надо перегрузить машину.

Оффлайн Mr2

  • Пользователь
  • Сообщений: 1606
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #4 : 22 Январь 2011, 23:20:56 »
В общем-то из актуальных проблем у меня сейчас то что русские буквы в консольных приложениях не выводятся  :( Что где покрутить чтобы было иначе?
#include <iostream>

using namespace std;

char bufRus[256];

char* rus(const char* text) {
      CharToOem(text, bufRus);
      return bufRus;
      }
     
int main(){
 cout << rus("Хелоу Рашин")<<endl;
 system ("pause");
}

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #5 : 22 Январь 2011, 23:58:10 »
Как вариант - можно создать свой объект cout с оператором <<, где будет вызываться CharToOem и отправляться в std::cout. То же самое для printf/puts.

Оффлайн AjaxVS

  • Пользователь
  • Сообщений: 305
    • Youtube
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #6 : 23 Январь 2011, 00:07:33 »
Цитата: gepar
Хотелось бы услышать пару советов, как для начинающего.
забей на gnu c++, юзай легальный VS2008EE (2010 - если религия позволяет выделять 800mb памяти на редактор кода ^^), привыкай, но не юзай фреймворки, System.*.

из книжек - есть неплохой pdf "Как выучить c++ за 21 день", потом Шилдт и Страустрап (все легко находится и качается).

http://www.cplusplus.com/ и http://google.com/codesearch в закладки. ну и все, собственно.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #7 : 23 Январь 2011, 00:44:00 »
AjaxVS, я поставил 2010, но ... в общем с ней, пардон, трахаться много приходиться, внезапно в программе, которая только то и делает что выводит текст она находит более 100 ошибок! Что-то там с символьной константой. Сначала она вовсе у меня ничего не компилировала, я целый час и так и эдак создавал новые проэкты но напрасно, а потом ВНЕЗАПНО всё стало ок. Я открыл старый проэкт что не компилировался и он тоже откомпилировался, в чём проблема была - непонятно, ошибки до этого были связаны с тем что vs не понимала строчку операторов типа cout, cin, ну в общем те что от iostream. Ну и она какой-то такой подробный отчёт даёт по каждой проблеме, у меня там мини приложение с парой классов, а она мне отчёт на >100 строк бабах. Хотя я ещё толком ею не пользовался, попробую ещё снова с ней подружиться, но мне кажется для консольных приложений vs это как из пушки по воробьям  :)
Ну а вообще я сейчас использую Codeblocks, но компилирую через gnu c++ так как Codeblocks не имеет совего компилятора, а через vs 2010 долго будет компилировать.
Цитата: AjaxVS
Как выучить c++ за 21 день
Такое есть, меня название напугало, не люблю я книги обещающие за короткий срок научить чему-то.

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

Mr2, на твой код ругается мол CharToOem необъявлен и впервые используется.
UPD: добавив #include <windows.h> перестало ругаться и вывело нормально и на русском. Теперь бы ещё понять как твоя комбинация работает, я с таким объявлением
char* rus(const char* text) не знаком, не прокомментируешь немножко, плз.
« Последнее редактирование: 23 Январь 2011, 00:49:16 от gepar »

Оффлайн Mr2

  • Пользователь
  • Сообщений: 1606
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #8 : 23 Январь 2011, 08:39:03 »
Вывод русского текста сейчас попробую темы методами что вы написали, меня больше удивляет почему изначально он не выводится нормально, неужто майкрософту сложно было это сделать, хотя ... командная строка в виндовс же может выводить русский текст, почему тогда моё консольное приложение не может?
Видимо у ВинДус и ДОС разные кодировки.
Mr2, на твой код ругается мол CharToOem необъявлен и впервые используется.
UPD: добавив #include <windows.h> перестало ругаться и вывело нормально и на русском.

У меня без  <windows.h> всё скомпилировалось.(Компилятором Dev C++)
Теперь бы ещё понять как твоя комбинация работает, я с таким объявлением
char* rus(const char* text) не знаком, не прокомментируешь немножко, плз.
Объявление по всей видимости является определением.
Функция получает текст, обрабатывает eго в CharToOem кладёт в массив char bufRus[256] и возвращяет результат в int main(); Оператор cout << выводит полученный результат.
Вроде так.Не интересовался как эта функция работает,просто использовал её.
Когда понадобилось выводить текст из файла написал свою функцию перекодировки.
Нужно прибавить к символам определённое число и они будут выводиться корректно.


Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #9 : 23 Январь 2011, 12:14:24 »
Цитата
забей на gnu c++, юзай легальный VS2008EE
Обоснуй сей выбор.

Цитата
У меня без  <windows.h> всё скомпилировалось.(Компилятором Dev C++)
Dev-Cpp - не компилятор, а IDE в связке всё с тем же GNU GCC (MinGW). И многие хидеры он инклюдид сам.

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9386
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #10 : 23 Январь 2011, 12:47:54 »
gepar, честно говоря не вижу смысла под виндой пользовать GNU-компиляторы, собрать проэкт под ними конечно можно, но отлаживать под VS в разы удобнее.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #11 : 23 Январь 2011, 13:11:33 »
Цитата: HoRRoR
Dev-Cpp - не компилятор, а IDE в связке всё с тем же GNU GCC (MinGW). И многие хидеры он инклюдид сам.
А ещё он гадостно работает на 7ке x64 (внезапные вылеты, зависания при попытке отображения подсказок, начальная загрузка больше чем у vs2010), из под XP работает хорошо, но я под XP захожу в основном только чтобы поиграть в старые игрушки.
Ксати порт gnu c++ под винду (этот MinGW) я и использую для компиляции, Codeblocks изначально его подхватил. У меня ещё был борландовский компилятор, но я с ним не разобрался да и не сильно то хотелось так что я его через 5 мин. удалил чтобы нервы мне не портил.

MetalliC, да я понимаю, но я ко многому не могу привыкнуть в этой vs. Начнём с того что я так и не нашёл пункта по запуску откомпилированного приложения так что я переходил в папку с проэктом и запускал exe'шник оттудова. Самому не верится что в vs2010 пункта "откомплировать и запустить" нет, но я его не нашёл, куда его запрятали? Да и зачем вообще было его прятать, стоило наоборот его вынести на панель вверху так как им то я уж точно часто пользоваться буду. + если открыть исходный код через vs (проассоциировать cpp файл с vs2010) то его вообще нельзя откомпилировать, половина пунктов попросту затемнены. Зачем это сделано?  o_0 Чтобы я просто посмотрел исходник в vs и не мог с ним ничего сделать чтоли, так я это и текстовым редактором сделать могу.

Chameleon,патч кстати не работает под 7кой (несмотря на то что все файлы ему удаётся заменить), под xp ещё попробую ради интереса.

Ещё маленький вопрос: как сортировать текст в заданном поле (setw) выводимый через cout по центру? left/right от iomanip работает, а center (ну это я по логике решил что должно бы быть center  :) ) - нет.

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9386
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #12 : 23 Январь 2011, 13:21:12 »
gepar,

зеленую кнопку видишь ?

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #13 : 23 Январь 2011, 13:58:18 »
MetalliC, это отладка, мне было бы достаточно простого запуска  :) Хотя с этим можно смириться, но вот с непонятными ошибками в vs2010 я смириться не могу. Вот например программа генерирует числа, всё ок, gnu c++ компилирует без ошибок и предупреждений. Ctrl+с, ctrl+v.
Может подскажешь, как пользователь VS 2010, что и где нужно накрутить чтобы VS не выделывалась вот так с нормальным кодом. Ато если я буду что-то делать в VS2010 сразу я ведь решу что это с моей программой что-то не так раз вылетают ошибки и буду как идиот сидеть и искать ошибки в работающем коде. Я поначалу так и думал что это я настолько кривой код пишу что даже не могу "Hello world" вывести, но потом скачал gnu c++ и оказалось что код то какраз нормальный.
Я хотел бы научиться всё же работать и в vs2010 но пока, как видишь, она со мной дружить не хочет.

Оффлайн Mr2

  • Пользователь
  • Сообщений: 1606
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #14 : 23 Январь 2011, 14:14:03 »
Dev-Cpp - не компилятор, а IDE в связке всё с тем же GNU GCC (MinGW). И многие хидеры он инклюдид сам.
Поняно. ;)
из под XP работает хорошо, но я под XP захожу в основном только чтобы поиграть в старые игрушки.
Ну так заходи чтоб проги писать. :D

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9386
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #15 : 23 Январь 2011, 14:17:04 »
gepar, залей куда-нибудь свой исходник, а то по error-log не совсем понятно

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #16 : 23 Январь 2011, 17:58:39 »
MetalliC, это был один из примеров из книги Дейтела.

Добавлено позже:
Мне вообще кажется что дело в этих "прекомпилированных заголовках", я вот отключил эту штуку включённую по умолчанию и пример скомпилировался даже без #include "stdafx.h" и не ругаясь на использование операторов вывода и прочего. Вопрос в том что же делают эти "прекомпилированные заголовки" и зачем они включены тогда?

Оффлайн Planestranger

  • Пользователь
  • Сообщений: 1837
  • Пол: Мужской
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #17 : 23 Январь 2011, 21:46:14 »
gepar, я чесгря давно уже C++ не касался... и всё больше C# под VS2010 мучаю...
но есть такой момент. гнутый C++ по всем отрытым стандартам и т.п. заметно отличается от объектно-ориентированного Visual C++ в среде от мелкомягких. и оба они отличаются от C++ продвигаемого Borland. не могу сказать, насколько сильно они расходятся в последних ревизиях языков. но раньше не компилирующаяся в одной среде программа, перенесённая из другой, - это нормальное естественное явление. и дело не в том, что VS такая плохая...

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #18 : 23 Январь 2011, 23:28:54 »
lost_hero, ну если бы у меня был серъёзный проэкт то тут бы удивляться конечно не стоило что он на одном компиляторе компилируется, а на другом нет. И всё же что за прекомпилированный заголовок? Он ведь в новых проэктах по дефолту включён, вы что пользуетесь и не задумываетесь что это?  :) Гугл как-то умалчивает что это.

Оффлайн AjaxVS

  • Пользователь
  • Сообщений: 305
    • Youtube
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #19 : 24 Январь 2011, 00:10:39 »
Цитата: gepar
один из примеров из книги Дейтела
а этот Дейтел остряк  :lol:
#include <iostream>
using std::cout;
using std::endl;

#include <iomanip>
using std::setw;

#include <cstdlib> // contains function prototype for rand
using std::rand;
пипец, а если надо было бы юзать 100 функций из std, он бы все их с using упоминал?  <_< вот поэтому я ни одной книжки по программированию и не прочитал - чушь всякую пишут..

значит, что делать, чтобы не было непонятных ошибок:
в VS2008 (как уже было написано, VS очень удобен для отладки прог):
File -> New -> Project:
Win32 -> Win32 Console App:
Next -> Empty Project (галка), Console App (выбор) -> Finish

теперь в Solution Explorer:
правой кнопкой на Source Files -> Add -> New Item
Code -> C++ File
вводишь имя (main.cpp), жмешь Add

в новом файле:
#include <iostream>
#include <cstdlib>
using namespace std;


int main()
{
   for ( int counter = 1; counter <= 20; counter++ )
   {
      cout << " " << ( 1 + rand() % 6 );
      if ( counter % 5 == 0 )
         cout << endl;
   }

   char c;
   cin >> c;
   return 0;
}

захочешь добавить WinApi, дописываешь
#include <windows.h>и в коде можно юзать функции типа
MessageBox(0, "blablabla", "bla", 0);и чтобы не возникало ошибок типа
error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'const char [10]' to 'LPCWSTR'идешь в Project->...Properties->Configuration->General->CharacterSet: ставишь Use MultiByte

и радуешься C++
« Последнее редактирование: 24 Январь 2011, 00:13:06 от AjaxVS »

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #20 : 24 Январь 2011, 00:33:40 »
Цитата: AjaxVS
пипец, а если надо было бы юзать 100 функций из std, он бы все их с using упоминал?
Это он чтобы прокомментить можно было сразу при надобности ну и чтобы показать что мы будем использовать от каждой из подключаемых директив в текущей программе. Имхо так нагляднее так что всё автор правильно делает. Я сам потом просто пишу using namespace std и всё.
И всё же что за "прекомпилированный заголовок" кто-нибудь знает?  :)

Оффлайн DeniSS

  • Пользователь
  • Сообщений: 1088
  • Пол: Мужской
  • Сама скрытность
    • ВКонтакте
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #21 : 24 Январь 2011, 11:26:34 »
И всё же что за "прекомпилированный заголовок" кто-нибудь знает?  :)
Google it!
Вот же. Учитывая сложность твоего проекта, это дело можно выключить  ;)

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #22 : 24 Январь 2011, 22:04:49 »
Маленькая задачка: разбить число на цифры. Я это ещё на паскале не любил, но тут в книженции это задание мне даётся с расчётом что я не буду пользоваться массивом, на а строчкой символов пользоваться как-то глупо в этом случае. Тогда как это можно решить? Количество цифр заранее неизвестно.

Оффлайн DeniSS

  • Пользователь
  • Сообщений: 1088
  • Пол: Мужской
  • Сама скрытность
    • ВКонтакте
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #23 : 24 Январь 2011, 22:40:24 »
itoa, atoi не?

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #24 : 24 Январь 2011, 22:49:35 »
Цитата: DeniSS
itoa, atoi
FigPoimeshKudaKakoiCikl. Больше на шифровку шпиёну похоже  :) Не настолько я воспринимаю же на слово.

Оффлайн DeniSS

  • Пользователь
  • Сообщений: 1088
  • Пол: Мужской
  • Сама скрытность
    • ВКонтакте
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #25 : 24 Январь 2011, 23:13:49 »
Например
А вообще, надо дружить с мануалами. Я так вот почти всегда MSDN-овскую справку открытой держу - мало ли  ;)

Добавлено позже:
Дык а задание-то в каком контексте дано? Знание чего тебе должно помочь  разбирать числа на цифры?

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #26 : 24 Январь 2011, 23:56:26 »
DeniSS, ну перечислять по пунктам что уже было в книге я не буду (долго же), но то что помогло бы в этом случае вроде массивов идёт чуточку дальше, ну а строки использовать имхо глупо. ТЕ: разрешено всё (в пределах разумного) кроме строк, массивов и подключения директив, которые используют эти строки и массивы для того чтобы разбить число на цифры.
Расшифруй что ты написал в прошлый раз, ты я вижу там предлагаешь какой-то цикл, но какой и куда его я без экстрасенсорных возможностей боюсь не догадаюсь.

Добавлено позже:
Ну а вообще это я так балуюсь, мне чисто интересно реально ли это сделать без строк и массивов :)

Оффлайн kamre

  • Пользователь
  • Сообщений: 8
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #27 : 25 Январь 2011, 06:18:41 »
Ни массивов, ни строк не использовано:
#include <iostream>

void digits(int i)
{
  int j = i / 10;
  if (j != 0)
    digits(j);
  std::cout << i % 10 << " ";
}

int main()
{
  std::cout << "Number: ";
  int n;
  std::cin >> n;
  std::cout << "Digits: ";
  digits(n);
  return 0;
}

Оффлайн HardWareMan

  • Модератор
  • Сообщений: 7527
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #28 : 25 Январь 2011, 07:27:10 »
Ни массивов, ни строк не использовано:
Наглая ложь! Твой массив есть в стеке. Ибо рекурсия. :3

Оффлайн kamre

  • Пользователь
  • Сообщений: 8
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #29 : 25 Январь 2011, 09:27:24 »
Твой массив есть в стеке.
И где же указатель на первый элемент этого "массива"? )

Ибо рекурсия.
Ну для задачки с такими ограничениями в самый раз.