Второй вопрос, на котором хочется остановиться, это ввод и вывод информации. Обычно на олимпиадах подобного рода требуется написать программу, работающую с входными и выходными потоками. Все должно выглядеть примерно так. Пусть исполняемый модуль называется prog, тогда
- Код: Выделить всё
Prog <in.txt >out.txt
И все. При этом имена входного и выходного файла нигде в самой программе не задается, а только в командной строке. Это очень удобно. Кроме того всегда можно вводить и выводит с консоли:
- Код: Выделить всё
#ввод из файла, вывод на консоль
Prog <in.txt
#ввод с консоли, вывод файл
Prog >out.txt
#ввод и вывод с консоли
Prog
И так приступаю к примерам.
Листинг 1. Обработка произвольного количества строковой информации (язык C)
- Код: Выделить всё
#include <stdio.h>
int main() {
char s[1000];
while(gets(s)){
/*здесь выполняем какие либо действия с полученной строкой*/
/*выводим строку для контроля*/
puts(s);
}
return 0;
}
Листинг 2. Обработка произвольного количества строковой информации (язык C++)
- Код: Выделить всё
#include <iostream>
using namespace std;
int main() {
char s[1000];
while(!cin.eof()){
cin.getline(s,1000,'\n');
/*здесь выполняем какие либо действия с полученной строкой*/
/*выводим строку для контроля*/
cout << s <<endl;
};
return 0;
}
Листинг 3. Обработка произвольного количества строковой информации (язык Pascal)
- Код: Выделить всё
var
s:ansistring;
begin
while(not eof) do
begin
readln(s);
{здесь выполняем, какие либо действия с полученной строкой}
{выводим строку для контроля}
writeln(s);
end;
end.
В листингах 1-3 представлены примеры обработки текстовых файлов с произвольным количеством строк. Причем программы работают именно с входным и выходным потоками. Как видите механизм очень простой, даже элементарный. Аналогичные программы можно написать и для всех остальных алгоритмических языков: PHP, Python, Perl и т.д.
Теперь обратимся к тому вопросу, с которого я начал свое изложение. И так в большинстве случаев мы всегда знаем, в какой строке сколько параметров имеется.
И так, предположим, что у нас есть текстовый файл, в котором, имеются строки, содержащие числа: два целых и одно вещественное. Вот как будут выглядеть программы, для чтения такого файла. Представленные программы не будут реагировать на количество пробелов в строке: в конце, начале или середине.
Листинг 4. Обработка произвольного количества строк, содержащих числовые данные (язык C)
- Код: Выделить всё
#include <stdio.h>
int main() {
int a,b;
double f;
while(scanf("%d%d%lf",&a,&b,&f)!=-1){
/*здесь выполняем, какие либо действия с полученными числами*/
/*выводим числа для контроля*/
printf("%d %d %lf\n",a,b,f);
}
return 0;
}
Листинг 5. Обработка произвольного количества строк, содержащих числовые данные (язык C++)
- Код: Выделить всё
#include <iostream>
using namespace std;
int main() {
int a,b;
double f;
while(!cin.eof()){
cin >> a >> b >> f;
/*здесь выполняем, какие либо действия с полученными числами*/
/*выводим числа для контроля*/
cout << a << ' ' << b<< ' ' << f <<endl;
};
return 0;
}
Листинг 6. Обработка произвольного количества строк, содержащих числовые данные (язык Pascal)
- Код: Выделить всё
var
a,b:integer;
f:real;
begin
while(not eof) do
begin
readln(a,b,f);
{здесь выполняем, какие либо действия с полученными числами}
{выводим числа для контроля}
writeln(a,b,f);
end;
end.
На олимпиаде ведь большее и не требуется.
Если же с вас потребуют анализ вводимой строки (в условии задачи), например, если в строке попадутся не числа, или если в строке будет большее или меньшее количество чисел, чем заявлено, тогда и надо проводить анализ.
Ну и, наконец, пример программы, где строка действительно разбирается.
Листинг 7. Пример программы с разбором вводимых строк
- Код: Выделить всё
#include <stdio.h>
int get_p(char *, char *, int *);
int main() {
char s[1000],s1[1000];
int i=0;
/*здесь выполняем какие либо действия с полученной строкой*/
while(gets(s)){
/*выводим элементы строки*/
while(get_p(s,s1,&i)){
puts(s1);
}
}
return 0;
}
//функция, которая извлекает очередной элемент строки
int get_p(char *s, char *s1, int *i){
int p=0,j=0;
while(1){
if(s[*i]>32){
if(!p)p=1;
s1[j++]=s[(*i)++];
}else{
if(p||!s[*i])break;
(*i)++;
}
}
s1[j]='\0';
return p;
}
Но в конце концов, ведь есть же библиотечные функции, которые очень хорошо могут разобрать строку на части.