Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Новое направление Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 1002
от 21.02.2008, 03:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 478, Экспертов: 48
В номере:Вопросов: 5, Ответов: 11

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>


Вопрос № 123213: Помогите исправить ошибки в программе. Цель программы в том чтобы посчитать кол-во слов. Программа под DOS....
Вопрос № 123266: Допустим, у меня задекларирован указатель на строку: char* s; s=new char[300]; Как мне i-й символ строки сравнить с др. символом? Код if (*s>="a") или if (*s=="A")||(*s=="E") не в...
Вопрос № 123272: И еще пара вопросов :) Я слегка модифицировал программу, но осталась одна ошибка: error C3861: '_getch': identifier not found Я не включил какую-то библиотеку? Почему он ругается на _getch()? И как правильно записать ф-ю printf, если снач...
Вопрос № 123301: Уважаемые эксперты! Прошу помощи в решении задачи «Расчет биномиальных коэффициентов треугольника Паскаля»: Задание(НА ЯЗЫКЕ С, НЕ С++): 1. Найти коэффициенты в разложении 2. Вывести на экран n строк треугольника Паскаля. 3. Выполнит...
Вопрос № 123308: Уважаемые эксперты, предлагаю к рассмотрению функцию удаления элемента с заданным номером из упорядоченного односвязного списка без головы. Функция работает, вроде как, корректно. Мой вопрос: почему она работает некорректно, если адрес началь...

Вопрос № 123.213
Помогите исправить ошибки в программе. Цель программы в том чтобы посчитать кол-во слов. Программа под DOS.

Приложение:

Отправлен: 15.02.2008, 06:58
Вопрос задал: Blackie (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Сандров Алекс
Здравствуйте, Blackie!

1. символы обозначаются одинарными кавычками, двойными - строки (идут как указатель на char)
2. равенство записывается ==, иначе елси =, то в условии *s='a' в *s cначала запишется 'a' а потом проверится на ненулёвость(что иногда в работах со строками очень удобно, кстати)
3. после if надо скобки, if (c) или if (c == 1)
4. printf - функция форматированного вывода, сначала идёт строка формата, потом кучей все переменные.
5. выделение памяти и работа с данными должны вестись через разные указатели, я добавил указатель srt, выделил на него память и его прибил же. Работал через s. Иначе, при работе только через s адрес выделенной памяти теряется, так как есть приращение его в конце цикла s++; и в добавок ошибка будет во время выполнения - удаление по адресу, по которому ничего не выделялось.
6+. строку на слова лучше разбивать функцией strtok, потому что в этом примере слова содержащие русские буквы,цифры и прочее, будут разбиты на части этими символами, как пробелами. strtok наоборот, ориентирована на вырезание по указанным во втором параметре символам.
7+. если нужно использовать посимвольную проверку на гласные, то можно сначала привести строку к скрочным буквам функцией _strlwr, тогда не надо будет делать проверки на большие буквы.

В аттаче прога с исправленными 1-5.

Приложение:

Ответ отправил: Сандров Алекс (статус: 5-ый класс)
Ответ отправлен: 15.02.2008, 07:22
Оценка за ответ: 5
Комментарий оценки:
Про удаление не выделявшейся памяти похоже никто больше не заметил ;)

Отвечает: Терсков Сергей
Здравствуйте, Blackie!
Добавлю к вышесказанному.

s=new [300] char;

так память не выделяется.

s=new char[300];

так будет правильнее. Фигурные скобки расставлены неверно. Переменной типа bool присваивается значение отличное от true и false. И вообще-то ставилась задача посчитать кол-во слов. Здесь же считаются гласные буквы и что-то загадочное записывается в переменную i. В приложении вы найдете вариант разбиения строки на слова с использованием STL-строк.

Приложение:

Ответ отправил: Терсков Сергей (статус: Практикант)
Ответ отправлен: 15.02.2008, 08:37
Оценка за ответ: 3
Комментарий оценки:
Я все-таки просил исправить мой вариант программы


Вопрос № 123.266
Допустим, у меня задекларирован указатель на строку:
char* s;
s=new char[300];

Как мне i-й символ строки сравнить с др. символом?
Код
if (*s>="a")
или
if (*s=="A")||(*s=="E")
не вкатывает. Идут такие ошибки:
error C2040: '<=' : 'int' differs in levels of indirection from 'const char [2]'
error C2446: '==' : no conversion from 'const char *' to 'int'
There is no context in which this conversion is possible

Отправлен: 15.02.2008, 15:16
Вопрос задал: Blackie (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: X-men
Здравствуйте, Blackie!
Это делается вот так:
//используя обычный способ доступа по индексу
if (s[i] >= 'a')
// или через указатели
if ( (*(s+i)=='A') || (*(s+i)=='E') )

При сравнении одного символа с другим нужно использовать одинарные кавычки!
Ответ отправил: X-men (статус: 1-ый класс)
Ответ отправлен: 15.02.2008, 15:47

Отвечает: Касаткин Сергей Сергеевич
Здравствуйте, Blackie!
Для того чтобы получить i-й символ строки мы можем проделать следующие операции:
char* s;
s=new char[300];
int i=0;
s[i]//вот он искомый i-й символ строки
или
*(s+i)//тоже но записано немного по другому.
Наконец, для получения кода символа, символ заключают в одинарные кавычки
if(s[i]=='a')
//some code...
Получить длинну строки мы можем при помощи функции:
int strlen(char *strng)
Она возвращает количество символов в строке принимает строку, размер которой необходимо определить.
---------
WIT BEYOND MEASURE IS MAN’S GREATEST TREASURE.
Ответ отправил: Касаткин Сергей Сергеевич (статус: 2-ой класс)
Ответ отправлен: 15.02.2008, 15:54
Оценка за ответ: 5

Отвечает: Сандров Алекс
Здравствуйте, Blackie!

надо
if(*s == 'a' || *s == 'A')
Ответ отправил: Сандров Алекс (статус: 5-ый класс)
Ответ отправлен: 15.02.2008, 15:58
Оценка за ответ: 5

Отвечает: kool
Здравствуйте, Blackie!
Нужно так см. приложение
Удачи!

Приложение:

---------
I am.

Ответ отправил: kool (статус: Практикант)
Ответ отправлен: 15.02.2008, 17:47
Оценка за ответ: 5


Вопрос № 123.272
И еще пара вопросов :) Я слегка модифицировал программу, но осталась одна ошибка:
error C3861: '_getch': identifier not found
Я не включил какую-то библиотеку? Почему он ругается на _getch()?
И как правильно записать ф-ю printf, если сначала в ней должна ийти строка "Kol-vo slov ", потом целочисленное значение i, потом снова строка и снова число? (вывод разрешается делать только printf'ом, cout не предлагать)
И подскажите, если в программе есть какие-то лишние библиотеки (например, stdafx.h обязательно ли включать).

Приложение:

Отправлен: 15.02.2008, 15:45
Вопрос задал: Blackie (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Сандров Алекс
Здравствуйте, Blackie!

замени на gets(s);

это просто сделано, чтобы видеть, что выдаёт программа после работы под дебагом, чтобы окно сразу не закрывалось
Ответ отправил: Сандров Алекс (статус: 5-ый класс)
Ответ отправлен: 15.02.2008, 16:00
Оценка за ответ: 5

Отвечает: Касаткин Сергей Сергеевич
Здравствуйте, Blackie!
По поводу правильного использования printf(). Данная функция сначала принимает форматную строку, в которой задаётся весь текст, который необходимо вывести, в том числе ссылки на переменные.
int printf(const char *format [, argument]... );
Форматные строки:
d int Signed decimal integer.

i int Signed decimal integer.

o int Unsigned octal integer.

u int Unsigned decimal integer.

x int Unsigned hexadecimal integer, using "abcdef."

X int Unsigned hexadecimal integer, using "ABCDEF."

e double Signed value having the form [ – ]d.dddd e [sign]dd[d] where d is a single decimal digit, dddd is one or more decimal digits, dd[d] is two or three decimal digits depending on the output format and size of the exponent, and sign is + or –.

E double Identical to the e format except that E rather than e introduces the exponent.

f double Signed value having the form [ – ]dddd.dddd, where dddd is one or more decimal digits. The number of digits before the decimal point depends on the magnitude of the number, and the number of digits after the decimal point depends on the requested precision.

g double Signed value printed in f or e format, whichever is more compact for the given value and precision. The e format is used only when the exponent of the value is less than –4 or greater than or equal to the precision argument. Trailing zeros are truncated, and the decimal point appears only if one or more digits follow it.

G double Identical to the g format, except that E, rather than e, introduces the exponent (where appropriate).

a double Signed hexadecimal double precision floating point value having the form [−]0xh.hhhh p±dd, where h.hhhh are the hex digits (using lower case letters) of the mantissa, and dd are one or more digits for the exponent. The precision specifies the number of digits after the point.

A double Signed hexadecimal double precision floating point value having the form [−]0Xh.hhhh P±dd, where h.hhhh are the hex digits (using capital letters) of the mantissa, and dd are one or more digits for the exponent. The precision specifies the number of digits after the point.

n Pointer to integer Number of characters successfully written so far to the stream or buffer; this value is stored in the integer whose address is given as the argument. See Security Note below.

p Pointer to void Prints the address of the argument in hexadecimal digits.

s String When used with printf functions, specifies a single-byte–character string; when used with wprintf functions, specifies a wide-character string. Characters are printed up to the first null character or until the precision value is reached.

S String When used with printf functions, specifies a wide-character string; when used with wprintf functions, specifies a single-byte–character string. Characters are printed up to the first null character or until the precision value is reached.

Пример использования для вашей задачи:
printf("Количество слов %i Количество гласных %i ",i,gl);
Причем в i должно хранится количество слов, а в gl количество гласных.

Приложение:

---------
WIT BEYOND MEASURE IS MAN’S GREATEST TREASURE.

Ответ отправил: Касаткин Сергей Сергеевич (статус: 2-ой класс)
Ответ отправлен: 15.02.2008, 16:09
Оценка за ответ: 5

Отвечает: Попов А.С.
Здравствуйте, Blackie!
У Visual Studio есть особенность игнорировать все строки находящиеся выше #include <stdafx.h> поэтому рекомендую все хедеры перенести либо ниже этой строчки либо непосредственно в stdafx.h
насчет printf, правильно так:
printf("Kol-vo slov %d Kol-vo glasnih %d",i,gl);
ps лирическое отступление использование функций iostream все же наглядней:
cout<<endl<<"Kol-vo slov "<<i<<" Kol-vo glasnih "<<gl<<endl;
Ответ отправил: Попов А.С. (статус: 8-ой класс)
Ответ отправлен: 15.02.2008, 16:23
Оценка за ответ: 5


Вопрос № 123.301
Уважаемые эксперты! Прошу помощи в решении задачи «Расчет биномиальных коэффициентов треугольника Паскаля»:
Задание(НА ЯЗЫКЕ С, НЕ С++):
1. Найти коэффициенты в разложении
2. Вывести на экран n строк треугольника Паскаля.
3. Выполнить два предыдущих пункта ОПТИМАЛЬНО!
В программе использовать рекурсию.
Отправлен: 15.02.2008, 20:04
Вопрос задал: Alex09 (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Lang21
Здравствуйте, Alex09!

Программа в приложении.

Приложение:

Ответ отправил: Lang21 (статус: 6-ой класс)
Ответ отправлен: 15.02.2008, 21:27


Вопрос № 123.308
Уважаемые эксперты, предлагаю к рассмотрению функцию удаления элемента с заданным номером из упорядоченного односвязного списка без головы.
Функция работает, вроде как, корректно.
Мой вопрос: почему она работает некорректно, если адрес начального элемента списка передавать не двойным указателем, а одинарным, удалять первый элемент.
Я думаю, что это из-за того, что в данном случае нельзя изменить значение указателя, т.к. он передается по значению.
Так ли это? хочу избавиться от сомнений)
Отправлен: 15.02.2008, 20:36
Вопрос задал: Warobushek (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Verena
Здравствуйте, Warobushek!
Когда Вы передаёте в качестве параметра функции указатель (например, node *p), то создаётся впечатление, что параметр передаётся по ссылке, но на самом деле это не совсем так: то есть Вы можете изменять внутри функции значение, лежащее по переданному адресу, поскольку оно не связано с самим параметром - идёт обращение по ссылке, - но вот саму эту ссылку - указатель - Вы изменить не можете, поскольку по сути имеете переменную с адресом данных, переданную по значению. Иными словами, передавая просто указатель с одной звёздочкой Вы не можете корректно изменять адрес переменной, как то, например, перевыделять память или, как в Вашей задаче, перенаправить его на другой участок памяти. Если в функции необходимы такие действия, то можно, как у Вас, передавать параметр через **, либо, немного более красиво, передавать указатель по ссылке стандартным способом - через & (амперсанд). Только во втором случае советую объявить тип ваш_тип* и переменную этого типа передавать по ссылке ( пример в приложении).
Удачи!

Приложение:

---------
Эта история - не для истории, понимаешь?

Ответ отправила: Verena (статус: Студент)
Ответ отправлен: 15.02.2008, 20:56
Оценка за ответ: 5
Комментарий оценки:
сомнений больше нет


Вы имеете возможность оценить этот выпуск рассылки.
Нам очень важно Ваше мнение!
Оценить этот выпуск рассылки >>

Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2008, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.70 от 17.01.2008
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное