Bodrenko.com
Bodrenko.org

Учебные дисциплины на сайте Bodrenko.org
Портабельные Windows-приложения на сайте Bodrenko.com
"Геометрические методы математической физики" Компьютерные науки Математика и информатика Векторный и тензорный анализ Теория игр Аналитическая геометрия и линейная алгебра Римановы многообразия Элементы вариационного исцисления Дифференциальная геометрия и топология "Геометрия подмногообразий" Дополнительные главы дифференциальной геометрии "Диффиренциальные уравнения на многообразиях" "Дифференциальная геометрия и топология кривых" Bodrenko.com Bodrenko.org

Bodrenko.org


СБОРНИК ЗАДАЧ ПО 
КОМПЬЮТЕРНОМУ ПРОГРАММИРОВАНИЮ 

Кандидат физ.- мат. наук, доцент А.И.Бодренко.
Введение в теорию компьютерного программирования: Учебно-методическое пособие. 2011
Предлагаемое учебно-методическое пособие соответствует программе университетского курса "компьютерные науки". Оно написано на основе курса лекций, читавшегося автором на математическом факультете. Пособие предназначено для студентов младших курсов университетов. © А.И. Бодренко 2011 Все права защищены Для решения задачи составить программу. В программе предусмотреть ввод и печать исходных данных и печать полученного результата с поясняющим текстом. Использовать циклы для ввода, вывода и обработки массивов. Привести список использованных переменных. Подготовить тесты. Проверить работу программы на ЭBM. Подготовить отчет по каждой программе, показывающий ее работу. Подробно описать 10 --- 15 шагов, распределив их равномерно, включив результат. \S1. Массивы. Пример1: Наибольшее и наименьшее значения одномерного массива. #include<conio.h> main() { float max,min; float mas[15]; int i,nmax,nmin; clrscr(); printf(" \n \t Ищем наибольшее и \ наименьшее значения.\n Введите 15 чисел \:\n"); for (i=0;i<=14;i++) {printf("X%d=",i); scanf("%f",&mas[i]);} max=mas[0]; min=mas[0]; nmin=0; nmax=0; for(i=0;i<=14;i++) { if(mas[i]>max) { max=mas[i]; nmax=i; } if(mas[i]<min) { min=mas[i]; nmin=i; } } printf("\t Максимум: X%d=%f \ \t Минимум:\X%d=%f",nmax,max,nmin,min); getch(); } Пример 2: Равные значения элементов массива. #include<conio.h> main() { float x[15]; int i,j; clrscr(); printf ("\n \t Ищем равные значения. \ \n Введите 15 чисел: \n"); for(i=0;i<=14;i++) { printf("X%d=",i); scanf("%f",&x[i]); } for(i=0;i<14;i++) { for(j=i+1;j<=14;j++) { if (x[i] = = x[j]) { printf("X %d=X %d=%f \n",i,j,x[i]);} } } getch(); } Пример 3: Сортировка массива в порядке возрастания. #include<conio.h> main() { float x[10],m; int i,j; clrscr(); printf ("\n \t Сортируем числа в \порядке возрастания.\n \n Введите 10 \ чисел: \n"); for (i=0;i<=9;i++) scanf("%f",&x[i]); for (i=1;i<=9;i++) {m=x[i-1]; for (j=i;j<=9;j++) { if (m>x[j]) { x[i-1]=x[j]; x[j]=m; m=x[i-1]; } } } printf ("По возрастанию это: \n"); for (i=0;i<=9;i++) { printf ("%f \n",x[i]); } getch(); } Пример 4: Определение элементов массива, модуль разности которых наибольший. #include<conio.h> #include<math.h> main() { int i,n; float max,min,a[100]; /* Ищем элементы массива модуль разности которых наибольший. */ clrscr(); printf("Введите количество переменных,n="); scanf("%d",& n); printf("Введите переменные: \n"); for(i=0;i<n;i++) { printf("x%d=",i+1); scanf("%f",&a[i]); } max=a[0]; min=a[0]; for (i=1;i<n;i++) { if(max < a[i]) max=a[i]; if(min > a[i]) min=a[i]; } printf("Наибольший модуль разности у \ переменных %3.2f и %3.2f, \n и он \ равен %3.2f",max,min,fabs(min-max)); getch(); } 1. Найти сумму элементов одномерного массива размером 4. Разделить каждый элемент исходного массива на полученное значение. Результат получить в том же массиве. Напечатать в одной строке. 2. Вычислить сумму и разность двух заданных одномерных массивов размером 5. Результат напечатать в виде двух параллельных столбцов. 3. Просуммировать элементы строк матрицы размером 4ХЗ. Результат получить в одномерном массиве размером 4. 4. Задан массив X размером 5. Вычислить значения функции Y=ln X при значениях аргумента, заданных в массиве X, и поместить их в массив Y. Напечатать результат (массивы X и Y) в виде двух столбцов. 5. Найти среднее значение элементов заданного массива. Преобразовать исходный массив, вычитая из каждого элемента среднее значение. 6. Решить уравнение ax=b для пяти пар значений а и b, заданных в виде двух массивов. Результат поместить в массив X. 7. Вычислить скалярное произведение двух векторов (Х, Y) размером 4. 8. Вычислить длину вектора X размером 4. 9. Вычислить сумму двух заданных матриц размером 3Х3. 10. Найти сумму всех элементов матрицы размером 4ХЗ. 11. Просуммировать элементы столбцов заданной матрицы размером 4х3. Результат получить в одномерном массиве размером 3. 12. Определить среднее значение элементов массива. Найти далее индекс элемента массива, наиболее близкого к среднему значению. 13. Задан массив размером 10. Сформировать два массива размером 5, включая в первый элементы исходного массива с четными индексами, а во второй --- с нечетными. 14. Заданы матрица размером 5Х5 и число К. Разделить элементы К-й строки на диагональный элемент, расположенный в этой строке. 15. Заданы матрица А размером 4Х4 и числа К и L. Из L-ой строки вычесть К-ую, умноженную на а(l,0)/а(k,0). \S2. Матрицы. 2.1. Завершение процесса. exit(status); abort(); atexit(func()); Возможны два способа завершения процесса: --- нормальное завершение, которое происходит в результате либо возврата управления из функции main, либо выполнения процессом функции exit; --- аварийное завершение, которое происходит в результате выполнения процессом функции abort или получения им некоторых сигналов. exit вызывает нормальное завершение процесса. В первую очередь вызываются все функции, объявленные ранее посредством atexit. Они вызываются в порядке, обратном их объявлению. Затем все открытые потоки очищаются и закрываются, все временные файлы удаляются. 1. Для заданной квадратной матрицы сформировать одномерный массив из ее диагональных элементов. Найти след матрицы, суммируя элементы одномерного массива. Преобразовать исходную матрицу по правилу: четные строки разделить на полученное значение, нечетные оставить без изменения. Преобразованную матрицу напечатать по строкам. 2. Задана прямоугольная матрица. Получить транспонированную матрицу и напечатать ее по строкам. 3. Заданы матрица и вектор. Получить их произведение. Напечатать в строку. 4. Заданы два одномерных массива различных размеров. Объединить их в один массив, включив второй массив между К-м и K-1 ---ым элементами первого (К задано). 5. Заданы две матрицы А и В размером NXN. Сформировать из них прямоугольную матрицу X размером NX2N, включая в первые N столбцов матрицу А, в следующие --- матрицу В. 6. Задан массив А размером NxM и вектор В размером М. Элементы первого столбца массива А упорядочены по убыванию. Включить массив В в качестве новой строки в массив А с сохранием упорядоченности по элементам первого столбца. 7. Матрица размещена в одномерном массиве по строкам. Удалить К-ю строку матрицы (К задано) из одномерного массива. Результат напечатать по строкам. 8. В задаче 7 удалить К-й столбец. Результат напечатать по строкам. 9. В задаче 7 поменять местами К-ю и L-ю строки. Результат вывести по строкам. 10. В задаче 7 поменять местами К-й и L-й столбцы. Результат вывести по строкам. 11. Из заданной матрицы удалить К-ю строку и L-й столбец. 12. В заданной матрице заменить К-ю строку и L-й столбец нулями, кроме элемента, расположенного на их пересечении. 13. В одномерном массиве размещены: в первых N элементах значения аргумента в порядке возрастания, в следующих --- соответствующие им значения функции, и задана пара чисел --- значения аргумента и функции. Поместить их в массив с сохранением упорядоченности по значениям аргумента. Напечатать полученный массив в виде двух параллельных столбцов (аргумент и функция). 14. Заданную квадратную матрицу преобразовать, используя умножение строки на число и сложение строк, таким образом, чтобы все элементы первого столбца обратились в нуль, кроме элемента, расположенного на главной диагонали. 15. Заданную квадратную матрицу преобразовать, используя умножение столбца на число и сложение столбцов, таким образом, чтобы все элементы первой строки обратились в нуль, кроме элемента, расположенного на главной диагонали. \S3. Матрицы и одномерные массивы. 1. Задан массив X размером N. Сформировать из него матрицу А, содержащую по L элементов в строке. Недостающие элементы в последней строке (если такие будут) заполнить нулями. Напечатать матрицу по строкам. 2. Вычислить значения функции \cos х+ х \sin х в n точках отрезка [0,k] . Вычисляемые значения помещать в одномерный массив парами xi, yi. Напечатать полученный массив в два столбца (аргумент и функция), используя для аргумента вывод по формату с фиксированной точкой, а для функции --- по формату с плавающей точкой (с порядком). 3. Задана матрица А размером NXN. Сформировать два одномерных массива. В один переслать по строкам верхний треугольник матрицы, включая элементы главной диагонали, в другой --- нижний треугольник. Распечатать верхний и нижний треугольники по строкам. 4. Квадратная матрица задана в виде одномерного массива по строкам. Напечатать верхний треугольник матрицы ( включая элементы главной диагонали ) по строкам. 5. Матрица, симметричная относительно главной диагонали, задана верхним треугольником в виде одномерного массива по строкам. Восстановить исходную квадратную матрицу и напечатать по строкам. 6. Задана квадратная матрица. Переставить строку с максимальным элементом на главной диагонали со строкой е заданным номером. 7. Задана квадратная матрица. Исключить из нее строку и столбец, на пересечении которых расположен максимальный элемент главной диагонали. 8. Заданы матрица (размером NXN) и число К. Строку с максимальным по модулю элементом в К-ом столбце переставить с К-й строкой. 9. Заданы матрица (размером NXN) и число К. Столбец с максимальным по модулю элементом в К-й строке переставить с К-ым столбцом. \S4. Практическое программирование(ч.1). 4.1. Базовый ввод-вывод. Операции с открытым файлом. Базовый уровень обеспечивает обмен с файлом, интерпретируемым как одномерный массив байтов с прямым доступом. На этом уровне в памяти процесса нет буферизации передаваемых данных: между памятью процесса и файлом передается столько байтов, сколько указано в функции чтения или записи. Для каждого открытого файла система ведет указатель чтения/записи. Ввод-вывод выполняется последовательно. При чтении (записи) n байтов указатель продвигается вперед по файлу на n байтов и устанавливается в позицию очередного читаемого (записываемого) байта. В начале работы с файлом его открывают или создают функцией open. Функция open возвращает номер открытого файла, которым затем используется при чтении и записи. После того как файл открыт, к нему могут применяться функции read (чтение) и write (запись). При чтении из файла читаются очередные байты. Возвращаемое значение представляет собой действительное число прочитанных байтов. Оно может оказаться меньше требуемого числа, если до конца файла осталось меньше байтов, чем требуется, или устройство не передает такого числа байтов. Например, с терминала обычно можно прочесть не больше одной строки, а с магнитной ленты не больше размера зоны (физического блока). Если достигнут конец файла, read возвращает О. При записи в файл записываются очередные байты, расположенные в памяти процесса. Если возвращаемое значение не равно числу записываемых байтов, это свидетельствует об ошибке. Записываемые байты изменяют только те части файла, которые определяются указателем чтения/записи и числом записываемых байтов. Другие части файла остаются неизменными. Если очередной байт указывается за концом файла, обеспечивается соответствующее увеличение размера файла. Прямой доступ к файлу реализуется вызовом lseek, устанавливающим указатель чтения/записи в требуемую позицию. Позиционирование возможно в тех файлах, где оно допускается типом файла или природой внешнего устройства. По окончании работы с файлом его следует закрыть с помощью функции сlose. Когда процесс завершаетя, открытые им файлы автоматически закрываются. 4.2. Открытие и закрытие файла. #include< sys/types.h> #include< sys/stat.h> #include< fcntl.h> i=open(path,oflag,mode); i=creat(path,mode); i=close(fildes); open открывает файл с именем path и формирует соответствующий номер открытого файла. Этот номер используется другими функциями для выполнения операций ввода-вывода с открытым файлом. Указатель позиции устанавливается на начало файла. Следующие флаги являются обязательными: O\_RONLY открыть только для чтения. O\_WRONLY открыть только для записи. O\_RDWR открыть для чтения и записи. close закрывает открытый файл с номером fildes. Номер открытого файла освобождается для последующего его использования. 4.3. Запись в файл. i=write(fildes,buf,nbyte); write пытается записать в файл nhyte байтов из буфера, по указателю buf. В случае обычного файла, допускающего позиционирование write, начинается запись с байта --- указателя позиционирования в в файле. Если запись прошла успешно, wnte увеличивает значение указателя позиции на действительное число записанных байтов. Если файл обычный и новое значение указателя превысило размер файла, размер становится равным значению указателя. Если файл не допускает позиционирования, запись байтов происходит с текущей позиции файла. Значение указателя позиции в таком файле не определено. Если в write указано число байтов, для которого не хватает места в файле (например, достигнут физический конец носителя), записывается столько байтов, сколько помещается . 4.4. Позиционирование в файле. #include< sys/types.h> #include< unistd.h> i=lseek(fildes,whence,offset); lseek устанавливает указатель позиции в открытом файле с номером fildes. Положение указателя определяется одним из следующих значений аргумента whence. SEEK\_SET Указатель устанавливается в позицию, отстоящую на offset байтов от начала файла. SEEK\_CUR Указатель устанавливается в позицию, отстоящую на offset байтов от текущей позиции. SEEK\_END Указатель устанавливается в позицию, отстоящую на offset байтов от конца файла. lseek допускает установку указателя за концом файла, но не приводит к увеличению размера файла. Размер файла возрастет, если будет произведена запись данных при таком положении указателя. Незаполненная данными область между прежним концом файла и установленным за пределами файла функцией lseek указателем позиции будет читаться как нулевые байты, пока в нее не будет что-то записано. lseek при успешном завершении возвращает новое значение указателя позиции, т.е. число байтов от начала файла до положения указателя. Пример 1: Сигнальный механизм. #include<signal.h> #include<assert.h> #include<process.h> #include<math.h> void f1(); main() { float a,b,c,d; float x,t=1; clrscr(); printf("\n ВВЕДИТЕ ЧИСЛА: a, b, c, d = "); scanf("%f,%f,%f,%f",&a,&b,&c,&d); printf("\n ВВЕДИТЕ ПЕРЕМЕННУЮ x:"); scanf("%f",&x); signal(SIGFPE,f1); t=(a*x+b)/(c*x+d); printf("t=%f",t); getch(); } void f1() { printf("\n ПРОИЗОШЛО ДЕЛЕНИЕ НА НОЛЬ \n"); exit(0); } Пример 2: Время работы программы. #include<time.h> main() { clock\_t i; int k; clrscr(); for(k=1;k< 1000;k++) { i=clock(); printf("%d ",i);} } Пример 3: Копирование файла. #include<io.h> #include<fcntl.h> #include<sys|stat.h> main() { int i,t; char *cc; i=open("c:q1.c",O\_RDONLY,S\_IFREG); read(i,cc,200); t=creat("c:q2.c",S\_IFREG); write(t,cc,200); } 1. Пять спортсменов стартуют одновременно из одной точки с начальными скоростями 10 км/час, 9,5 км/час, 9,25 км/час, 9 км/час, 8,5 км/час и равномерно (линейно) за каждый следующий час увеличивают свою скорость на 1 км, 1,2 км, 1,4 км, 1,6 км и 1,8 км соответственно. Выяснить, какие спортсмены будут друг от друга на максимальном и какие на минимальном расстоянии через 2,25 часа; через 4 часа. Вычисление матрицы расстояний между спортсменами оформить в виде подпрограммы. Поиск максимального расстояния оформить в виде подпрограммы. Поиск минимального расстояния оформить в виде подпрограммы. 2. В задаче 1 выяснить, у каких спортсменов будет максимальная и у каких будет минимальная разность скоростей через 2 часа; через 4 часа. Вычисление матрицы разности скоростей оформить в виде подпрограммы. Поиск максимальной разности скоростей оформить в виде подпрограммы. Поиск минимальной разности скоростей оформить в виде подпрограмм. 3. Вычисление площади треугольника оформить в виде подпрограммы. 4. Осуществить проверку на принадлежность квадрата кругу. 5. На плоскости заданы координаты пяти точек А, Д, С, D и Е. Выяснить, какие точки находятся на максимальном и минимдльном расстояниях друг от друга, и вычислить сумму всех расстояний между точками. Поиск максимального расстояния оформить в виде подпрограммы. Поиск минимального расстояния оформить в виде подпрограммы. Суммирование расстояний оформить в виде подпрограммы. 6. Пять парабол выходят из одной точки. Выяснить, какие точки пересечения с осью OX будут на максимальном и какие наминимальном расстоянии друг от друга. Вычисление матрицы расстояний между точками оформить в виде подпрограммы. Поиск максимального расстояния оформить в виде подпрограммы. Поиск минимального расстояния оформить в виде подпрограммы. 7. Выпуклый четырехугольник задан координатами своих вершин А, Д, С и D в порядке их обхода. Середины соседних старой четырехугольника соединяются отрезками. Проверить, является ли полученный четырехугольник параллелограммом с площадью, равной половине исходного четырехугольника. Вычисление координат середин сторон четырехугольника оформись в виде подпрограммы. Проверку того, является ли четырехугольник параллелограммом, оформить в виде подпрограммы. 8. При х, изменяюгцемся от О до 3 с шагом 0,5, найти --- максимальное значение третьей проидводной многочлена пятой степени и минимальное значение четвертой производной того же многочлена. Вычисление коэффициентов производной оформить в виде подпрограммы. Поиск максимального элемента массива оформить в виде подпрограммы. Поиск минимальяого элемента оформить в виде подпрограммы. 9. При х, изменяющемся от -2 до 3 с шагом 0,5, найти максимальное значение суммы многочлена четвертой степени и его третьей производной. Вычисление коэффициентов производной многочлена оформить в виде подпрограммы. Вычисление коэффициентов суммы двух многочленов оформить в виде подпрограммы. Поиск максимального элемента массива оформить в виде подпрограммы. 10. При x, изменяющемся от -3 до 2 с шагом 0,5, вычислить значения суммы многочлена четвертой степени и его второй производной. Затем просуммировать полученные значения. Вычисление коэффициентов производной многочлена оформить в виде подпрограммы. Вычисление коэффициентов суммы двух многочленов оформить в виде подпрограммы. Суммирование элементов массива оформить в виде подпрограммы. 11. При х, изменяющемся от -2 до 2 с шагом 0,5, вычислить значения четвертой производной многочлена пятой степени и просуммировать полученные значения. Вычисление коэффициентов k-ой производной многочлена степени п оформить в виде подпрограммы. Суммирование элементов массива оформить в виде подпрограммы. 12. Вычислить приближенно площадь фигуры, огранчченной частью кривой y=y(x)=\sin^{2}x , лежащей в верхней полуплоскости, осью абсцисс и прямой х=0.5. Для вычисления площади интервал изменения х разделить на 10 частей, на полученных отрезках построить прямоугольники c высотой, равной значению у(х) в середине каждого отрезка, и просуммировать площади прямоугольников. Вычисление производить с помощью функции. Вычисление площади оформить в виде подпрограммы. 13. Вычислить приближенно площадь фигуры, ограниченной частью кривой y=y(x)=\sin^{2} x*x^{2} и осью Ox. 14. Вычислить площадь четырехугольника, лежащего на плоскости, зная координаты всех его вершин. \S5 Гистограммы. 3адания требуют вывода результатов в виде гистограмм и построения на экране дисплея геометрических фигур. Пример 1: Оси координат. #include<graphics.h> main() {int i,j,h,i1=0,a1,a2,k; initgraph(&i1,&i1,"c:\\borland\\tc \\bgi"); a1=getmaxx()/2; a2=getmaxy()/2; line(0,a2,2*a1,a2); line(a1,0,a1,2*a2); h=20;k=a2/h; for(i=0;i <=k;i++) {line(a1+i*h,a2+5,a1+i*h,a2-5); line(a1-5,a2-i*h,a1+5,a2-i*h); } getch(); closegraph(); } Пример 2: Гипербола. #include<stdio.h> #include<graphics.h> #include<math.h> main() {int i,j,h,i1=0,k; float a1,a2,x,y; initgraph(&i1,&i1,"c:\\borland\\TC\\BGI"); a1=getmaxx()/2; a2=getmaxy()/2; line(0,a2,2*a1,a2); line(a1,0,a1,2*a2); h=20;k=a2/h; for(i=0;i<=k;i++) {line(a1+i*h,a2+5,a1+i*h,a2-5); line(a1-5,a2-i*h,a1+5,a2-i*h); } outtextxy(a1-10,a2+10,"0"); outtextxy(getmaxx()/2-3,0,"'"); outtextxy(2*a1-6,a2-3,">"); outtextxy(getmaxx()/2+6,0,"y"); outtextxy(2*a1-6,a2+6,"x"); outtextxy(a1+70,a2-30,"f(x)=(x+1)/(x-1)"); for(x=-15;x<=15;x+=0.0005) {y=(x+1)/(x-1); putpixel(a1+h*x,a2+h*y,RED); } getch(); closegraph(); } 1. Для анализа работы межсовхозной ГЭС собраны среднемесячные далные по расходу воды за 1 год. Изобразить их в виде гистограммы. В начале линии гистограммы вывести название месяца. Диапазон данных: от 100 м^{3}/c до 500 м^{3}/c. 2. Построить гистограмму распределения количества крупных стихийных бедствий, происходящих в мире, по годам с 1950 по 1995. В начале линии вывести год. Диапазон: от 43 до 81 бедствия. 3. Построить гистограмму количества картофеля, собранного каждой из 10 бригад. В начале каждой линии гистограммы вывести номер бригады. Диапазон: от 10 т до 40 т. 4. ЭВМ ведет учет вторсырья, собранного сотрудниками завода за год. Построить гистограмму количества вторсырья, собранного в цехе по отделам (в цехе по два отдела с 1-го по 3-й и по одному отделу 4, 5). В начале липни напечатать отдел. Диапазон: от 800 кг до 2 т. 5. Построить гистограмму числа побед, одержанных за один сезон каждой из 16 команд высшей лиги по футболу. В начале линии напечатать название команды. Диапазон: от 5 до 25 побед. 6. При проведении популярности артиста по количеству голосов, поданных за него зрителями. Построить гистограмму сравнительной оценки популярности 10 артистов. В начале каждой линии вывести фамилию артиста. Диапазон: от 30 до 150 голосов. 7. Построить гистограмму распределения забитых мячей для 10 лучших футболистов России. В начале линии гистограммы вывести фамилию спортсмена. Диапазон: от 50 до 150 мячей. 8. Построить равнобедренный треугольник высотой Н с и основанием А. 9. Построить ромб, диагонали которого равны А и В. Ромб расположить так, чтобы одна из диагоналей располагалась горизонтально. 10. Построить равнобедренную трапецию, высота которой равна Н, основания --- А и В. Основания расположены горизонтально. 11. В задаче 10 основания расположить вертикально. 12. Построить прямоугольную трапецию (высота - Н, основания --- А и В). Основания расположить горизонтально. 13. Построить параллелограмм со сторонами А и В. Сторона А расположена горизонтально. 14. Построить правильный шестиугольник со стороной А. Две стороны расположены горизонтально. 15. Построить правильный шестиугольник со стороной А. Две стороны расположены вертикально (A=5). \S6. Практическое программирование(ч.2). 6.1. Стандартный буферизованный ввод-вывод. Потоки. Стандартный буферизованный ввод-вывод является надстройкой над базовым уровнем. Подобно базовому уровню, он интерпретирует файл как одномерный массив байтов с прямым доступом. Потоки дают возможность обмениваться с файлом, буферизуя данные в памяти процесса. При чтении из потока происходит считывание блока данных из файла в буфер, а из буфера процессу передается столько байтов, сколько он запросил. Когда при очередном чтении из потока в буфере уже нет требуемых данных, происходит очередное считывание блока данных из файла в буфер. Аналогично при записи в поток передаваемые процессом данные накапливаются в буфере и передаются системе для записи в файл лишь после того, как буфер заполнится, или при закрытии потока. Буфер связывается с потоком либо автоматически, либо посредством функций set-buf и setvbuf. В частности, можно сделать поток небуферизованным. Поток открывается функцией fopen, создающей структуру управления потоком и возвращающей указатель на нее (указатель на тип FILE). Этот указатель используется для идентификации открытого потока в последующих операциях ввода-вывода. Поток закрывается функцией fclose. Чистка буфера потока осуществляется с помощью функции fflush. Когда процесс начинает работу, он имеет уже открытыми три стандартных потока: стандартный ввод, стандартный вывод и стандартную диагностику. Имена stdin, stdout и stderr получают в качестве значений указатели на управляющие структуры этих потоков. Стандартный ввод используется как устройство чтения по умолчанию, стандартный вывод --- как устройство записи по умолчанию, стандартная диагностика --- для вывода сообщений об ошибках. Средства ввода-вывода буферизованного обмена позволяют передавать символы, символьные строки, данные заданного типа (размера), форматировать вводимую и выводимую информацию. Как и на базовом уровне, возможна установка позиции в потоке. 6.2. Открытие, закрытие и буферизация потока. #include< stdio.h> p=fopen(path,mode); p=freopen(path,mode,*stream); p=fdopen(fildes,mode); i=fileno(*stream); p=tmpfile(); i=fflush(*stream); i=fclose(*stream); i=setvbuf(*stream,buf,mode,size); i=setbuf(*stream,buf); Если поток открывается для модификации (второй символ в mode есть +), с ним можно выполнять и ввод, и вывод. Однако между последовательными вводом и выводом нужно выполнить fflush или позиционирование указателя в потоке (fseek). Между последовательными выводом и вводом также нужно выполнить позиционирование указателя. Если поток открывается для добавления к нему информации (mode начинается с а), запись всегда делается в конец файла, независимо от предыдущего позиционирования указателя. После открытия поток полностью буферизован, если он не связан с интерактив- ным устройством. Freopen открывает файл с именем path и связывает с ним поток stream. Аргумент mode такой же, как в fopen. Перед открытием файла функция freopen закрывает, если это удается, файл, связанный с потоком stream. Freopen действует как fclose применительно к закрываемому потоку и как fopen к открываемому потоку. Fdopen связывает поток с открытым файлом. Fildes задает номер открытого файла. Аргумент mode такой же, как в fopen, только "w" и "w+" не усекают файл. Указатель позиции в потоке устанавливается в положение, которое он имел в открытом файле. Fileno получает номер открытого файла, связанного с потоком stream. Tmpfile создает временный файл, который будет автоматически удален при его закрытии или завершении процесса. Связанный с этим файлом поток открывается для модификации в режиме "w+". При открытии функция ведет себя так же, как fopen. fflush в случае, если поток открыт для записи, передает системе для записи в файл все буферизованные и незаписанные еще данные потока stream. Если поток открыт для чтения, все буферизованные и непрочитанные еще данные уничтожаются. Fclose очищает поток stream и закрывает связанный с ним файл. Если есть буферизованные и незаписанные еще данные, они передаются системе для записи в файл. Все буферизованные и непрочитанные еще данные уничтожаются. Поток отсоединяется от файла. setbuf может быть использована только после открытия потока и до выполнения любой другой операции с потоком. Аргумент mode задает вид буферизации потока steam: \_IOFBF Полностью буферизованный ввод-вывод. \_IOLBF Строчно буферизованный ввод-вывод. \_IONBF Небуферизованный ввод-вывод. byf указывает буфер, который связывается с потоком. Size задает размер этого буфера. 6.3. Ввод-вывод элементов данных. #include< stdio.h> t=fread(*ptr,size,nmemb,*stream); t=fwrite(*ptr,size,nmemb,*stream); fread читает из потока stream в массив ptr не более nmemb элементов данных. Длина элемента равна size. При успешном завершении указатель позиции в потоке (если он определен) устанавливается за прочитанными элементами. После чтения отдельного лемента, а также при обнаружении ошибки положение указателя не определено. fwrite записывает в поток stream из массива ptr не более nmemb элементов данных. длина элемента равна size. При успешном завершении указатель позиции в потоке (eсли он определен) устанавливается за выведенными элементами. Пример 1: Работа с файлами. #include<stdio.h> #include<stdlib.h> #include<process.h> FILE *po; main() { char string[100]; po=fopen("file","wt"); if ( po==NULL ) printf("Eror of build file"); else { puts("Put string"); scanf("%s",string); fprintf(po,"%s",string); fclose(po); getch(); system("type file"); } getch(); } Пример 2: Буферизация. #include<fcntl.h> #include<io.h> #include<stdio.h> char buffer[40000]; main() {int f\_handle; unsigned int koli=40000,byte; if((f\_handle=open("file1.txt",O\_RDONLY))==-1) {perror("неудача!"); exit(1);}; if(( byte=read(f\_handle,buffer,koli))<=0) perror("файл не читается!") ; else printf("чтение % байтов из файла \n",koli); } Пример 3: Определение кода клавиши. #include<conio.h> main() { int a,b; printf("\n \t Узнаем коды клавиш:"); M: printf("\n Нажмите клавишу. "); a=getch(); printf("%d-код этой клавиши.\n Продолжить? Ввод",a); b=getch(); if (b==13) goto M; } Пример 4: Определение одной строки внутри другой. #include<conio.h> main() { char *a,*b; int i,j,k,l,m,n; clrscr(); printf("Введите кол-во символов в первой строке: "); scanf("%d",&k); printf("Введите первую строку: "); for (i=0;i<k;i++) {a[i]=getch(); putch(a[i]);} printf("\n Введите кол-во символов во второй ("меньшей") строке: "); scanf("%d",&l); printf("Введите эту строку: "); for (i=0;i<l;i++) {b[i]=getch(); putch(b[i]);} n=0; for (i=0;i<=k-l;i++) { m=0; if (b[0]==a[i]) { for(j=1;j<l;j++) { if (b[j]==a[i+j]) {;} else m=1;} } else m=1; if (m==0) n=n+1;} if (n==0) printf("\ n Вторая строка не содержится в первой."); else printf("\n Вторая строка содержится в первой %d раз.",n); getch(); } Пример 5: Базовый и стандартный буферизованный ввод-вывод. #include<io.h> #include<stdio.h> #include<fcntl.h> #include<sys|stat.h> #include<alloc.h> main() { FILE *p,*p1; int i,j; size\_t k; char *h,*buf; h=(char *)calloc(30,sizeof(char)); p=fopen("c:asd.bak","r"); j=open("c:asd.bak",O\_RDWR,S\_IFREG); read(j,buf,30); fread(h,sizeof(char),30,p); for(i=0;i<=10;i++) { printf("%c \t *** %c **** %c **** %c \n",*(h+i),buf[i],h[i],*(buf+i)); } creat("c:df.c",S\_IFREG); creat("c:df1.c",S\_IFREG); i=open("c:df1.c",O\_RDWR,S\_IFREG); p1=fopen("c:df.c","w"); k=fwrite(h,sizeof(char),10,p1); j=write(i,buf,100); } 1. Информация о количестве выладавщих в течение месяца осадков задана в виде массива. Определить общее количество осадков за месяц. 2. Информация о температуре воздуха за месяц задана в массиве. Определить, сколько раз температура опускалась ниже 0. 3. Информация о средней суточной температуре воздуха месяц задана в виде массива. Определить, температура сколько дней была ниже среднемесячной. 4. Регистрация направления ветра на горном плато производится один раз в день по очереди двумя исследователями. Каждый месяц все результаты сводятся в одну таблицу. Составить программу, выполняющую эту операцию. У к а з а н и е. Направление ветра кодируется следующим образом: 1 --- северный 5 --- северо-западный 2 --- южный 6 --- северо-восточный 3 --- восточный 7 --- юго-западный 4 --- западный 8 --- юго-восточный 5. Информация о количестве осадков, выпадавших в течении месяца, и о температуре воздуха задана в виде двух массивов. Составить программу, выполняющую эту операцию. 6. Вес обучающихся в группе представлен в виде массива. Вес студенток кодируется знаком +, вес студентов знаком -. Определить средний вес студентов. 7. В области 10 районов. Известны площади, засеваемые пшеницей, и средняя урожайность (Ц/га) в каждом районе. Определить количество пшеницы, собранное в области, и среднюю урожайность по области. 8. В области 10 районов. Заданы площади, засеваемые в каждом районе пшеницей, и урожай, собранный в каждом районе. Определить среднюю урожайность пшеницы по каждому району и по области в целом. 9. Результаты переписи населения хранятся в памяти ЭВМ. Используя массивы фамилий и года рождения, напечатать фамилии и подсчитать общее число жителей, родившихся раньше 1928 года. 10. Ртутные термометры могут использоваться для измерения температуры до -39,4 С. Используя информацию о минимальной температуре, зафиксированной в каждом году из последних 100 лет в г. Воронеже, определить, можно ли поставлять ртутные термометры в этот город. 11. Задан список участников соревнований по плаванию и их результаты. Напечатать фамилию и результат чемпиона. 12. В памяти ЭВМ хранится информация о валовом сборе жа по районам отдельно за 1984 и 1985 гг. Определить суммарный сбор зерна по каждому району за 2 года. 13. В задаче 11 расположить результаты и фамилия участников в соответствни с занятыми местами. 14. Фамилии участников соревнований по фигурному катанию для короткой программы расположены в порядка, соответстощем занятому месту. Составить список участников в порядке стартовых номеров для произвольной программы (участники выступают в порядке, обратном занятым местам). 15. При поступленни в институт лица, получившие двойку на первом экзамене, ко второму экзамену не допускаются. Считая фамилии абитуриентов и их оценки после первого экзамена исходными данными, составить список абитуриентов, допущенных ко второму экзамену. \S7. Практическое программирование(ч.3). Пример 1: Определение символа в строке. #include<conio.h> main() { int i; char *b,d; b="acdabc"; d='a'; /* Определение d в строке b */ for(i=0;i<=5;i++) {if(d==b[i]) {printf("%d \n",i);} } } Пример 2: Простые числа меньше заданного числа. #include<conio.h> #include<stdio.h> #include<math.h> main() {int a,b,c,d; clrscr(); /* Простые числа меньше с */ printf("Введите c"); gotoxy(25,13); scanf("%d",&c); for(a=1;a<=c;a++) {d=0; for(b=2;b<a;b++) if(a%b==0){d=1;break;} if(d==0)printf("\n %d",a);} getch(); } 1. При выборе места строительства жилого комплекса при металлургическом заводе необходимо учитывать "розу ветров" в данной местности. На основании данных ежедневного определения направления ветра, проводимого в течение года, определить целесообразное взаимное расположение промышленной жилой зоны. 2. Известно, что в Москве самыми теплыми являются дни с 15 июля по 15 августа. Для проведения фестиваля были выбраны 7 следующих подряд дней, наиболее теплых по данным за последние 10 лет. Составить программу для выполнения этой работы на ЭВМ. 3. Составить результирующую таблицу первенства по футболу, в котором участвуют n команд. В качестве исходной информации задан счет: количество забитых (пропущенных) мячей в каждой проведенной игре. Для получения итогового результата необходимо по заданной таблице забитых (пропущенных) мячей составить таблицу очков (выигрыш --- 3, ничья --- 1, проигрыш --- О). Далее определить сумму очков для каждой команды и в соответствии с мим распределить команды по местам. Если сумма очков у двух команд одинакова, то сравниваются разности забитых и пропущенных мячей. 4. Для формирования сборной страны по хоккею предварительно выбрано 30 игроков. На основании протоколов игр (всего 10 игр) составлена таблица, в которой содержится штрафное время каждого игрока по каждой игре (штрафное время может составлять 2, 5 или 10 мин). Составить программу, которая составляет предварительный список кандидатов в сборную и определяет для каждого из них суммарное штрафное время. Игроки, оштрафованные хотя бы один ряз на 10 мин исключены. 5. В задаче 3 определить, в скольких играх разность забитых н пропущенных мячей была большей или равной 3. Какая команда имеет наибольшее количество побед с таким крупным счетом? 6. Составить программу для ведения протокола баскетбольной игры. Во время игры машина ведет учет набранных очков и фолов каждого игрока. Игрок, получивший 5 фолов, удаляется из игры (эта информация должна появляться на экране). В конце игры должна выводиться информация о сумме очков, набранных каждым игроком, в порядке убывания. 7. Составить программу для обработки результатов кросса на 100м для студентов. В кроссе участвует не более 100 студентов. Для каждого участника ввести фамилию, шифр группы, фамилию преподавателя, результат. Получить результирующую таблицу, упорядоченную по результатам, в которой содержится также информация о выполнении нормы ГТО. Определить суммарное количество студентов, выполнивших норму ГТО. 8. Для шифрования используется смешанный алфавит, полу- ченный случайной перестановкой букв исходного алфавита. Например: АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ ШЗУКЛЖЩАЯЭЮФЪДВБПГЧЫЬЕОИМРХНЦСТЙ Для усложнения шифра вместо букв используются целые числа (А соответствует 1, Б - 2 и т. д.), и для кодирования каждой следующей буквы сообщения используют новый смешанный алфавит, полученный из исходного циклической перестановкой букв вправо на заданное число позиций. Число позиций, на которые осуществляется сдвиг, и частота их повторения известны заранее. Пусть, например, это числа 5, 3, 1, 8. Тогда для кодирования первой буквы будет использован алфавит, полученный из исходного циклическим сдвигом на 5 позиций вправо, второй буквы - на 3 позиции, третьей - на 1, четвертой - на 8, пятой - снова на 5 и т. д. Составить программу, которая подготавливает таблицу для шифрования, содержащую четыре необходимых алфавита. Считать, что исходный алфавит задан в числовом виде. 9. Результаты соревнований фигуристов по одному из видов многоборья представлены оценками судей в баллах (от О до 6). По результатам оценок судьи определяется место каждого участника у этого судьи. Места участников определяются далее по сумме мест, которые каждый участник занял у всех судей. Составить программу, определяющую по исходной таблице оценок фамилии и сумму мест участников в порядке занятых ими мест. Число участников не более 15, число судей не более 10. 10. Пластинка размером 30Х50 см^{2} разделена на квадраты размером 2Х2 см^{2}. Произведено измерение температуры каждого квадрата. Используя эту информацию, построить изотермы изменения температуры. 11. Японская радиокомпания провела опрос 250 радиослушателей по вопросу: Какое животное Вы связываете с Японией и японцами?. Составить программу получения пяти наиболее часто встречающихся ответов и их долей (в процентах). 12. Траектории движения двух самолетов заданы уравнениями xi=xi(t), yi=yi(t), zi=zi(t), i=1,2. Определить, в какой момент времени расстояние между самолетами будет минимальным. Рассмотреть интервал времени между двумя заданными моментами. 13. Сформировать из матрицы A(1O,10) матрицу B(10, 10) по следующим правилам: а) элементы матриц А и В принимают только значения О или 1; б) соседями элемента a_{ij} считаются все элементы, расположенные рядом с данным по горизонтали, вертикали или диагонали; в) если сумма S значений соседей элемента меньше двух или больше трех, то b_{ij}=0; г) если сумма S значений соседей элемента a_{ij} равна двум, то b_{ij}=1; д) если сумма 5 значений соседей элемента aij равна трем, то b_{ij}=1; По окончании формирования матрицы В значения элементов построчно вывести на печать. \S8. Практическое программирование(ч.4). 1. Составить программу для обработки результатов соревнований по фигурному катанию, проводившихся по трем видам многоборья (обязательная, короткая и произвольная программы). Обработку результатов по каждому из видов осуществлять в подпрограмме. 2. Японская радиокомпания провела опрос 250 радиослушателей по трем вопросам: 1) Какое животное Вы связываете с Японией и японцами? 2) Какая черта характера присуща японцам больше всего? 3) Какой неодушевленный предмет или понятие Вы связываете с Японией? Большинство опрошенных прислали ответы на все или часть вопросов. Составить программу получения первых пяти наиболее часто встречающихся ответов по каждому вопросу и доли (в процентах) каждого такого ответа. Предусмотреть необходимость сжатия столбца ответов в случае отсутствия ответов на некоторые вопросы. Обработку информации по каждому вопросу осуществлять в подпрограмме. 3. Соревнования по футболу между командами проводятся в два этапа. Для проведения первого этапа участники разбиваются на две группы по 12 команд. Для проведения второго этапа выбирается 6 лучших команд каждой группы по результатам первого этапа. Составить список команд участников второго этапа. Определение результатов соревнования внутри одной группы осуществлять в подпрограмме. Задаваемые исходные данные и правила определения результатов соревнований приведены ранее. 4. В соревнованиях участвуют три команды по 6 человек. Результаты соревнований в виде мест участников каждой команды (1-18) размещены в трех массивах, содержащих по 6 компонент. Определить команду --- победителя, вычислив количество баллов, набранное каждой командой. Участнику, занявшему 1-е место, начисляется 5 баллов, 2-е --- 4, 3-е --- 3, 4-е --- 2, 5-е --- 1, остальным - О баллов. Определение числа баллов, набранных одной командой, осуществлять в подпрограмме. 5. В памяти ЭВМ хранится информация о засеваемых площадях и урожае зерновых по районам для 10 областей (в каждой области не более 10 районов). Определить среднюю урожайность по каждой области и область, добившуюся наибольшей урожайности. Определение средней урожайности одной области выполнять в подпрограмме. 6. Информация о результатах сессии (5 экзаменов) по каждой группе хранится в памяти ЭВМ. Для подведения итогов определить средний балл для пяти групп одного потока студентов и выдать список групп в порядке убывания среднего балла. Определение среднего балла одной группы осуществлять в подпрограмме. 7. Соревнования (лыжные гонки) проводятся двумя группами по 10 человек. Результаты соревнований представлены списками участников и их результатов по каждой группе. Предварительное подведение итогов проводится по каждой группе, результатом его являются списки участников по группам в порядке занятых ими мест. Необходимо получить общий список, в котором участники расположены в порядке, соответствующем показанным результатам. Определение результатов по каждой группе осуществлять в подпрограмме. 8. Написать программу построения латинского квадрата. Латинский квадрат --- это матрица NХN, элементы которой выбраны от 1 до N так, что каждое число встречается только один раз в каждой строке и в каждом столбце. 9. Составить программу для контроля знаний. В программе задается один вопрос, ответ на который включает несколько наимелований (например, "Назовите все элементы Периодической системы, представляющие группу галогенов" или "Назовите все города с населением свыше 1 млн" и т. п.). В памяти ЭВМ хранится список наименований, являющийся полным ответом на вопрос,. Введенный ответ необходимо сравнить с правильным. 10. В памяти ЭВМ хранится список фамилий абонентов в алфавитном порядке и номеров их телефонов. Составить программу, обеспечивающую быстрый поиск фамилии абонента по номеру телефона. 11. В памяти ЭВМ хранятся списки номеров телефонов и фамилий абонентов, упорядоченные по номерам телефонов, для каждого из пяти телефонных узлов города. Один телефонный узел включает несколько АТС (нe более 10). Номера АТС (первые две цифры номера телефона), относящихся к каждому телефонному узлу, также хранятся в памяти ЭВМ. Составить программу, обеспечивающую быстрый поиск фамилии абонента по заданному номеру телефона. СБОРНИК ЗАДАЧ ПО КОМПЬЮТЕРНОМУ ПРОГРАММИРОВАНИЮ
Учебно-методическое пособие
Бодренко Андрей Иванович