Написать программу которая считывает из текстового файла три предложения и выводит их в обратном порядке
Функция добавляет s2 к s1 и возвращает s1. В конец результирующей строки добавляется нуль-символ.
char *strchr(char *s, int ch);
Ищет символ в строке
Функция возвращает указатель на первое вхождение символа ch в строку s, если его нет, то возвращается NULL.
int strcmp(char *s1, char *s2);
Функция сравнивает строки и возвращает отрицательное (если s1 меньше s2), нулевое (если s1 равно s2) или положительное (если s1 больше s2) значение.
char *strcpy(char *s1, char *s2);
Копирует одну строку в другую
Функция копирует s2 в s1 и возвращает s1.
char *strncpy(char *s1, char *s2, size_t n);
Копирует первые n символов одной строки в другую
Функция копирует не более n символов из s2 в s1 и возвращает s1. Если длина исходной строки превышает или равна n, нуль-символ в конец строки s1 не добавляется. В противном случае строка дополняется нуль-символами до n-го символа. Если строки перекрываются, поведение не определено.
char *strrchr(char *s,int ch);
Ищет символ в строке
Функция возвращает указатель на первое вхождение символа ch в строку s справа, если его нет, возвращает NULL.
char *strstr(char *s1, char *s2);
Ищет подстроку в строке
Функция выполняет поиск первого вхождения подстроки s2 в строку s1. В случае удачного поиска, возвращает указатель на элемент из s1, с которого начинается s2, и NULL в противном случае.
double strtod(const char *str, char **end);
Преобразует строку в число
Функция преобразует строку символов в числовое значение и возвращает его. При переполнении возвращает +/-HUGE_VAL При невозможности выполнить преобразование или исчезновении порядка возвращает 0. В обоих последних случаях errno устанавливается в ERANGE. end указывает на символ, на котором преобразование завершается.
char *strtok(char *s1, char *s2);
Выделяет из строки лексемы
Функция возвращает следующую лексему из s1, отделенную любым из символов из набора s2.
1.4.2<ctype.h> (<cctype>) – функции классификации и преобразования типов
int tolower(int ch);
Возвращает символ в нижнем регистре
Функция получает параметр ch и возвращает его в нижнем регистре. В параметре ch используется только младший байт.
int toupper(int ch);
Возвращает символ в верхнем регистре
Функция получает параметр ch и возвращает его в верхнем регистре. В параметре ch используется только младший байт.
int isalnum(int ch);
Проверяет, является ли символ буквой или цифрой
Функция выделяет младший байт параметра ch и возвращает значение true, если символ ch является буквой или цифрой, или false в противном случае.
int isalpha(int ch);
Проверяет, является ли символ буквой
Функция выделяет младший байт параметра ch и возвращает значение true, если символ ch является буквой, или false в противном случае.
int isdigit(int ch);
Проверяет, является ли символ цифрой
Функция выделяет младший байт параметра ch и возвращает значение true, если символ ch является цифрой, или false в противном случае.
2) Работа с файлами в С++
Файл – именованный набор байтов, который может быть сохранен на некотором накопителе. Под файлом понимается некоторая последовательность байтов, которая имеет своё, уникальное имя, например файл.txt. В одной директории не могут находиться файлы с одинаковыми именами. Под именем файла понимается не только его название, но и расширение, например: file.txt и file.dat—разные файлы, хоть и имеют одинаковые названия. Существует такое понятие, как полное имя файла – это полный адрес к директории файла с указанием имени файла, например: D:\docs\file.txt. Важно понимать эти базовые понятия, иначе сложно будет работать с файлами.
Для работы с файлами необходимо подключить заголовочный файл <fstream>.В <fstream> определены несколько классов и подключены заголовочные файлы <ifstream>—файловый ввод и <ofstream>—файловый вывод.
Файловый ввод/вывод аналогичен стандартному вводу/выводу, единственное отличие – это то, что ввод/вывод выполнятся не на экран, а в файл. Если ввод/вывод на стандартные устройства выполняется с помощью объектов cin и cout, то для организации файлового ввода/вывода достаточно создать собственные объекты, которые можно использовать аналогично операторам cin иcout.
Например, необходимо создать текстовый файл и записать в него строку Работа с файлами в С++. Для этого необходимо проделать следующие шаги:
- создать объект класса ofstream;
- связать объект класса с файлом, в который будет производиться запись;
- записать строку в файл;
- закрыть файл.
Почему необходимо создавать объект класса ofstream, а не класса ifstream? Потому, что нужно сделать запись в файл, а если бы нужно было считать данные из файла, то создавался бы объект класса ifstream.
// создаём объект для записи в файл ofstream /*имя объекта*/; // объект класса ofstream |
Назовём объект – fout, Вот что получится:
ofstream fout; |
Для чего нам объект? Объект необходим, чтобы можно было выполнять запись в файл. Уже объект создан, но не связан с файлом, в который нужно записать строку.
fout.open("cppstudio.txt"); // связываем объект с файлом |
Через операцию точка получаем доступ к методу класса open(), в круглых скобочках которого указываем имя файла. Указанный файл будет создан в текущей директории с программой. Если файл с таким именем существует, то существующий файл будет заменен новым. Итак, файл открыт, осталось записать в него нужную строку. Делается это так:
fout << "Работа с файлами в С++"; // запись строки в файл |
Используя операцию передачи в поток совместно с объектом fout строка Работа с файлами в С++ записывается в файл. Так как больше нет необходимости изменять содержимое файла, его нужно закрыть, то есть отделить объект от файла.
fout.close(); // закрываем файл |
Итог – создан файл со строкой Работа с файлами в С++.
Объединим весь код и получим следующую программу.
using namespace std;
int main(int argc, char* argv[])
ofstream fout("cppstudio.txt"); // создаём объект класса ofstream для записи и связываем его с файлом cppstudio.txt
fout << "Работа с файлами в С++"; // запись строки в файл
fout.close(); // закрываем файл
Осталось проверить правильность работы программы, а для этого открываем файл cppstudio.txt и смотрим его содержимое, должно быть — Работа с файлами в С++.
Для того чтобы прочитать файл понадобится выполнить те же шаги, что и при записи в файл с небольшими изменениями:
- создать объект класса ifstream и связать его с файлом, из которого будет производиться считывание;
- прочитать файл;
- закрыть файл.
using namespace std;
int main(int argc, char* argv[])
setlocale(LC_ALL, "rus"); // корректное отображение Кириллицы
char buff[50]; // буфер промежуточного хранения считываемого из файла текста
ifstream fin("cppstudio.txt "); // (ВВЕЛИ НЕ КОРРЕКТНОЕ ИМЯ ФАЙЛА)
if (!fin.is_open()) // если файл не открыт
cout << "Файл не может быть открыт!\n"; // сообщить об этом
fin >> buff; // считали первое слово из файла
cout << buff << endl; // напечатали это слово
fin.getline(buff, 50); // считали строку из файла
fin.close(); // закрываем файл
cout << buff << endl; // напечатали эту строку
В программе показаны два способа чтения из файла, первый – используя операцию передачи в поток, второй – используя функцию getline(). В первом случае считывается только первое слово, а во втором случае считывается строка, длинной 50 символов. Но так как в файле осталось меньше 50 символов, то считываются символы включительно до последнего. Обратите внимание на то, что считывание во второй раз (строка 17) продолжилось, после первого слова, а не с начала, так как первое слово было прочитано в строке 14. Результат работы программы показан на рисунке 1.
Рисунок 1 — Работа с файлами в С++
Режимы открытия файлов
Режимы открытия файлов устанавливают характер использования файлов. Для установки режима в классе ios_base предусмотрены константы, которые определяют режим открытия файлов (см. Таблица 1).
Таблица 1 — режимы открытия файлов | |
Константа | Описание |
ios_base::in | открыть файл для чтения |
ios_base::out | открыть файл для записи |
ios_base::ate | при открытии переместить указатель в конец файла |
ios_base::app | открыть файл для записи в конец файла |
ios_base::trunc | удалить содержимое файла, если он существует |
ios_base::binary | открытие файла в двоичном режиме |
Режимы открытия файлов можно устанавливать непосредственно при создании объекта или при вызове функции open().
ofstream fout("cppstudio.txt", ios_base::app); // открываем файл для добавления информации к концу файла fout.open("cppstudio.txt", ios_base::app); // открываем файл для добавления информации к концу файла |
Режимы открытия файлов можно комбинировать с помощью поразрядной логической операции или |, например: ios_base::out | ios_base::trunc — открытие файла для записи, предварительно очистив его.
Объекты класса ofstream, при связке с файлами по умолчанию содержат режимы открытия файлов ios_base::out | ios_base::trunc.То есть файл будет создан, если не существует. Если же файл существует, то его содержимое будет удалено, а сам файл будет готов к записи. Объекты класса ifstreamсвязываясь с файлом, имеют по умолчанию режим открытия файла ios_base::in— файл открыт только для чтения. Режим открытия файла ещё называют — флаг, для удобочитаемости в дальнейшем будем использовать именно этот термин. В таблице 1 перечислены далеко не все флаги, но для начала этих должно хватить.
Обратите внимание на то, что флаги ateиappпо описанию очень похожи, они оба перемещают указатель в конец файла, но флаг app позволяет производить запись, только в конец файла, а флаг ate просто переставляет флаг в конец файла и не ограничивает места записи.
ПРИМЕР
Написать программу, которая считывает текст из файла и выводит на экран предложения,
содержащие максимальное количество знаков пунктуации.
1)считать весь файл в строку, для этого узнать размер файла и выделить столько памяти для строки и считать туда файл
2)разбить строку по предложениям с помощью лексем-разделителей, и посчитать кол-во пунктуаций в предложении
3)записать эту информацию в массив структуры
4)найти максимальное кол-во знаков пунктуации в массиве структур
5)вывести на экран предложения, содержащие максимальное количество знаков пунктуации
using namespace std;
SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода
if (!ifs.is_open()) // если файл не открыт
cout << "Файл не может быть открыт!\n"; // сообщить об этом
// Получаем длину файла:
// Выделяем память соответственно размеру файла:
buffer = new char[length];
//Выделяем память для массива структур, где будем хранить каждое предложение и кол-во пунктуаций в ней.
Sentence *arrSentence = new Sentence[length / 100 + 10];
// считываем данные в буфер одним блоком:
char *next_token1 = NULL;
char *next_token2 = NULL;
//разбиваем текст файла на предложения с помощью лексем
char *token1 = strtok_s(buffer, delim, &next_token1);
int n = 0, maxPunctuationCount = 0;
while (token1 != NULL)
strcpy(arrSentence[n].senten, token1);//копируем предложение в массив
if (strtok_s(token1, punktuation, &next_token2) != NULL)
while (strtok_s(NULL, punktuation, &next_token2) != NULL)
//ищем максимальное кол-во пунктуаций в предложениях
maxPunctuationCount = maxPunctuationCount > count ? maxPunctuationCount : count;
//переходим к следующему предложению
token1 = strtok_s(NULL, delim, &next_token1);
cout << "Печатаем предложения с макс. кол-вом пунктуаций = " << maxPunctuationCount << endl;
for (int i = 0; i < n; i++)
if (arrSentence[i].count == maxPunctuationCount)
Лабораторная работа № 11. Работа со строками в C++. Потоки ввода-вывода. Файловые операции
Цель и порядок работы
Цель работы – ознакомиться с возможностями ввода-вывода языка C++, освоить основные операции работы со строками и файлами.
Порядок выполнения работы:
- ознакомиться с описанием лабораторной работы;
- получить задание у преподавателя, согласно своему варианту;
- написать программу и отладить ее на ЭВМ;
Контрольные вопросы
1. Какие виды строк существуют в C++?
2. Как объявить C-строку?
3. Как осуществляется ввод-вывод строк?
4. Какие операции над строками вы знаете?
5. Перечислите операции над символами?
6. Перечислите стандартные потоки ввода-вывода?
7. Как создать файловый поток?
8. Какие режимы открытия файлов существуют?
9. Что такое двоичный режим ввода-вывода?
10. Что такое текстовый режим ввода-вывода?
11. Как осуществляется чтение символов и строк?
12. Как изменить текущую позицию в файле?
13. Как узнать текущую позицию в файле?
14. Для чего используется метод clear()?
Варианты заданий
Написать программу, которая считывает из текстового файла три предложения и выводит их в обратном порядке.
Написать программу, которая считывает текст из файла и выводит на экран только предложения, содержащие введенное с клавиатуры слово.
Написать программу, которая считывает текст из файла и выводит на экран только строки, содержащие двузначные числа.
Написать программу, которая считывает английский текст из файла и выводит на экран слова, начинающиеся с гласных букв.
Написать программу, которая считывает текст из файла и выводит его на экран, меняя местами каждые два соседних слова.
Написать программу, которая считывает текст из файла и выводит на экран только предложения, не содержащие запятых.
Написать программу, которая считывает текст из файла и определяет, сколько в нем слов, состоящих не более чем из четырех букв.
Написать программу, которая считывает текст из файла и выводит на экран только цитаты, то есть предложения, заключенные в кавычки.
Написать программу, которая считывает текст из файла и выводит на экран только предложения, состоящие из заданного количества слов.
Написать программу, которая считывает английский текст из файла и выводит на экран слова текста, начинающиеся и оканчивающиеся на гласные буквы.
Написать программу, которая считывает текст из файла и выводит на экран только строки, не содержащие двузначных чисел.
Написать программу, которая считывает текст из файла и выводит на экран только предложения, начинающиеся с тире, перед которым могут находиться только пробельные символы.
Написать программу, которая считывает английский текст из файла и выводит его на экран, заменив каждую первую букву слов, начинающихся с гласной буквы, на прописную.
Написать программу, которая считывает текст из файла и выводит его на экран, заменив цифры от 0 до 9 на слова «ноль», «один», . «девять», начиная каждое предложение с новой строки.
Написать программу, которая считывает текст из файла, находит самое длинное слово и определяет, сколько раз оно встретилось в тексте.
Написать программу, которая считывает текст из файла и выводит на экран сначала вопросительные, а затем восклицательные предложения.
Написать программу, которая считывает текст из файла и выводит его на экран, после каждого предложения добавляя, сколько раз встретилось в нем введенное с клавиатуры слово.
Написать программу, которая считывает текст из файла и выводит на экран все его предложения в обратном порядке.
С использованием файловых и строковых потоков написать программу, которая счи-тывает из текстового файла три предложения и выводит их в обратном порядке.
спасите ребята плиззз!
Здравствуйте, Аноним, Вы писали:
А>С использованием файловых и строковых потоков написать программу, которая счи-тывает из текстового файла три предложения и выводит их в обратном порядке.
А>спасите ребята плиззз!
А что значит в обратном порядке? предложения 1, 2, 3 на входе -> предложения 3, 2, 1 на выходе? Или обратный порядок символов в предложении? И куда выводить надо?
Здравствуйте, Аноним, Вы писали:
А>С использованием файловых и строковых потоков написать программу, которая счи-тывает из текстового файла три предложения и выводит их в обратном порядке.
Здравствуйте, ned, Вы писали:
ned> copy(istream_iterator<string>(fstream(argv[1])), istream_iterator<string>(), inserter(v, v.end()));
Если не ошибаюсь, это будет считывать слова (токены разделённые пробелами).
Здравствуйте, Draqon, Вы писали:
ned>> copy(istream_iterator<string>(fstream(argv[1])), istream_iterator<string>(), inserter(v, v.end()));
D>Если не ошибаюсь, это будет считывать слова (токены разделённые пробелами).
Совершенно верно. Этот код будет также инвертировать порядок слов в предложениях. Автор так и не определился что ему нужно
Здравствуйте, ned, Вы писали:
ned> . Автор так и не определился что ему нужно
Хех, тоже мне автор! На лекции надо ходить ; в крайнем случае книжки читать.
P.S. Думаю, STL для решения лабы неуместен. "Автор" не сможет объяснить ни одного токена из элегантной строки!
Я тут покопался. блин, так обидно!Ну вот что им было впадлу в std::istream_iterator вместо тупого input_stream >> value параметризовать функцию чтения, а?
Тогда туда можно было бы сунуть getline и всего делов!
Здравствуйте, Дядюшка Че, Вы писали:
ДЧ>Хех, тоже мне автор! На лекции надо ходить ; в крайнем случае книжки читать.
ДЧ>P.S. Думаю, STL для решения лабы неуместен. "Автор" не сможет объяснить ни одного токена из элегантной строки!
А вот интересно: STL и т.п. сейчас студенты изучают? Когда я учился, то был лишь голый паскаль и си без плюсов.
Здравствуйте, ned, Вы писали:
ned>А вот интересно: STL и т.п. сейчас студенты изучают? Когда я учился, то был лишь голый паскаль и си без плюсов.
Изучают. У нас был замечательный предмет (с замечательным преподавателем ) Лингвистическое обеспечение. Там дежурной книгой было издание Строуструпа. Кое-что из упражнений, приведенных в конце глав, делали.
Правда, из всех предметов, каким-либо образом касающихся программирования, STL больше не требовали и не давали нигде. С другой стороны, зная о существовании std::vector, std::map, было уже трудно удержаться от их использования.
Здравствуйте, Аноним, Вы писали:
А>спасите ребята плиззз!
О, вот так вроде ничо получается, если речь-таки о строках:
1. Если и так используется back_inserter, то зачем реверсный итератор во втором copy?2. Второй ostream_iterator должен быть параметризован string. Здравствуйте, ned, Вы писали:
ned>А вот интересно: STL и т.п. сейчас студенты изучают? Когда я учился, то был лишь голый паскаль и си без плюсов.
У нас — изучают. Я — даю.
Здравствуйте, Аноним, Вы писали:
А>С использованием файловых и строковых потоков написать программу, которая счи-тывает из текстового файла три предложения и выводит их в обратном порядке.
А>спасите ребята плиззз!
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
А>>С использованием файловых и строковых потоков написать программу, которая счи-тывает из текстового файла три предложения и выводит их в обратном порядке.
А>>спасите ребята плиззз!
А>А что значит в обратном порядке? предложения 1, 2, 3 на входе -> предложения 3, 2, 1 на выходе?
извините пропадал!
да именно так и выводить это на экран
т.е у нас есть текстовый файл
там предложения 1 2 3
а на эхкран выводится
3 2 1!!
А>т.е у нас есть текстовый файл
А>там предложения 1 2 3
А>а на эхкран выводится
А>3 2 1!!
Ну вот тебе дубовейший вариант
Здравствуйте, Аноним, Вы писали:
А>>т.е у нас есть текстовый файл
А>>там предложения 1 2 3
А>>а на эхкран выводится
А>>3 2 1!!
А>Ну вот тебе дубовейший вариант
А>
спасиб но
хм так было 1 2 3 он и выводит
1 2 3
а можно сделать так чтоб типо было ,
у нас текст какой то в текстовом документе
ПРивет.как дела?что делаешь!куда едешь!
и выведит на экран
что делаешь!как дела?привет.куда едешь!
т.е 3 первых предложения выводит в обратном порядке(а последущие оставляет в таком же),а концом предложения считать символы .
я конечно прошу ВАС извенений что таке прошу! но если не сложно и у кого то есть немного времени,пожалуйста напишите!
А>спасиб но
А>хм так было 1 2 3 он и выводит
А>1 2 3
Да, потому что программа подразумевает наличие символа новой строки и один вызов getline прочитает в строку 1 2 3 сразу.
А>ПРивет.как дела?что делаешь!куда едешь!
А>и выведит на экран
А>что делаешь!как дела?привет.куда едешь!
А>т.е 3 первых предложения выводит в обратном порядке(а последущие оставляет в таком же),а концом предложения считать символы .
Это уже что-то новое, непохожее на исходную задачу Сколько всего предложений в файле и сколько надо переставить?
А>Да, потому что программа подразумевает наличие символа новой строки и один вызов getline прочитает в строку 1 2 3 сразу.
т.е чтоб было все нормально?что должно быть в файле например.
А>Это уже что-то новое, непохожее на исходную задачу Сколько всего предложений в файле и сколько надо переставить?
почему не похожа?)))имхо я так понял)но вам наверно виднее)я не профи)
в иходном предложение скоко угодно(штук 10 допустим)переставляем первых 3
Функция добавляет s2 к s1 и возвращает s1. В конец результирующей строки добавляется нуль-символ.
char *strchr(char *s, int ch);
Ищет символ в строке
Функция возвращает указатель на первое вхождение символа ch в строку s, если его нет, то возвращается NULL.
int strcmp(char *s1, char *s2);
Функция сравнивает строки и возвращает отрицательное (если s1 меньше s2), нулевое (если s1 равно s2) или положительное (если s1 больше s2) значение.
char *strcpy(char *s1, char *s2);
Копирует одну строку в другую
Функция копирует s2 в s1 и возвращает s1.
char *strncpy(char *s1, char *s2, size_t n);
Копирует первые n символов одной строки в другую
Функция копирует не более n символов из s2 в s1 и возвращает s1. Если длина исходной строки превышает или равна n, нуль-символ в конец строки s1 не добавляется. В противном случае строка дополняется нуль-символами до n-го символа. Если строки перекрываются, поведение не определено.
char *strrchr(char *s,int ch);
Ищет символ в строке
Функция возвращает указатель на первое вхождение символа ch в строку s справа, если его нет, возвращает NULL.
char *strstr(char *s1, char *s2);
Ищет подстроку в строке
Функция выполняет поиск первого вхождения подстроки s2 в строку s1. В случае удачного поиска, возвращает указатель на элемент из s1, с которого начинается s2, и NULL в противном случае.
double strtod(const char *str, char **end);
Преобразует строку в число
Функция преобразует строку символов в числовое значение и возвращает его. При переполнении возвращает +/-HUGE_VAL При невозможности выполнить преобразование или исчезновении порядка возвращает 0. В обоих последних случаях errno устанавливается в ERANGE. end указывает на символ, на котором преобразование завершается.
char *strtok(char *s1, char *s2);
Выделяет из строки лексемы
Функция возвращает следующую лексему из s1, отделенную любым из символов из набора s2.
1.4.2<ctype.h> (<cctype>) – функции классификации и преобразования типов
int tolower(int ch);
Возвращает символ в нижнем регистре
Функция получает параметр ch и возвращает его в нижнем регистре. В параметре ch используется только младший байт.
int toupper(int ch);
Возвращает символ в верхнем регистре
Функция получает параметр ch и возвращает его в верхнем регистре. В параметре ch используется только младший байт.
int isalnum(int ch);
Проверяет, является ли символ буквой или цифрой
Функция выделяет младший байт параметра ch и возвращает значение true, если символ ch является буквой или цифрой, или false в противном случае.
int isalpha(int ch);
Проверяет, является ли символ буквой
Функция выделяет младший байт параметра ch и возвращает значение true, если символ ch является буквой, или false в противном случае.
int isdigit(int ch);
Проверяет, является ли символ цифрой
Функция выделяет младший байт параметра ch и возвращает значение true, если символ ch является цифрой, или false в противном случае.
2) Работа с файлами в С++
Файл – именованный набор байтов, который может быть сохранен на некотором накопителе. Под файлом понимается некоторая последовательность байтов, которая имеет своё, уникальное имя, например файл.txt. В одной директории не могут находиться файлы с одинаковыми именами. Под именем файла понимается не только его название, но и расширение, например: file.txt и file.dat—разные файлы, хоть и имеют одинаковые названия. Существует такое понятие, как полное имя файла – это полный адрес к директории файла с указанием имени файла, например: D:\docs\file.txt. Важно понимать эти базовые понятия, иначе сложно будет работать с файлами.
Для работы с файлами необходимо подключить заголовочный файл <fstream>.В <fstream> определены несколько классов и подключены заголовочные файлы <ifstream>—файловый ввод и <ofstream>—файловый вывод.
Файловый ввод/вывод аналогичен стандартному вводу/выводу, единственное отличие – это то, что ввод/вывод выполнятся не на экран, а в файл. Если ввод/вывод на стандартные устройства выполняется с помощью объектов cin и cout, то для организации файлового ввода/вывода достаточно создать собственные объекты, которые можно использовать аналогично операторам cin иcout.
Например, необходимо создать текстовый файл и записать в него строку Работа с файлами в С++. Для этого необходимо проделать следующие шаги:
- создать объект класса ofstream;
- связать объект класса с файлом, в который будет производиться запись;
- записать строку в файл;
- закрыть файл.
Почему необходимо создавать объект класса ofstream, а не класса ifstream? Потому, что нужно сделать запись в файл, а если бы нужно было считать данные из файла, то создавался бы объект класса ifstream.
// создаём объект для записи в файл ofstream /*имя объекта*/; // объект класса ofstream |
Назовём объект – fout, Вот что получится:
ofstream fout; |
Для чего нам объект? Объект необходим, чтобы можно было выполнять запись в файл. Уже объект создан, но не связан с файлом, в который нужно записать строку.
fout.open("cppstudio.txt"); // связываем объект с файлом |
Через операцию точка получаем доступ к методу класса open(), в круглых скобочках которого указываем имя файла. Указанный файл будет создан в текущей директории с программой. Если файл с таким именем существует, то существующий файл будет заменен новым. Итак, файл открыт, осталось записать в него нужную строку. Делается это так:
fout << "Работа с файлами в С++"; // запись строки в файл |
Используя операцию передачи в поток совместно с объектом fout строка Работа с файлами в С++ записывается в файл. Так как больше нет необходимости изменять содержимое файла, его нужно закрыть, то есть отделить объект от файла.
fout.close(); // закрываем файл |
Итог – создан файл со строкой Работа с файлами в С++.
Объединим весь код и получим следующую программу.
using namespace std;
int main(int argc, char* argv[])
ofstream fout("cppstudio.txt"); // создаём объект класса ofstream для записи и связываем его с файлом cppstudio.txt
fout << "Работа с файлами в С++"; // запись строки в файл
fout.close(); // закрываем файл
Осталось проверить правильность работы программы, а для этого открываем файл cppstudio.txt и смотрим его содержимое, должно быть — Работа с файлами в С++.
Для того чтобы прочитать файл понадобится выполнить те же шаги, что и при записи в файл с небольшими изменениями:
- создать объект класса ifstream и связать его с файлом, из которого будет производиться считывание;
- прочитать файл;
- закрыть файл.
using namespace std;
int main(int argc, char* argv[])
setlocale(LC_ALL, "rus"); // корректное отображение Кириллицы
char buff[50]; // буфер промежуточного хранения считываемого из файла текста
ifstream fin("cppstudio.txt "); // (ВВЕЛИ НЕ КОРРЕКТНОЕ ИМЯ ФАЙЛА)
if (!fin.is_open()) // если файл не открыт
cout << "Файл не может быть открыт!\n"; // сообщить об этом
fin >> buff; // считали первое слово из файла
cout << buff << endl; // напечатали это слово
fin.getline(buff, 50); // считали строку из файла
fin.close(); // закрываем файл
cout << buff << endl; // напечатали эту строку
В программе показаны два способа чтения из файла, первый – используя операцию передачи в поток, второй – используя функцию getline(). В первом случае считывается только первое слово, а во втором случае считывается строка, длинной 50 символов. Но так как в файле осталось меньше 50 символов, то считываются символы включительно до последнего. Обратите внимание на то, что считывание во второй раз (строка 17) продолжилось, после первого слова, а не с начала, так как первое слово было прочитано в строке 14. Результат работы программы показан на рисунке 1.
Рисунок 1 — Работа с файлами в С++
Режимы открытия файлов
Режимы открытия файлов устанавливают характер использования файлов. Для установки режима в классе ios_base предусмотрены константы, которые определяют режим открытия файлов (см. Таблица 1).
Таблица 1 — режимы открытия файлов | |
Константа | Описание |
ios_base::in | открыть файл для чтения |
ios_base::out | открыть файл для записи |
ios_base::ate | при открытии переместить указатель в конец файла |
ios_base::app | открыть файл для записи в конец файла |
ios_base::trunc | удалить содержимое файла, если он существует |
ios_base::binary | открытие файла в двоичном режиме |
Режимы открытия файлов можно устанавливать непосредственно при создании объекта или при вызове функции open().
ofstream fout("cppstudio.txt", ios_base::app); // открываем файл для добавления информации к концу файла fout.open("cppstudio.txt", ios_base::app); // открываем файл для добавления информации к концу файла |
Режимы открытия файлов можно комбинировать с помощью поразрядной логической операции или |, например: ios_base::out | ios_base::trunc — открытие файла для записи, предварительно очистив его.
Объекты класса ofstream, при связке с файлами по умолчанию содержат режимы открытия файлов ios_base::out | ios_base::trunc.То есть файл будет создан, если не существует. Если же файл существует, то его содержимое будет удалено, а сам файл будет готов к записи. Объекты класса ifstreamсвязываясь с файлом, имеют по умолчанию режим открытия файла ios_base::in— файл открыт только для чтения. Режим открытия файла ещё называют — флаг, для удобочитаемости в дальнейшем будем использовать именно этот термин. В таблице 1 перечислены далеко не все флаги, но для начала этих должно хватить.
Обратите внимание на то, что флаги ateиappпо описанию очень похожи, они оба перемещают указатель в конец файла, но флаг app позволяет производить запись, только в конец файла, а флаг ate просто переставляет флаг в конец файла и не ограничивает места записи.
ПРИМЕР
Написать программу, которая считывает текст из файла и выводит на экран предложения,
содержащие максимальное количество знаков пунктуации.
1)считать весь файл в строку, для этого узнать размер файла и выделить столько памяти для строки и считать туда файл
2)разбить строку по предложениям с помощью лексем-разделителей, и посчитать кол-во пунктуаций в предложении
3)записать эту информацию в массив структуры
4)найти максимальное кол-во знаков пунктуации в массиве структур
5)вывести на экран предложения, содержащие максимальное количество знаков пунктуации
using namespace std;
SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода
if (!ifs.is_open()) // если файл не открыт
cout << "Файл не может быть открыт!\n"; // сообщить об этом
// Получаем длину файла:
// Выделяем память соответственно размеру файла:
buffer = new char[length];
//Выделяем память для массива структур, где будем хранить каждое предложение и кол-во пунктуаций в ней.
Sentence *arrSentence = new Sentence[length / 100 + 10];
// считываем данные в буфер одним блоком:
char *next_token1 = NULL;
char *next_token2 = NULL;
//разбиваем текст файла на предложения с помощью лексем
char *token1 = strtok_s(buffer, delim, &next_token1);
int n = 0, maxPunctuationCount = 0;
while (token1 != NULL)
strcpy(arrSentence[n].senten, token1);//копируем предложение в массив
if (strtok_s(token1, punktuation, &next_token2) != NULL)
while (strtok_s(NULL, punktuation, &next_token2) != NULL)
//ищем максимальное кол-во пунктуаций в предложениях
maxPunctuationCount = maxPunctuationCount > count ? maxPunctuationCount : count;
//переходим к следующему предложению
token1 = strtok_s(NULL, delim, &next_token1);
cout << "Печатаем предложения с макс. кол-вом пунктуаций = " << maxPunctuationCount << endl;
for (int i = 0; i < n; i++)
if (arrSentence[i].count == maxPunctuationCount)
Лабораторная работа № 11. Работа со строками в C++. Потоки ввода-вывода. Файловые операции
Цель и порядок работы
Цель работы – ознакомиться с возможностями ввода-вывода языка C++, освоить основные операции работы со строками и файлами.
Порядок выполнения работы:
- ознакомиться с описанием лабораторной работы;
- получить задание у преподавателя, согласно своему варианту;
- написать программу и отладить ее на ЭВМ;
Контрольные вопросы
1. Какие виды строк существуют в C++?
2. Как объявить C-строку?
3. Как осуществляется ввод-вывод строк?
4. Какие операции над строками вы знаете?
5. Перечислите операции над символами?
6. Перечислите стандартные потоки ввода-вывода?
7. Как создать файловый поток?
8. Какие режимы открытия файлов существуют?
9. Что такое двоичный режим ввода-вывода?
10. Что такое текстовый режим ввода-вывода?
11. Как осуществляется чтение символов и строк?
12. Как изменить текущую позицию в файле?
13. Как узнать текущую позицию в файле?
14. Для чего используется метод clear()?
Варианты заданий
Написать программу, которая считывает из текстового файла три предложения и выводит их в обратном порядке.
Написать программу, которая считывает текст из файла и выводит на экран только предложения, содержащие введенное с клавиатуры слово.
Написать программу, которая считывает текст из файла и выводит на экран только строки, содержащие двузначные числа.
Написать программу, которая считывает английский текст из файла и выводит на экран слова, начинающиеся с гласных букв.
Написать программу, которая считывает текст из файла и выводит его на экран, меняя местами каждые два соседних слова.
Написать программу, которая считывает текст из файла и выводит на экран только предложения, не содержащие запятых.
Написать программу, которая считывает текст из файла и определяет, сколько в нем слов, состоящих не более чем из четырех букв.
Написать программу, которая считывает текст из файла и выводит на экран только цитаты, то есть предложения, заключенные в кавычки.
Написать программу, которая считывает текст из файла и выводит на экран только предложения, состоящие из заданного количества слов.
Написать программу, которая считывает английский текст из файла и выводит на экран слова текста, начинающиеся и оканчивающиеся на гласные буквы.
Написать программу, которая считывает текст из файла и выводит на экран только строки, не содержащие двузначных чисел.
Написать программу, которая считывает текст из файла и выводит на экран только предложения, начинающиеся с тире, перед которым могут находиться только пробельные символы.
Написать программу, которая считывает английский текст из файла и выводит его на экран, заменив каждую первую букву слов, начинающихся с гласной буквы, на прописную.
Написать программу, которая считывает текст из файла и выводит его на экран, заменив цифры от 0 до 9 на слова «ноль», «один», . «девять», начиная каждое предложение с новой строки.
Написать программу, которая считывает текст из файла, находит самое длинное слово и определяет, сколько раз оно встретилось в тексте.
Написать программу, которая считывает текст из файла и выводит на экран сначала вопросительные, а затем восклицательные предложения.
Написать программу, которая считывает текст из файла и выводит его на экран, после каждого предложения добавляя, сколько раз встретилось в нем введенное с клавиатуры слово.
Написать программу, которая считывает текст из файла и выводит на экран все его предложения в обратном порядке.
За последние 60 дней 2 выпусков (1-2 раза в 2 месяца)
Статистика
/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++
Надеюсь, что я правильно понял условие задачи.
С клавиатуры вводится кол-во столов для каждой фабрики по кварталам.
Затем по данным таблицы определяется какая фабрика сделала больше столов.
Если что не так пиши!
Попробуем помочь.
INSTANCE ShellExecute(
HWND hwnd,
LPCTSTR lpOperation,
LPCTSTR lpFile,
LPCTSTR lpParameters,
LPCTSTR lpDirectory,
INT nShowCmd
);
ShellExecuteA(NULL,NULL,"cmd.exe", "/c c:\Lern.bat",NULL,SW_SHOWNORMAL);
Я бы запустил так. Дело в том, что надо указать путь полный, и дескриптор окна в данном случае бессмысленный, это консольное окно.
А вообще, ShellExecute - "Запустить оболочку".. т.е. приложение Windows с предопределенными параметрами ("open","print" и т.д.), и для запуска консольной задачи мало пригодно.. По этому, можно в третьем параметре передать всю строку - батник или программу и если есть параметры..
Можно например так:
ShellExecuteA(NULL,NULL,"c:\Lern.bat",NULL,NULL,SW_SHOWNORMAL);
Код программы с комментариями в приложении (написал в VS 2003, но компилироваться должно любым нормальным С++ компилятором, хотя насчет архаических типа Borland C++ 3.1 не уверен).
Чтобы задать какую-то конкретную функцию X(n) достаточно изменить метод Function::Calculate(int arg) (в текущей реализации X(n) = 3*n).
Код программы смотрите в приложении.
Задание было таким:
Нужно было заменить в строке введённой пользователем все целые числа соотвествующим повторением следующего за ними символа.
Очевидно Ты пользуешься очень старым компилятором (скорее всего Borland C++ 3.1 или Toorbo C++ 3.0).
Современные компиляторы даже не позволят скомпилировать твою программу (вместо <iostream.h> нужно было бы писать <iostream>, а вместо cin(src, 100) - cin.get(src, 100), а также дописать после инклудов строчку "using namespace std;"). Кроме того функции clrscr() и getch() а также заголовочный файл conio.h не входят в состав стандартной библиотеки С++, и их лучше все-таки не использовать (особенно учитывая, что без них легко обойтись).
Тем не менее программа работает неплохо, но в ней есть ошибки. Главная ошибка - память выделяется статически, а не динамически (т.е. длинна всех массивов задана константно - всем по 100 символов). Если для массива scr[] это не опасно (возможное переполнение предотвращается объектом cin (cin.get(src, 100)), то для массива dst[100] существует риск переполнения (например если пользователь введет строчку "Hello1000M", то символ "М" будет повторен 1000 раз, и зарезервированных ста символов явно не хватит.
Лучший способ решить эту проблемму - использовать динамическое выделение памяти. Или хотя бы введи счетчик приращений указателя dist_ptr в функции replace_all_numbers, чтоб когда количество приращений привысит 100, функция не записывала символы за пределы массива.
Еще один баг - если пользователь введет стоку, заканчивающуюся числом (например "Hello5", то строчка "++src_ptr;" выполнится раньше чем произойдет проверка условия в цикле while (т.е. программа перепрыгнет через условее завершение цикла и пойдет дальше бороздить просторы памяти компьютера, пока все-таки не встретит где-нибудь случайный ноль в памяти). Чтоб избежать этго замени сточку "++src_ptr;" на "if(*src_ptr) ++src_ptr;"
Вот, немножко подправил логику..
while (isdigit(*src_ptr))
*num_ptr++ = *src_ptr++;
y++; // нам надо не само число, а количество чисел
>
//***************************
for (int i=0; i i++ )
*dst_ptr++ = *src_ptr;
y = 0; // обнуляем, что бы если будет новая итерация, не суммировалось
в приложение код
Вы не уточнили - в каком именно Visual C++.
CFileDialog(bool flag) - простейший вариант конструктора. если flag=true тогда создастся объект окна с названием Open, иначе название окна будет Save As.
2. в нужном месте программы пишем
CFileDialog dlg=new CFileDialog(true); //создали объект класса
dlg.DoModal(); //отобразили окно, выбрали нужный файл, нажали кнопку ОК,
//после этого компьютер начнет выполнять следующие строчки кода.
CString path=dlg.GetPathName(); // получаем путь до выбранного файла
CString filename=dlg.GetFileName( ) ; // получаем имя выбранного файла
Далее творите с этим файлом все что вам заблагорасудится.
Очень странно. У меня программа скомпилировалась и на VS 2003 (EE) и на VS 2008 (Team System). Скорре всего Вы либо не правильно используете компилятор, либо он как-то криво установлен на вашей машине (т.е. возможно прийдется его переустановить), либо неправильно настроен.
1) Нужно: написать подпрограмму, которая возвращает
преобразованную к верхнему регистру строку, полу-
ченную в качестве аргумента (т.е. вместо малых
букв, выводит строку заглавными буквами). Прове-
рить её в работе, написав программу с её исполь-
зованием.
У меня код есть, НО он отказывается воспринимать русские буквы. Т.е. английские увеличивает как надо, а русские оставляет как было.
2) Задание такое. Подсчитать количество слов в данной последовательности. Помогите сделать :)
Для работы макросов необходимо подключить заголовочный файл <atlconv.h>. Так же для некоторых макросов в тело функции, их использующей, вписать макрос USES_CONVERSION;.
Как сделать так чтобы во время работы программы, т.е. в самом консольном приложении вместо английских букв и дургой абракадабры высвечивались русские буквы? Как поменять кодировку или заменить русские буквы на английские в компиляторе Borland C++ 3.1.
есть еще возможность установить кодировку программно:
SetConsoleOutputCP(1251);
эта команда аналогична system("chcp 1251"), но не выводит в консоль "Текущая кодовая страница: 1251".
strcat и lstrcat тоже по причине 'strcat' : cannot convert parameter 2 from 'LPCWSTR' to 'const char *'.
А вообще при программировании под Windows рекомендуется использовать заголовочный файл "TCHAR.h" и все что к нему прилагается (вместо char - TCHAR, вместо strcat и wcscat - _tcscat, и так далее). Более подробно об этом написано в MSDN.
char mes[255] = ;
sprintf(mes,"Компьютер с адресом %s хочет вас поиметь",inet_ntoa(clientService.sin_addr));
MessageBox(GetActiveWindow(),mes,"Вам привет",MB_OK);
И еще хотел спросить. wchar_t - это же расширенный тип, кот. занимает 2 байта? Тогда wchar_t recvbuf[64] будет занимать 128 байт, так? Тогда в процедуре recvfrom число 64 задано неверно (если я хочу весь буфер задействовать)?
«При этом создается файл без расширения с именем "C" (независимо от того что я ввожу в имени в диалоге) размером 0 байт. В чем дело?»
имя файла - массив двубайтных символов, а каст делается в char*, соответсвенно, все функции, работающие с char-ами, работают до первого нуля, а wchar - второй байт обычно ноль, поэтому в имя файла до нуля успевает попасть только первая буква.
про «Unhandled exception at 0x7c918fea» точно сказать нельзя, возможно он связан с тем же (надо смотреть под дебагом, в зависимости от того, что возвращает recvfrom)
Вот спецификация:
FILE *fopen(
const char *filename,
const char *mode
);
FILE *_wfopen(
const wchar_t *filename,
const wchar_t *mode
);
size_t fwrite(
const void *buffer,// указатель на буфер
size_t size, // размер данных которые записываем в байтах
size_t count,// количество данных
FILE *stream // дескриптор открытого файла
);
Вот так будет верней.
char sFile[] = "test.txt";
FILE *file;
if (SaveFile(sFile))
if((file = fopen(sFile, "w"))!=NULL)
fwrite((wchar_t *)recvbuf,sizeof(wchar_t),wcslen(recvbuf),file);
fclose(file);
>
>
W - это 2-х байтовые, т.е. Юникод.
Если уж вы решили использовать Юникод, то тогда надо полностью использовать только функции для Юникода. Не знаю для чего это вам, но смешивать нельзя (сложности будут), да и работать с Юникодом немного сложнее. Как правило, Юникод выбирают, если есть символы лежащие за границей таблицы в 255 символов (например, Китайский язык).
1)
Даны два угла треугольника (в градусах). Определить, существует ли такой треугольник. Если да, то будет ли он прямоугольным.
2. От введенного числа в цикле постепенно отнимаем количество дней в каждом месяце, пока оно не станет отрицательным. Прибавляем к нему количество дней в текущем месяце и получаем нужное число текущего месяца.
Реализация обоих программ в приложении.
MSDN said:
WM_CTLCOLORSTATIC
A static control, or an edit control that is read-only or disabled, sends the WM_CTLCOLORSTATIC message to its parent window when the control is about to be drawn. By responding to this message, the parent window can use the specified device context handle to set the text and background colors of the static control
То есть в родительском окне надо сделать обработчик
И еще вы забыли сказать, что необходимо создавать переменную для цвета, чтобы менять ее в необходимый момент:
g_dFontColor = RGB(222,2,0);
InvalidateRect(hStat,NULL,FALSE);
char *PassString = "Aa1Bb2Cc3Dd4Ee5Ff6Gg7Hh8Ii9Jj0Kk1Ll2Mm3Nn4Oo5Pp6Qq7Rr8Ss9Tt0UuVvWwYyZzXx";
const int MAX = 72;
int dlina_parol=8; //устанавливает длину пароля 8 чисел
ifstream test ("C:\test.txt"); //открывает файл для считывания
ofstream book ("C:\book.txt"); //создает файл
if ( test.fail() ) //проверяет открылся ли файл test для вывода данных
cout << "Sorry, can't open file! ";
getch();
exit(1);
>
while (! test.eof())// считывает слова с файла test
test >> word; // получает каждое слово из файла test
for (int i=1; i<dlina_parol;i++)
book<<PassString[random(MAX)];//выводит символ в файл book.txt
>
book << ' '<< word << ' '; //выводит в файл book слово из файла test
>
Вот код я правда его не проверял, но по моему должно пойти!
Для этого существует динамическое выделение памяти, используется оператор new
Можно задать массив:
int М[n][n];
А можно объявить указатель на память, который будет с ней работать как типом данных int:
и в нужном месте программы сказать:
при этом это одномерный массив. И если работат с ним, то координаты придётся высчитывать (по формуле n = x+ y*width, где width - ширина выделенного массива; кстати, такой способ более предпочтителен, имхо, потому что максимально прост всмысле выделения памяти, надо тока правильно конвертировать 2-мерные координаты в 1-мерные)
после использования память нужно отпустить:
если хочется именно двумерный массив, то тут немного сложнее: нужно создать указатель на указатель:
и инициализировать сначала один массив указателей:
а потом отдельно каждый указатель
for(int i=0; i<n; i++)
ppM[i] = new int [n];
и освобождать память надо будет в обратном порядке
for(int i=0; i<n; i++)
delete[] ppM[i]
Для этих целей применяется динамическое выделение памяти.
Допустим , n получено программным путем, тогда для создания массива n*n нужно выделить память:
*mas=new int [n]; //выделение памяти
for(i=0;i<n;i++)
mas=new int [n];
>
for(i=0;i<n;i++) delete [] mas[i]; //освобождение памяти
>
или так (в языке Си)
mas=(int**) calloc (n,sizeof(n));
cout<<"Vvedite kolichestvo elementov : ";
cin>>n;
cout<<"Vvedite chislo :";
cin>>rand; // вводим первый элемент для сравнения с последующими
for(i=1;i<n;i++) // вводим в цикле следующие элементы
cout<<"Vvedite chislo :";
cin>>rand;
if(max<rand) // сравниваем вновь введенный элемент с max
max=rand; // запоминает макс. элемент
index=i; // запоминает позицию макс. элемента в последовательности
>
>
cout<<"Maksimalnoe iz vvedennih chisel "<<max<<endl;
cout<<"Ono bylo vvedeno "<<index<<" po schetu (nachinaya s index=0)";
using namespace std;
< int i,n,max,*mas;
cout<<"Vvedite kol-vo chisel v posledovatelnosti : "; // количество элементов без последнего нуля
cin>>n;
mas=new int [n+1]; // выделение памяти под массив
cout<<" "<<mas[n]; // пропечатывает в конце последовательности 0
max=mas[0]; // запоминаем в качестве максимального первый элемент
for(i=1;i<n+1;i++) // перебираем все элементы последовательности с учетом последнего нуля
delete mas; // освобождение памяти
double FirstNegative()
double u, n = 1;
do
u = cos(1/tan(n));
n++;
> while (u>=0); //цикл будет работать пока u не станет отрицательным.
return u;
>
int main(int argc, char* argv[])
printf("pervoe otricatelnoe 4islo: %f", FirstNegative());
getch();
return 0;
>
< int n,kol;
double u;
cout<<"Vvedite kolichestvo elementov v posledovatelnosti : ";
cin>>kol;
cout<<"Perviy otricatelniy element = "<<u<<" pri n="<<n<<endl;
break; // при нахождении первого отриц элемента цикл поиска завершается
>
>
по второму вопросу могу дать общие рекомендации:
1. создать окно со стилем WS_POPUP (это аналог окна Delphi с Borderstyle="bsNone)," это окно в дальнейшем будет всплывающим, как список в ComboBox'е
2. поместить в окно интересующий компонент, в данном случае календарь
3. выставить компоненту выравнивание по всей клиентской области
4. свойство окна visible установить в false
5. переписываем событие деактивации окна (в Delphi - это OnDeactvate)
теперь необходимо расположить видимые компоненты: обычно - это поле вывода, такое как edit и кнопка, для активации всплывающего окна
1. создаем панель
2. кладем на нее edit и кнопку (либо панель вместо кнопки)
3. располагаем компоненты в нужном порядке
4. переписываем событие нажатия кнопки мыши, или клавиатуры на кнопке, например OnClick, OnMouseDown и т.п.
теперь 2 метода которые мы пеерписали:
1. при нажатии на кнопку, определить координаты окна popup и показать его.
2. при деактивации окна popup - скрыть его
после всех манипуляций, если все правильно сделано, получится неплохая имитация всплывающего списка. Но заметно будет следующее: при активации окна popup, заголовок главного окна деактивируется.
почему именно имитация?
Поэтому, когда мы пытаемся сотворить нечто похожее, всегда натыкаемся на необходимость внедрения сложных взаимодействий между окнами (как, например, в случае с календарем: приходится учитывать состояние окна popup в главном окне приложения).
чтобы обходить древья не обязательно использовать рекурсию, я предлагаю общий макет такого обхода, в приолжении его код
stack - искусственный стек, используемый вместо рекурсии
root_id - идентификатор корневого узла дерева
node_id - идентификатор текущего узла, который необходимо обработать
children_of_node - дает число дочерних узлов для node_id
child_node - индексированный доступ к дочернему узлу
макет - это конечно не конкретная реализация метода, это только абстракция алгоритма.
в качестве типа элемента стека здесь принят int, для реестра, это будет идентификатор его ключа, для TreeView это будет идентификатор HTREEITEM и т.д.
методы children_of_node и child_node так же должны быть специализированы для конкретного случая.
цикл for - так же является абстракцией, единственное его предназначение - перебрать все дочерние узлы и дополнить стек их идентификаторами.
в случае, когда корневых узлов несколько (например, как в реестре), идентификаторы всех корневых узлов необходимо добавить в стек перед циклом while, т.е. вместо stack.push_back(root_id) провести обход всех корневых узлов и добавить индекс каждоко в стек.
Для графов, такой обход равнозначен "поиску в глубину"
Код простого TCP эхо сервера и клиента в приложении.
Необходимо добавить к линкеру libws2_32.a
ссылки
-----
• Отредактировал: Shapoklak (Академик)
• Дата редактирования: 11.05.2008, 20:26
На месте щелчка левой клавишей мыши появляется квадрат, всякий раз другого цвета. Обеспечить отображение всех квадратов при сворачивании-разворачивании окна. Хранить координаты щелчков мыши в списочной структуре данных.
Код в приложении, все квадраты со сторойно 20 точек
Проект создан был под VC6 как обычное Win32 приложение
CQuad - структура с координатами и цветом для одного квадрата
iTop - число квадратиков
если что непонятно, спрашивайте
Если интересуют заголовочные файлы, то посмотрите параметры своего компилятора, найдите путь "include" в моём случае базовые лежат в папке C:Program FilesMicrosoft Visual Studio 8VCinclude вот все файлы в такой папке и нужны вам, далее открываем их и видим в начале закомментированные строки с их описанием. Пример: /****malloc.h - declarations and definitions for memory allocation functions.
Читайте также: