Консультация № 93702
02.07.2007, 22:46
0.00 руб.
0 2 2
Здравствуйте уважаемые ЭКСПЕРТЫ я пока ещё даже не чайник, а только
начал изучать первый язык программирования С++ до этого я не знал ни
одного языка купил книги, но дело вот в чём есть уроки, но нет пояснений
какие заголовки и для чего они нужны как подключать сторонние заголовки
и библиотеки я вам задавал один вопрос по CONIO библиотеки дело в том
что эта библиотека разработана для Dev C++ но, по какой причине она и там
не работает инструкции выполнил, как указано, но всё равно не работает
потом скопировал, подчёркиваю заголовки и библиотеки в Code::Blocks v1.0
эта среда мне больше нравится она удобней, по крайней мере, для меня хотя
есть и свои недостатки, но не об этом мои переживания, по какой причине они
не работают, подскажите, как их заставить каректно работать в Code::Blocks
и можно ли с теми средствами которые устанавливаются при установке
программы выполнить те же действие что и с библиотекой CONIO то есть
чтобы текст выводился цветом и в любой позиции, и вообще, какими средствами
можно это сделать, например, вывести в консоль такой форматированный текст
указан ниже и попросить ввести к примеру имя и все по середине или с другого
краю текст и по середине
пример:

обыкнавенный Миру мир солдату дембель!
Голубым размер шрифта 14 Введите ваше имя: ???????
Синий размер шрифта 16 ??????? спит, служба идет!

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

Вопрос 2: Как пишется программа с параметрами, например калькулятор
к примеру
набираю в командной строке
calculator /? выводится справка о программе
calculator /u программа переходит в режим умножения после умножения нужных
чисел возвращается на исходную
calculator /d соответственно деление далее тоже самое
ну и, к примеру, end выйти из программы.

Примерно по такому шаблону

Или по такому
Ввожу calculator, после чего выдается справка

Нажмите Q, чтобы выйти из программы, U чтобы умножить P продолжить X прервать, D чтобы делить,? вывести справку. Где P продолжает режим, к примеру, деления, а X выходит из режима
деления и передаёт управление в начало программы, где можно перейти к примеру
умножению я вас, наверное, утомил последний вопрос
по какой причине компилятор выдаёт такую ошибку
warning: no newline attend of file

все примеры чтобы можно было спроектировать в IDE Code::Blocks
убедительная просьба по возможности с подробным описанием кода.

примечание: имя установочного файла с библиотекой CONIO
conio-2.0-1mol.DevPak

Обсуждение

Неизвестный
03.07.2007, 14:49
общий
это ответ
Здравствуйте, Савин Валерий Николаевич!
По первой части ничего не могу ответить, так как не пользовался названной IDE и не знаю какой компилятор используется (попробуй сменить IDE) :)).
По второму вопросу скажу так:
1) Такой вопрос уже задавался в этой рассылки и его можно найти через поиск!
2) Вкратце расскажу про входные параметры:
Для входных параметров в программу используются переменные argc и argv
Example:
int main(char argc, char argv[]){
return 0;
}

Первая переменная содержит количество входящих в программу параметров, вторая строку параметров.
Дальше разбираешь строку и делаешь и делаешь всё, что хочется.
Example:

#include <stdio.h>

void main(char argc, char * argv[]){
if (argv[0] == ‘?‘)
printf(%s, "Copyright Ivanov Ivan");
return;
}
Неизвестный
04.07.2007, 09:47
общий
это ответ
Здравствуйте, Савин Валерий Николаевич!
conio.h не входит в стандарт с++, т.к. зависит от ОС, поэтому в каждом компиляторе сделан по-своему и имеет разные возможности. В Windows в этом файле поддерживается только функция char getch() - чтение нажатого символа. Остальные (цвет и положение) досрупны через WinApi (при этом теряется кроссплатформенность программы). А Code::Blocks никогда не видел, так что не знаю, будет ли там работать, всё, что я написал, хотя вроде должно.

Насчёт разбора параметров, правильнее будет разбирать их так:
#include <iostream>
using namespace std;

int main (int argc, char* argv[])
{
//Переменные параметров
bool param1 = false;
bool param_count = false;
int param_count_val = 0;
//Программа распознаёт парамерты вида /param1 /count 50 в любом порядке
for (int i = 0; i < argc; i++)
{
if (strcmp(argv[i], "/param1") == 0)
param1 = true;
if (strcmp(argv[i], "/count") == 0)
param_count = true;
if (param_count && argc > i)
param_count_val = atoi(argv[i + 1]);
}
if (param1)
cout << "param1 used" << endl;
if (param_count)
cout << "count is " << param_count_val << endl;
return 0;
}

Насчёт нажатия кнопок:
#include <iostream>
#include <conio.h>
using namespace std;

int main (int argc, char* argv[])
{
char c = 0;
//Цикл пока не нажата клавиша выхода
while (c != ‘Q‘)
{
//Очистка экрана
system("cls");
//Меню
cout << "MenuItem1 - 1" << endl;
cout << "MenuItem2 - 2" << endl;
cout << "Exit - Q" << endl;
//Чтение клавиши
c = toupper(getch());
//Действия
switch (c)
{
case ‘1‘:
cout << "MenuItem1 selected" << endl;
getch();
break;
case ‘2‘:
cout << "MenuItem2 selected" << endl;
getch();
break;
}
}
return 0;
}

Насчёт conio смотрите в приложении, я там писал класс для работы с консолью, наверное разберётесь.
#include "Console.h"
using namespace std;

int main()
{
//Установка заголовка окна
console.SetTitle("Работа с консолью");
//Ввод имени файла
console.Write("Введите имя файла: ");
string filename = console.ReadLine();
//Установка цвета
console.SetColor(clRed);
console.WriteLine("Вы выбрали файл " + filename);
//Задержка
console.Pause();
return 0;
}

Приложение:
#pragma once#include <iostream>#include <string>#include <windows.h>using namespace std;//Размер буфера ввода#define MAX_STRING 1024//Цвета в консолиenum ConsoleColor{ clBlack = 0, clNavy = 1, clGreen = 2, clTeal = 3, clBrown = 4, clPurple = 5, clOlive = 6, clGray = 7, clSilver = 8, clBlue = 9, clLime = 10, clCyan = 11, clRed = 12, clMagneta = 13, clYellow = 14, clWhite = 15,};//Класс для работы с консольюclass Console{private: //Указатель на стандатрный вывод HANDLE hStdout; //Указатель на стандатрный ввод HANDLE hStdin; //Поток ввода istream& in; //Поток вывода ostream& out;public: //Конструктор (с привязкой к потокам) Console(istream& in, ostream& out); //Очистка экрана void Clear(); //Задержка void Pause(); //Получение заголовка окна string GetTitle(); //Установка заголовка окна void SetTitle(string title); //Получение цвета текста WORD GetColor(); //Установка цвета текста void SetColor(WORD color); //Получение цвета фона WORD GetBgColor(); //Установка цвета фона void SetBgColor(WORD color); //Получение позиции курсора COORD GetCursorPos(); //Установка позиции курсора void SetCursorPos(short X, short Y); //Получение размеров окна (в символах) COORD GetWindowSize(); //Вывод символа void Write(char c); //Вывод строки (с преобразованием кодировки) void Write(string text); //Переход на новую строку void WriteLine(); //Вывод строки (с преобразованием кодировки и переходом на новую строку) void WriteLine(string text); //Чтение строки (не пустой) string ReadLine(); //Чтение целого числа (со знаком) long ReadLong(); //Чтение целого числа (без знака) unsigned long ReadULong(); //Чтение действительного числа double ReadDouble(); //Чтение кода нажатой клавиши (с ожиданием) char ReadKey();};//Ссылка на объект стандартной консолиextern Console console;#include "Console.h"//Объект стандартной консолиConsole console(cin, cout);//Конструктор (с привязкой к потокам)Console::Console(istream& in, ostream& out) : in(in), out(out){ //Получение указателей на стандартный ввод и вывод hStdout = GetStdHandle(STD_OUTPUT_HANDLE); hStdin = GetStdHandle(STD_INPUT_HANDLE);}//Очистка экранаvoid Console::Clear(){ system("cls");}//Задержкаvoid Console::Pause(){ system("pause");}//Получение заголовка окнаstring Console::GetTitle(){ //Буфер char buffer[MAX_STRING]; //Получение заголовка окна GetConsoleTitleA(buffer, MAX_STRING); //Преобразование кодировки OemToCharA(buffer, buffer); //Возврат строки return string(buffer);}//Установка заголовка окнаvoid Console::SetTitle(string title){ //Буфер char buffer[MAX_STRING]; strcpy_s(buffer, MAX_STRING, title.c_str()); //Преобразование кодировки CharToOemA(buffer, buffer); //Установка заголовка окна SetConsoleTitleA(buffer);}//Получение цвета текстаWORD Console::GetColor(){ //Информация о консоли CONSOLE_SCREEN_BUFFER_INFO csbiInfo; //Получение информации о консоли GetConsoleScreenBufferInfo(hStdout, &csbiInfo); //Возврат цвета return csbiInfo.wAttributes % 16;}//Установка цвета текстаvoid Console::SetColor(WORD color){ SetConsoleTextAttribute(hStdout, color + GetBgColor() * 16);}//Получение цвета фонаWORD Console::GetBgColor(){ //Информация о консоли CONSOLE_SCREEN_BUFFER_INFO csbiInfo; //Получение информации о консоли GetConsoleScreenBufferInfo(hStdout, &csbiInfo); //Возврат цвета return csbiInfo.wAttributes / 16;}//Установка цвета фонаvoid Console::SetBgColor(WORD color){ SetConsoleTextAttribute(hStdout, color * 16 + GetColor());}//Вывод символаvoid Console::Write(char c){ out << c;}//Вывод строки (с преобразованием кодировки)void Console::Write(string text){ //Буфер char buffer[MAX_STRING]; //Преобразование кодировки CharToOemA(text.c_str(), buffer); out << buffer;}//Переход на новую строкуvoid Console::WriteLine(){ out << endl;}//Вывод строки (с преобразованием кодировки и переходом на новую строку)void Console::WriteLine(string text){ //Буфер char buffer[MAX_STRING]; //Преобразование кодировки CharToOemA(text.c_str(), buffer); out << buffer << endl;}//Получение позиции курсораCOORD Console::GetCursorPos(){ //Информация о консоли CONSOLE_SCREEN_BUFFER_INFO csbiInfo; //Получение информации о консоли GetConsoleScreenBufferInfo(hStdout, &csbiInfo); return csbiInfo.dwCursorPosition;}//Установка позиции курсораvoid Console::SetCursorPos(short X, short Y){ //Координаты курсора COORD p; p.X = X; p.Y = Y; SetConsoleCursorPosition(hStdout, p);}//Получение размеров окна (в символах)COORD Console::GetWindowSize(){ //Информация о консоли CONSOLE_SCREEN_BUFFER_INFO csbiInfo; //Получение информации о консоли GetConsoleScreenBufferInfo(hStdout, &csbiInfo); return csbiInfo.dwMaximumWindowSize;}//Чтение кода нажатой клавиши (с ожиданием)char Console::ReadKey(){ //Количество собылий DWORD n; //Данные о вводе INPUT_RECORD record; //Символ char c; //Цикл ожидания нажатия клвиши for ( ; ; ) { //Если невозможно прочесть событие if (!ReadConsoleInputA(hStdin, &record, 1L, &n ) || (n == 0L)) { //Установка признака конца файла и выход c = EOF; break; } //Если нажата клавиша if ((record.EventType == KEY_EVENT) && record.Event.KeyEvent.bKeyDown) //Если нажата символьная клавиша, выход if (c = static_cast<char>(record.Event.KeyEvent.uChar.AsciiChar)) break; } //Возврат символа return c;}//Чтение строки (не пустой)string Console::ReadLine(){ //Буфер char buffer[MAX_STRING]; do //Чтение строки in.getline(buffer, MAX_STRING); //Пока строка пустая while (strlen(buffer) < 1); //Возврат текста return string(buffer);}//Чтение целого числа (со знаком)long Console::ReadLong(){ //Значение long val; //Текст ошибки char* err; //Буфер string str; //Ввод и преобразование val = strtol((str = ReadLine()).c_str(), &err, 10); //Если имеется текст ошибки while (strlen(err) > 0) { //Повтор ввода Write("Ожидается целое число: "); val = strtol((str = ReadLine()).c_str(), &err, 10); } //Возврат значения return val;}//Чтение целого числа (без знака)unsigned long Console::ReadULong(){ //Значение long val; //Буфер string str; //Текст ошибки char* err; //Ввод и преобразование val = strtol((str = ReadLine()).c_str(), &err, 10); //Если имеется текст ошибки или значение < 0 while (strlen(err) > 0 || val < 0) { //Повтор ввода Write("Ожидается целое неотрицательное число: "); val = strtol((str = ReadLine()).c_str(), &err, 10); } //Возврат значения return static_cast<unsigned long>(val);}//Чтение действительного числаdouble Console::ReadDouble(){ //Значение double val; //Буфер string str; //Текст ошибки char* err; //Ввод и преобразование val = strtod((str = ReadLine()).c_str(), &err); //Если имеется текст ошибки while (strlen(err) > 0) { //Повтор ввода Write("Ожидается вещественное число: "); val = strtod((str = ReadLine()).c_str(), &err); } //Возврат значения return val;}
Форма ответа