Как записать числа из файла в массив паскаль

Обновлено: 04.07.2024

Программирование. Одномерные массивы Pascal-Паскаль

  • Скачено бесплатно: 18563
  • Куплено: 414

Понятие структуры

До сих пор мы работали с простыми типами данных – логический ( boolean ), целый ( integer , word , byte , longint ), вещественный ( real ), символьный ( char ). Любой алгоритм можно запрограммировать с помощью этих четырех базовых типов. Но для обработки информации о многообразном реальном мире требуются данные, имеющие более сложное строение. Такие сложные конструкции, основанные на простейших скалярных типах, называются структурами. Структура – некоторый составной тип данных, составленный из базовых скалярных. Если структура не изменяет своего строения на протяжении всего выполнения программы, в которой она описана, то такую структуру называют статической.

Массив – однородная совокупность элементов

Самой распространенной структурой, реализованной практически во всех языках программирования, является массив.

Массивы состоят из ограниченного числа компонент, причем все компоненты массива имеют один и тот же тип, называемый базовым. Структура массива всегда однородна. Массив может состоять из элементов типа integer , real или char , либо других однотипных элементов. Из этого, правда, не следует делать вывод, что компоненты массива могут иметь только скалярный тип.

Другая особенность массива состоит в том, что к любой его компоненте можно обращаться произвольным образом. Что это значит? Программа может сразу получить нужный ей элемент по его порядковому номеру (индексу).

Индекс массива

Номер элемента массива называется индексом. Индекс – это значение порядкового типа, определенного, как тип индекса данного массива. Очень часто это целочисленный тип ( integer , word или byte ), но может быть и логический и символьный.

Описание массива в Паскале. В языке Паскаль тип массива задается с использованием специального слова array (англ. – массив), и его объявление в программе выглядит следующим образом:

где I – тип индекса массива, T – тип его элементов.

Можно описывать сразу переменные типа массив, т.е. в разделе описания переменных:

Обычно тип индекса характеризуется некоторым диапазоном значений любого порядкового типа : I 1 .. I n . Например, индексы могут изменяться в диапазоне 1..20 или ' a '..' n '.

При этом длину массива Паскаля характеризует выражение:

Вот, например, объявление двух типов: vector в виде массива Паскаля из 10 целых чисел и stroka в виде массива из 256 символов:

Type
Vector=array [1..10] of integer;
Stroka=array [0..255] of char;

С помощью индекса массива можно обращаться к отдельным элементам любого массива, как к обычной переменной: можно получать значение этого элемента, отдельно присваивать ему значение, использовать его в выражениях.

Опишем переменные типа vector и stroka :

далее в программе мы можем обращаться к отдельным элементам массива a или c . Например, a [5]:=23; c [1]:=' w '; a [7]:= a [5]*2; writeln ( c [1], c [3]).

Вычисление индекса массива Паскаля

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

Этот механизм – весьма мощное средство программирования. Но он порождает распространенную ошибку: результат вычислений может оказаться за пределами интервала допустимых значений индекса, то есть будет произведена попытка обратиться к элементу, которого не существует. Эта типичная ошибка называется «выход за пределы массива».

Пример программы с ошибкой массива Паскаля

Program primer _ error ;
Type
vector=array [1..80] of word;
var
n: integer;
a: vector;
begin
n:=45;
a[n*2]:=25;
end .

Хотя данная программа полностью соответствует синтаксису языка, и транслятор «пропустит» ее, на стадии выполнения произойдет ошибка выхода за пределы массива Паскаля. При n =45 выражение n *2=90, компьютер сделает попытку обратиться к элементу массива a [90], но такого элемента нет, поскольку описан массив размерностью 80.

Из всего этого следует сделать вывод: программисту надо быть очень аккуратным при работе с индексами массива.

Основные действия с массивами Паскаля

Как известно, определение типа данных означает ограничение области допустимых значений, внутреннее представление в ЭВМ, а также набор допустимых операций над данными этого типа. Мы определили тип данных как массив Паскаля. Какие же операции определены над этим типом данных? Единственное действие, которое можно выполнять над массивами целиком, причем только при условии, что массивы однотипны, – это присваивание. Если в программе описаны две переменные одного типа, например,

то можно переменной a присвоить значение переменной b ( a := b ). При этом каждому элементу массива a будет присвоено соответствующее значение из массива b. Все остальные действия над массивами Паскаля производятся поэлементно (это важно!).

Ввод массива Паскаля

Для того чтобы ввести значения элементов массива, необходимо последовательно изменять значение индекса, начиная с первого до последнего, и вводить соответствующий элемент. Для реализации этих действий удобно использовать цикл с заданным числом повторений, т.е. простой арифметический цикл, где параметром цикла будет выступать переменная – индекс массива Паскаля. Значения элементов могут быть введены с клавиатуры или определены с помощью оператора присваивания.

Пример фрагмента программы ввода массива Паскаля

Var
A : array [1..10] of integer ;
I : byte ;
Begin
For i:=1 to 10 do
Readln (a[i]); < ввод i- го элемента производится с клавиатуры >

Рассмотрим теперь случай, когда массив Паскаля заполняется автоматически случайными числами, для этого будем использовать функцию random ( N ).

Пример фрагмента программы заполнения массива Паскаля случайными числами

Var
A: array [1..10] of integer;
I : byte ;
Begin
For i :=1 to 10 do
A [ i ]:= random (10); < i -му элементу массива присваивается «случайное» целое число в диапазоне от 0 до 10>

Вывод массива Паскаля

Вывод массива в Паскале осуществляется также поэлементно, в цикле, где параметром выступает индекс массива, принимая последовательно все значения от первого до последнего.

Пример фрагмента программы вывода массива Паскаля

Var
A: array [1..10] of integer;
I : byte ;
Begin
For i :=1 to 10 do
Write ( a [ i ],' ');

Вывод можно осуществить и в столбик с указанием соответствующего индекса. Но в таком случае нужно учитывать, что при большой размерности массива все элементы могут не поместиться на экране и будет происходить скроллинг, т.е. при заполнении всех строк экрана будет печататься очередной элемент, а верхний смещаться за пределы экрана.

Пример программы вывода массива Паскаля в столбик

Var
A: array [1..10] of integer;
I : byte ;
Begin
For i:=1 to 10 do
Writeln ('a[', i,']=', a[i]); < вывод элементов массива в столбик >

На экране мы увидим, к примеру, следующие значения:

Пример решения задачи с использованием массивов Паскаля

Задача: даны два n -мерных вектора. Найти сумму этих векторов.

Решение задачи:

Ход решения задачи:

  • определим количество элементов (размерность) массивов, введем значение n ;
  • введем массив a ;
  • введем массив b ;
  • в цикле, перебирая значения индекса i от 1 до n , вычислим последовательно значения элементов массива c по формуле:

Текст программы :

Пример программы суммирования векторов

Program summa;
Var
a, b, c: array [1..100] of integer;
I, n: byte;
Begin
Write ('введите размерность массивов:');
Readln(n);
For i:=1 to n do
Readln (a[i]); < ввод массива a>
For i:=1 to n do
Readln (b[i]); < ввод массива b>
For i:=1 to n do
C[i]:=a[i]+b[i]; < вычисление суммы массивов >
For i:=1 to n do
write (c[i],' '); < вывод массива с >
end.

Программирование

Исходники Pascal (127)

Справочник

Справочник по паскалю: директивы, функции, процедуры, операторы и модули по алфавиту

Для чего нам нужно уметь работать с файлами в Паскаль?
Ранее мы рассмотрели ввод и вывод данных в Паскале. Он осуществлялся вручную, с помощью клавиатуры и результат мы также смотрели сами в окне вывода. Для того чтобы быть уверенным в том, что программа написана правильно необходимо протестировать её. Для того чтобы специальные тестирующие системы автоматически проверяли решение необходимо, ввод и вывод данных осуществлять из текстовых файлов. По такой же схеме тестируются задачи на всех этапах республиканских олимпиад по информатике.

Ввод мы будем осуществлять из файла input.txt

Вывод будем производить в файл output.txt

Для организации ввода данных из файла надо:

1.Связать текстовый файл для чтения исходных данных с input:

assign(input,'input.txt').

2. Открыть файл для чтения:
reset(input);

3. При работе нужно понимать и помнить отличия процедуры read, от readln. Если в файле данные записаны в одной строке, через пробел, то мы пользуемся все время процедурой read столько раз, сколько чисел нужно прочитать.
Если же строк несколько, то когда доходим до символа стоящего в конце строки, используем readln. В результате чего будет считано последнее число строки и курсор переместится на новую.
read(a); readln(a);

Например, указан следующий формат ввода:

4. Как только все переменные прочитаны необходимо закрыть файл.
close(input);

Для организации вывода данных в файл надо:

1.Связать текстовый файл для записи результатов с output:

assign(output,'output.txt').

2. Открыть файл для записи:
rewrite(output);

3.Для вывода используем операторы write и writeln также, как и было до сих пор.

4. Как только все переменные выведены необходимо закрыть файл.

Задание 1. Перенаправление. Прочитайте число n из файла input.txt и выведите его в файл output.txt

Program z1;
var a:longint;
Begin
assign(input,'input.txt');
reset(input);
read(a);
close(input);
assign (output,'output.txt');
rewrite(output);
writeln(a);
close(output);
End.

Экспериментальный раздел

Наберите программу в среде программирования Free Pascal, запустите ее на исполнение. У Вас может появится ошибка типа:
exited with exitcode=2 (для Free Pascal), если файла input.txt нет.

Создайте в папке, где сохранена ваша программа файл input.txt и введите в него число.

В этой же папке, после удачного (без ошибок) запуска программы на исполнение должен появиться файл output.txt.

Переход между окнами входных, выходных данных и текстом программы осуществляется нажатием клавиши F6.

Задание 2. Сумма двух чисел. Даны числа А и В (0<А, B<=32000). Найти сумму А+В и вывести ее в выходной файл.

Выходные данные:
В единственную строку выходного файла вывести сумму этих чисел.
Тесты Посмотреть решение

Задание 3. Перепутал строки. Даны два числа А и В(0<=А,В<2 000 000 000). Вывести числа в обратном порядке.

Выходные данные:
В первой строке выходного файла должно быть число В.
Во второй строке выходного файла число А.
Тесты Посмотреть решение

Задание 4. Имеется текстовый файл на 10 строк. Вывести на экран:
а) его первую строку;
б) его пятую строку;
в) его первые 5 строк;
г) его строки с s1-й no s2-ю (s1 и s2 записаны в 11 строке входного файла через пробел);
д) весь файл.


Тесты Посмотреть решение

Задание 5. Сформируйте массив целых чисел (значения для него взять из файла, они записаны во 2-ой строке входного файла). В первой строке этого файла указано количество элементов массива (n<=50). Вывести в выходной файл количество отрицательных чисел массива, его наименьшее и наибольшее значения.

Во второй строке входного файла содержатся N чисел через пробел - элементы массива

Выходные данные:
Первая строка - количество отрицательных элементов массива

Третья строка - наибольший элемент массива

Тесты Посмотреть решение

assign (output,'t1.txt');
rewrite(output);
writeln(t);
close(output);

assign(input,'t.txt');
reset(input);
read(s);
close(input);

assign (output,'t2.txt');
rewrite(output);
writeln(s);
close(output);
End.

Для каждого входного файла
Первая строка содержит число n - количество строк
Вторая строка - n-ая строки содержат текст Выходные данные:
Для каждого выходного файла
Первая строка - n-ая строка содержат текст

Тесты Посмотреть решение

Задание 8. Даны три целых числа. Определить, имеется ли среди них хотя бы
одна пара равных между собой чисел. Выходные данные:
Выведите 'YES' если это так, и 'NO' в противном случае.

Тесты Посмотреть решение


Задание 9. Даны три числа. Определить, существует ли треугольник, сторонами которого являются эти числа, и если существует, найти его площадь. Выходные данные:
В первой строке запись "да" или "нет"
Во второй строке значение площади, если треугольник существует

Тесты Посмотреть решение

Задачи для самостоятельного решения

Программирование. Одномерные массивы Pascal-Паскаль

  • Скачено бесплатно: 18563
  • Куплено: 414

Понятие структуры

До сих пор мы работали с простыми типами данных – логический ( boolean ), целый ( integer , word , byte , longint ), вещественный ( real ), символьный ( char ). Любой алгоритм можно запрограммировать с помощью этих четырех базовых типов. Но для обработки информации о многообразном реальном мире требуются данные, имеющие более сложное строение. Такие сложные конструкции, основанные на простейших скалярных типах, называются структурами. Структура – некоторый составной тип данных, составленный из базовых скалярных. Если структура не изменяет своего строения на протяжении всего выполнения программы, в которой она описана, то такую структуру называют статической.

Массив – однородная совокупность элементов

Самой распространенной структурой, реализованной практически во всех языках программирования, является массив.

Массивы состоят из ограниченного числа компонент, причем все компоненты массива имеют один и тот же тип, называемый базовым. Структура массива всегда однородна. Массив может состоять из элементов типа integer , real или char , либо других однотипных элементов. Из этого, правда, не следует делать вывод, что компоненты массива могут иметь только скалярный тип.

Другая особенность массива состоит в том, что к любой его компоненте можно обращаться произвольным образом. Что это значит? Программа может сразу получить нужный ей элемент по его порядковому номеру (индексу).

Индекс массива

Номер элемента массива называется индексом. Индекс – это значение порядкового типа, определенного, как тип индекса данного массива. Очень часто это целочисленный тип ( integer , word или byte ), но может быть и логический и символьный.

Описание массива в Паскале. В языке Паскаль тип массива задается с использованием специального слова array (англ. – массив), и его объявление в программе выглядит следующим образом:

где I – тип индекса массива, T – тип его элементов.

Можно описывать сразу переменные типа массив, т.е. в разделе описания переменных:

Обычно тип индекса характеризуется некоторым диапазоном значений любого порядкового типа : I 1 .. I n . Например, индексы могут изменяться в диапазоне 1..20 или ' a '..' n '.

При этом длину массива Паскаля характеризует выражение:

Вот, например, объявление двух типов: vector в виде массива Паскаля из 10 целых чисел и stroka в виде массива из 256 символов:

Type
Vector=array [1..10] of integer;
Stroka=array [0..255] of char;

С помощью индекса массива можно обращаться к отдельным элементам любого массива, как к обычной переменной: можно получать значение этого элемента, отдельно присваивать ему значение, использовать его в выражениях.

Опишем переменные типа vector и stroka :

далее в программе мы можем обращаться к отдельным элементам массива a или c . Например, a [5]:=23; c [1]:=' w '; a [7]:= a [5]*2; writeln ( c [1], c [3]).

Вычисление индекса массива Паскаля

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

Этот механизм – весьма мощное средство программирования. Но он порождает распространенную ошибку: результат вычислений может оказаться за пределами интервала допустимых значений индекса, то есть будет произведена попытка обратиться к элементу, которого не существует. Эта типичная ошибка называется «выход за пределы массива».

Пример программы с ошибкой массива Паскаля

Program primer _ error ;
Type
vector=array [1..80] of word;
var
n: integer;
a: vector;
begin
n:=45;
a[n*2]:=25;
end .

Хотя данная программа полностью соответствует синтаксису языка, и транслятор «пропустит» ее, на стадии выполнения произойдет ошибка выхода за пределы массива Паскаля. При n =45 выражение n *2=90, компьютер сделает попытку обратиться к элементу массива a [90], но такого элемента нет, поскольку описан массив размерностью 80.

Из всего этого следует сделать вывод: программисту надо быть очень аккуратным при работе с индексами массива.

Основные действия с массивами Паскаля

Как известно, определение типа данных означает ограничение области допустимых значений, внутреннее представление в ЭВМ, а также набор допустимых операций над данными этого типа. Мы определили тип данных как массив Паскаля. Какие же операции определены над этим типом данных? Единственное действие, которое можно выполнять над массивами целиком, причем только при условии, что массивы однотипны, – это присваивание. Если в программе описаны две переменные одного типа, например,

то можно переменной a присвоить значение переменной b ( a := b ). При этом каждому элементу массива a будет присвоено соответствующее значение из массива b. Все остальные действия над массивами Паскаля производятся поэлементно (это важно!).

Ввод массива Паскаля

Для того чтобы ввести значения элементов массива, необходимо последовательно изменять значение индекса, начиная с первого до последнего, и вводить соответствующий элемент. Для реализации этих действий удобно использовать цикл с заданным числом повторений, т.е. простой арифметический цикл, где параметром цикла будет выступать переменная – индекс массива Паскаля. Значения элементов могут быть введены с клавиатуры или определены с помощью оператора присваивания.

Пример фрагмента программы ввода массива Паскаля

Var
A : array [1..10] of integer ;
I : byte ;
Begin
For i:=1 to 10 do
Readln (a[i]); < ввод i- го элемента производится с клавиатуры >

Рассмотрим теперь случай, когда массив Паскаля заполняется автоматически случайными числами, для этого будем использовать функцию random ( N ).

Пример фрагмента программы заполнения массива Паскаля случайными числами

Var
A: array [1..10] of integer;
I : byte ;
Begin
For i :=1 to 10 do
A [ i ]:= random (10); < i -му элементу массива присваивается «случайное» целое число в диапазоне от 0 до 10>

Вывод массива Паскаля

Вывод массива в Паскале осуществляется также поэлементно, в цикле, где параметром выступает индекс массива, принимая последовательно все значения от первого до последнего.

Пример фрагмента программы вывода массива Паскаля

Var
A: array [1..10] of integer;
I : byte ;
Begin
For i :=1 to 10 do
Write ( a [ i ],' ');

Вывод можно осуществить и в столбик с указанием соответствующего индекса. Но в таком случае нужно учитывать, что при большой размерности массива все элементы могут не поместиться на экране и будет происходить скроллинг, т.е. при заполнении всех строк экрана будет печататься очередной элемент, а верхний смещаться за пределы экрана.

Пример программы вывода массива Паскаля в столбик

Var
A: array [1..10] of integer;
I : byte ;
Begin
For i:=1 to 10 do
Writeln ('a[', i,']=', a[i]); < вывод элементов массива в столбик >

На экране мы увидим, к примеру, следующие значения:

Пример решения задачи с использованием массивов Паскаля

Задача: даны два n -мерных вектора. Найти сумму этих векторов.

Решение задачи:

Ход решения задачи:

  • определим количество элементов (размерность) массивов, введем значение n ;
  • введем массив a ;
  • введем массив b ;
  • в цикле, перебирая значения индекса i от 1 до n , вычислим последовательно значения элементов массива c по формуле:

Текст программы :

Пример программы суммирования векторов

Program summa;
Var
a, b, c: array [1..100] of integer;
I, n: byte;
Begin
Write ('введите размерность массивов:');
Readln(n);
For i:=1 to n do
Readln (a[i]); < ввод массива a>
For i:=1 to n do
Readln (b[i]); < ввод массива b>
For i:=1 to n do
C[i]:=a[i]+b[i]; < вычисление суммы массивов >
For i:=1 to n do
write (c[i],' '); < вывод массива с >
end.

Программирование

Исходники Pascal (127)

Справочник

Справочник по паскалю: директивы, функции, процедуры, операторы и модули по алфавиту

С помощью этой программы я пытаюсь прочитать файл и случайно распечатать его на консоли. Мне интересно, если я должен использовать массивы для этого. Например, я мог бы назначить свои строки в массив и распечатать случайным образом из моего массива. Но я не уверен, как подойти к этому. Также другая проблема заключается в том, что моя текущая программа не читает первую строку из моего файла. У меня есть текстовый файл text.txt , который содержит

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

2 ответа

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

Да, это так. Но вы не пишете это на консоль. Смотрите третью строку, readln(x, s);

Я пытаюсь прочитать файл и случайно распечатать его на консоли. Мне интересно, если я должен использовать массивы для этого.

Да, это разумный подход.

Вместо использования массива записи, просто объявите:

Чтобы получить случайное значение из массива, используйте Randomize для инициализации генератора случайных чисел и Random() для получения случайного индекса.

Я отредактировал ответ, когда прочитал ваш вопрос четко.

Тем не менее, для чтения дополнительной строки вы случайно прочитали строку, прежде чем войти в цикл чтения. Так что это ваша программа от начала до конца без дополнительного readln ().

Для этого кода процедура проста, и на самом деле я могу придумать несколько методов. Для первого метода вы можете прочитать каждую строку в массив. Затем просмотрите массив и создайте случайное число 0 или 1. Если это 1, выведите эту строку.

Для второго метода, каждый раз читая строку из файла, генерируйте случайное число 0 или 1. Если это случайное число равно 1, выведите эту строку.

Обратите внимание на использование randomize перед запуском random (), чтобы не получить одинаковое случайное число последнего выполнения программы. Еще одна вещь, которую стоит принять во внимание, если вы собираетесь использовать большой текстовый файл, каждая длина набора может стоить дорого. Лучше следить за тем, что там происходит, и установить длину 20-30 как единицу или даже 100. Это если вы идете с маршрутом массива.

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

Читайте также: