Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: Aquest
Дата сообщения: 27.02.2007 21:09
CrackMe
Попробуй закомментировать/удалить #include<stdafx.h>.

Автор: CrackMe
Дата сообщения: 27.02.2007 21:11
Aquest
Пробовал...без него пишет что вроде:
забыли добавить #include<stdafx.h> в свой исходник?
в кавычках, или < > как я понял разницы нету...

Добавлено:
но пробовал так..
Автор: Aquest
Дата сообщения: 27.02.2007 21:17
Подскажите как сравнить две строки, имеющие тип string.
Сравнение должно быть по аналогии сравнения функцией strcmp(), т.е. сравнивать
лексикографически.
Дело в том, что функция strcmp() не работает с типом string.
Автор: Lyrik
Дата сообщения: 27.02.2007 23:28
Aquest
А так что не катит: s1==s2?
Если нет, приведи код!!!
Автор: CrackMe
Дата сообщения: 28.02.2007 00:32
all
разобрался, все изза того что не поставил галочку Empty Script, оказываеться это имеет огромное значение!
но теперь проблема другая, почему-то больше половины скриптов приведенных в книжке-неработают!
вот напримаер:

Код: #include <stdio.h> // Описания стандартного ввода-вывода
#include <math.h> // Описания математической библиотеки
#include <windows.h>// Описания API функций Windows
char BufRus [256]; // Буфер для хранения строки
char* Rus(const char* text) // Функция русификатор, преобразующая
//кодировку кириллицы из ANSI в ASCII
{
CharToOem(text,BufRus);
return BufRus;
}
int main() {
double a, b, c; // Коэффициенты уравнения
double d; // Дискриминант
double x1, x2; // Корни уравнения

printf(Rus("Введите коэффициенты a, b, c:\n"));
scanf("%lf%lf%lf", &a, &b, &c);

if (a == 0.0) {
printf(Rus("Коэффициент a должен быть ненулевым.\n"));
return 1; // Возвращаем код некорректного завершения
}

d = b*b - 4.0*a*c; // Вычисляем дискриминант
if (d < 0.0) {
printf("Решений нет.\n");
}
else {
d = sqrt(d); // Квадр. корень из дискриминанта
x1 = (-b + d) / (2.0 * a); // Первый корень ур-я
x2 = (-b - d) / (2.0 * a); // Второй корень ур-я

// Печатаем ответ
printf(Rus("Решения уравнения: x1 = %lf, x2 = %lf\n",x1, x2));
}
return 0; // Возвращаем код успешного завершения
}
Автор: Zyava
Дата сообщения: 28.02.2007 01:16

Цитата:
у когонибудь этот код в VC2005 компилируеться, или я один такой???


Я тут подредактировал чуть-чуть твою программу чтобы все компилировалось:

[more]
#include <stdio.h> // Описания стандартного ввода-вывода
#include <math.h> // Описания математической библиотеки
#include <windows.h>// Описания API функций Windows
char BufRus [256]; // Буфер для хранения строки
char* Rus(LPCWSTR text) // Функция русификатор, преобразующая
//кодировку кириллицы из ANSI в ASCII
{
    CharToOem(text,BufRus);
    return BufRus;
}
int main() {
double a, b, c; // Коэффициенты уравнения
double d; // Дискриминант
double x1, x2; // Корни уравнения

printf(Rus(_T("Введите коэффициенты a, b, c:\n")));
scanf("%lf%lf%lf", &a, &b, &c);

if (a == 0.0) {
printf(Rus(_T("Коэффициент a должен быть ненулевым.\n")));
return 1; // Возвращаем код некорректного завершения
}

d = b*b - 4.0*a*c; // Вычисляем дискриминант
if (d < 0.0) {
printf(Rus(_T("Решений нет.\n")));
}
else {
d = sqrt(d); // Квадр. корень из дискриминанта
x1 = (-b + d) / (2.0 * a); // Первый корень ур-я
x2 = (-b - d) / (2.0 * a); // Второй корень ур-я

// Печатаем ответ
        printf(Rus(_T("Решения уравнения: x1 = %lf, x2 = %lf\n")),x1, x2);
}
    getch();
return 0; // Возвращаем код успешного завершения
}
[/more]
Автор: CrackMe
Дата сообщения: 28.02.2007 07:58
Zyava
Спасибо тебе, но все-равно вот это пишет:

Цитата:
d:\coding\projects\evil\evil\evil.cpp(16) : error C3861: '_T': identifier not found
d:\coding\projects\evil\evil\evil.cpp(20) : error C3861: '_T': identifier not found
d:\coding\projects\evil\evil\evil.cpp(26) : error C3861: '_T': identifier not found
d:\coding\projects\evil\evil\evil.cpp(34) : error C3861: '_T': identifier not found
d:\coding\projects\evil\evil\evil.cpp(36) : error C3861: 'getch': identifier not found
Автор: Long2010
Дата сообщения: 28.02.2007 09:30
Помогите!
У меня при использовании функции timeGetTime() при сборке выдает ошибку:
error LNK2001: unresolved external symbol __imp__timeGetTime@0
Искренне благодарен.
Автор: Zyava
Дата сообщения: 28.02.2007 11:56
CrackMe

Слушай, подозрение что у тебя со студией что-то не так, то ли ты намутил что-то, то ли хз что

Чтобы макрос _T() не находило...

Long2010

Ну и что можно понять по одной ошибке? Даже в каком компиляторе не сказал
Автор: rain87
Дата сообщения: 28.02.2007 12:40
CrackMe
Zyava
Цитата:
Чтобы макрос _T() не находило
этот макрос объявлен в tchar.h. инклюдь его и найдет

Добавлено:
а вообще - надо пойти в свойства проекта и на вкладке General вместо Unicode поставить Multi-Byte, тогда можно будет не парить мозг такими заворотами. лично я тоже долго матюкался на 2005, пока не дошел до этого
Автор: veronica b
Дата сообщения: 28.02.2007 13:31
Long2010
Zyava, судя по __imp__timeGetTime@0 это Микрософт Визуал Студио. Проверь по хелпу, в какой библиотеке находится функция timeGetTime() и при линковке ее включи!
Автор: CrackMe
Дата сообщения: 28.02.2007 14:22
Не, все по дефолту,никаких настроек не менял...
rain87
Добавил то что ты сказал, теперь такая херня:

Цитата:
evil.cpp
d:\coding\projects\evil\evil\evil.cpp(18) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\program files\microsoft visual studio 8\vc\include\stdio.h(295) : see declaration of 'scanf'
d:\coding\projects\evil\evil\evil.cpp(37) : error C3861: 'getch': identifier not found
Автор: distance
Дата сообщения: 28.02.2007 14:51
Long2010

Цитата:
У меня при использовании функции timeGetTime() при сборке выдает ошибку:
error LNK2001: unresolved external symbol __imp__timeGetTime@0


добавляешь это в свою программу, после директив #include:
#pragma comment(lib, "Winmm.lib")
или в свойствах линковки указываешь, что нужно подключить эту библиотеку. всё.
Автор: rain87
Дата сообщения: 28.02.2007 17:54
CrackMe
ну так вот именно. в 2005 оно по дефолту unicode, а в ранних - multi-byte
Цитата:
d:\coding\projects\evil\evil\evil.cpp(18) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.         c:\program files\microsoft visual studio 8\vc\include\stdio.h(295) : see declaration of 'scanf'
довольно понятно написано, это просто ворнинг. юзай scanf_s вместо scanf
Цитата:
d:\coding\projects\evil\evil\evil.cpp(37) : error C3861: 'getch': identifier not found
#include <conio.h>
Автор: CrackMe
Дата сообщения: 28.02.2007 18:32
rain87
Вот теперь заработало! Удручает только то, столько гемороя из за простого скрипта...может есть у кого книжки именно под ВС2005?
Автор: Zyava
Дата сообщения: 28.02.2007 21:27
veronica b
Я имел ввиду версию студии...

Цитата:
CrackMe

На английском:
Ivor Horton's Beginning Visual C++ 2005
Wrox | ISBN: 0764571974 | February 20, 2006 | 1224 pages | PDF
http://www.avaxhome.ru/ebooks/0764571974.html - описание
http://www.ftp2share.com/file/22391/0764571974.rar.html - скачать
8 мб

Microsoft Visual C++ 2005 Express Edition Programming for the Absolute Beginner
Course Technology PTR | ISBN 159200816X | CHM | 24 Mb | 408 Pages
http://www.avaxhome.ru/ebooks/ms_vc_ee_ab.html - описание
http://rapidshare.de/files/22898098/vcpeeab.rar.html - скачать

на русском не встречал пока в электронном виде
Автор: CrackMe
Дата сообщения: 01.03.2007 00:03
Zyava
Спасибо! Посмотрим, смогу я хоть что-нибудь понять на английском...

Добавлено:

Цитата:
http://rapidshare.de/files/22898098/vcpeeab.rar.html - скачать

сдох линк
Автор: Zyava
Дата сообщения: 01.03.2007 01:02

Цитата:
сдох линк

Все претензии в Avaxhome , кстати еще в теме 0-day мелькала книга по VC 2005, но тоже на английском, а вообще спроси здесь: http://forum.ru-board.com/topic.cgi?forum=93&bm=1&topic=0480#1 , может кто-то где-то видел на русском или сам сканировал...
Автор: CrackMe
Дата сообщения: 01.03.2007 12:23
Zyava
Нет что ты, к тебе никаких притензий, спасибо, спрошу...
Автор: Kamir
Дата сообщения: 01.03.2007 14:25
Помогите, плиз, человеку который только-только начал изучать С++.

дан массив вещественных чисел
float n[5];

вводим массив
for(i=0;i<5;i++)
cin >> n[i];

вопрос: какие методы есть в с++ чтобы обрабатывать ошибки ввода? например, на ввод строки в консоли выводилось сообщение типа "введите вещественное число". препод намекает про ios, но я не знаю с чем его едят. наверняка методом много. заранее спасибо.
Автор: Zyava
Дата сообщения: 01.03.2007 16:10
Kamir

А обязательно писать с использованием cin - cout, старые добрые printf и scanf нельзя использовать? Там все намного более прозрачно

Про cin-cout скопировал из учебника - почитай:
[more]
Флаги и функции форматирования
Работа всех потоковых объектов из библиотеки IOSTREAM.H контролируется флагами
форматирования, определяющими такие параметры, как, например, основание системы
счисления при выводе целых чисел и точность представления чисел с плавающей запятой.
Флаги можно устанавливать с помощью функции setf(), а сбрасывать — с помощью функции
unsetf (). Есть два варианта функции setf() с одним аргументом типа long и с двумя. Первым
аргументом является набор флагов, объединенных с помощью операции побитового ИЛИ (|).
Возможные флаги перечислены в таблице
Флаг Назначение
Автор: Qraizer
Дата сообщения: 01.03.2007 19:02

Цитата:
А обязательно писать с использованием cin - cout, старые добрые printf и scanf нельзя использовать? Там все намного более прозрачно
Это ещё почему? Как раз если хочешь запариться разбирать правила форматированных эскейп-последовательностей, то самое то.
Kamir
Ошибки ты можешь и так получить - cin.good(), cin.fail() итп. При чём тут std::ios? Он отвечает за флаги форматировани, хранение состояния и всё такое. Что конкретно надо-то? Строка "123.456its the invalid input" является ошибкой или нет? Ибо cin.fail() вернёт истину, но в n[i] будет-таки введено 123.456. Определи конкретнее, что такое ошибка в твоём случае.
Автор: Kamir
Дата сообщения: 01.03.2007 19:53
Qraizer

Цитата:
Строка "123.456its the invalid input" является ошибкой или нет? Ибо cin.fail() вернёт истину, но в n[i] будет-таки введено 123.456.

Если эта строка будет "первым элементом" массива то да n[0]=123.456. Однако, дальше нельзя будет произвести запись остальных элементов.

Цитата:
Определи конкретнее, что такое ошибка в твоём случае.

Задача какая. Надо чтоб на любые воздействия пользователя прога не висла и корректно работала. если невозможно записать вещественное число (т.к. на входе имеем строку) то возникает исключительная ситуация которую мы должны перехватить, вывести сообщение, и как не вчем не бывало продолжить выполнение программы с той точни на которой возникло исключени. я то думал в этом случае надо использовать try cautc (но опять же не знаю как правильно использовать в контексте решаемой задачи). либо каким то другим приемлимым образом.
Предлагается cin.good(), cin.fail(). но как использовать? можно пример? С языком общаюсь второй день так что не пинайте сильно, если спрашиваю элементарные вещи.
Автор: Labutin
Дата сообщения: 01.03.2007 22:08
Kamir
Посмотри тут: http://forum.ru-board.com/topic.cgi?forum=33&topic=3174&start=1140#11
Я уже поднимал подобный вопрос. Там есть пример.
Автор: Zyava
Дата сообщения: 01.03.2007 23:08
Это ещё почему?

Писать меньше и запоминать километровые манипуляторы и т.д. не надо Дело вкуса конечно...
Автор: veronica b
Дата сообщения: 02.03.2007 08:22
Qraizer

Цитата:
Это ещё почему? Как раз если хочешь запариться разбирать правила форматированных эскейп-последовательностей, то самое то.

Господа, речь идет о студенческом задании, по моему, использование scanf для студента более легче и ему проще все это объяснить потом преподователю. И, вообще, какой язык учат - С или С++?
Автор: Qraizer
Дата сообщения: 02.03.2007 14:31
Zyava
veronica b
Вот это новости. Конечно, fork вбить проще, чем CreateThread, или там mbstowcs вместо MultiByteToWideChar, но попробуй интуитивно запомнить первый и второй варианты. Если первое запомнить проще, то наверное у меня какая-то неправильная память. C-стиль форматирования плох по меньшей мере тем, что он типонебезопасный. Попробуйте объяснить изучающему язык студенту почему вывод double-ов производится %f, а ввод - %lf, причём очень важно, что не %Lf. А напутав что-нибудь в спецификаторах, забрасывают форумы вопросами, почему у них ввод/вывод корявый или неправильный. Пусть лучше компилятор пожалуется на несоответствие типов, например, чем потом мучить отладчик и штудировать документацию. Как раз наоборот, получив определённый опыт в программировании, можно и за C-спецификаторы засесть. Но наоборот - увольте: кроме головной боли и неприязни к языку ничего студенты не получат. За исключением некоторого количества ненормальных личностей, нас с вами, например .
Kamir

Код: for(i=0;i<5;i++)
for(;;)
{
cin >> n[i];
if (cin.good() && !cin.eof()) break; // если не было ошибок или введённая строка закончилась
cout << "Введите действительное число.";
cin.clear(); // очистить состояние ошибки
cin.ignore(256, '\n'); // пропустить до конца строки максимум 256 символов
}
Автор: veronica b
Дата сообщения: 02.03.2007 19:18
Qraizer

Цитата:
C-стиль форматирования плох по меньшей мере тем, что он типонебезопасный. Попробуйте объяснить изучающему язык студенту почему вывод double-ов производится %f, а ввод - %lf, причём очень важно, что не %Lf. А напутав что-нибудь в спецификаторах, забрасывают форумы вопросами, почему у них ввод/вывод корявый или неправильный.

В общем, язык Си для программистов, а не для тех, кто такое усвоить не может. Есть критерий для программирования на Си, разобрался ли ты с указателями. Если нет, то тут и строка форматирования не поможет. Кстати, а форматирование на Фортране, оно не проще, но никто не жаловался.
Автор: Qraizer
Дата сообщения: 02.03.2007 20:02
Ну, если обучение идёт по "бразильской" системе, то почему бы и нет. Но ИМХО это не тот метод. Для C++ в частности. В C++ делается упор на устранение человеческого фактора, а не на его провоцирование для естественного отбора. В C++ и так хватает факторов, способствующих этому отбору, и кто его не проходит, тот так и остаётся C-программером.
Фортран давно уж был бы мёртв (ещё бы - первый в мире (но не в истории) язык высокого уровня; в своё время это было не просто достижением - это было как манна небесная, куда уж тут жаловаться), и его потуги на выживание успешны исключительно благодаря его популярности и ориентированности на FORмульную TRANляцию в прошлом. Из-за чего для него была создана богатейшая библиотека программ и подпрограмм, портировать которую дороже, чем поддерживать язык. Так что это не критерий стравнения, тем более, что "жаловались", и ещё как. Правда уже после Algol, Pascal, Basic, PL/1, COBOL итп. Я сам после программируемых калькуляторов программировать начал именно с этого языка.
Автор: veronica b
Дата сообщения: 02.03.2007 20:31
Qraizer

Цитата:
Ну, если обучение идёт по "бразильской" системе

А что такое эта "бразильская" система обучения?

Цитата:
Фортран давно уж был бы мёртв (ещё бы - первый в мире (но не в истории) язык высокого уровня

А какой язык программирования высокого уровня был первым в истории? В общем, Фортран стал языком супер ЭВМ, а это не так уж и плохо.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.