Шафеева практика С. Практикум по программированию на языке с методические указания к лабораторным работам Омск 2008 2
Скачать 1.01 Mb.
|
int vvod(int d[]) { int i, k; printf("Vvedite chislo elementov "); scanf("%d",&k); printf("Vvedite massiv is %d elementov \n", k); for ( i=0; i float sr(int k, int f[], double *g) { int i; Рис.11 ka = vvod(a) Вывод sr(ka,a,&ga) kb = vvod(b) Вывод sr(kb,b,&gb ) kc = vvod(c) Вывод sr(kc,c,&gc) Ввод k i=1,k Ввод d i а) б) в) Начало Конец Конец п\п VVOD (d[]) return k s=0, p=1 i=1,k s = s + f i, ; p = p* f i return s/k Конец п\п sr (k, f[ ],*g) *g = k g 34 long int s, p ; s = 0; p = 1; for ( i = 0; i // s = s + f[i]; p *= f[i]; // p = p * f[i]; } *g = pow((double)p, 1.0/k); return ((float)s)/k; } void main () { int ka, kb, kc; double ga, gb, gc; int a[5], b[5], c[5]; clrscr(); ka=vvod(a); printf("srA = %5.2f \t ", sr(ka,a,&ga)); printf(" srGA = %5.2f \n", ga); kb=vvod(b); printf("srA = %5.2f \t ",sr(kb,b, &gb)); printf("srGB = %5.2f \n", gb); kc=vvod(c); printf("srA = %5.2f \t ",sr(kc,c, &gc)); printf("srGC = %5.2f \n", gc); getch(); } Задание 1 (программа 9_1) Написать и отладить программу для задачи из лабораторной работы 7 с выделением алгоритма обработки или формирования массива. Организо- вать вызов процедуры с параметрами-массивами для двух наборов исход- ных данных. (Для ускорения отладки массив можно задать константой). Задание 2 (программа 9_2) 1. Даны массивы A [1..6], B [1..6], C [1..6], вычислить суммы положи- тельных и отрицательных элементов. Получить А*B, B*С, А*C. Вычисле- ние произведения массивов оформить подпрограммой. 2. Даны массивы A [1..5], B [1..6]. Получить новые массивы путем сдвига элементов в массивах на два разряда вправо, освободившиеся сле- ва элементы обнулить. Сдвиг элементов в массиве оформить подпрограм- мой, из подпрограммы вернуть выпавшие справа разряды. 3. Даны два одномерных массива А [1..6] и C [1..6]. Получить A 2 , С 2 , А*С. Подсчитать число четных и число нечетных чисел в полученных массивах. Перемножение массивов и подсчет выполнить в подпрограмме. 35 4. Даны матрицы целых чисел S[1..3,0..2], K[1..3,0..2], в которых име- ется по два одинаковых числа. Найти и напечатать их значения и индексы. 5. Вычислить значение функции Z = x1+e x2 , где x1, x2 - корни уравне- ния A i x 2 +B i x+C i = 0, где i = 1,2,..,N. Коэффициенты уравнения заданы в массивах A [1..N], B [1..n], C [1..N]. Для вычисления корней использовать подпрограмму. 6. Составить подпрограмму для переменных двух квадратных матриц, с помощью которой вычислить вторую, третью и четвертую степени мат- рицы M [1..5,1..5]. Для каждой матрицы вычислить сумму и среднее ариф- метическое значение элементов. 7. Даны массивы A [1..6], B [1..6], C [1..6]. Преобразовать их, каждому элемен-ту массива, присваивая значение, соседнего с ним справа. Послед- нему элементу присвоить значение первого. Напечатать исходные, резуль- тирующие массивы и отдельно последние два элемента результирующего. 8. По заданным вещественным массивам A[1..6], B[1..6] и С[1..6] вы- числить (minA i )/maxA i + (maxC i )/min(C i ) + max(B+C) I / min(B+C) i 9. Даны массивы A [1..6], B[1..8]. Выбрать из них положительные эле- менты и записать соответственно в массивы A [1..k] и B [1..k], где k<6, n<8; из отрицательных элементов сформировать массивы A2 [1..6-k],B2 [1..8-n]. Напечатать суммы и произведения элементов для каждого. 10. Даны массивы A [1..6], B [1..6], C [1..6]. Переставить элементы в них таким образом, чтобы слева подряд были записаны отрицательные, а справа положительные, подсчитать количество положительных и число отрицательных в каждом массиве. 11. Даны две целые квадратные матрицы четного порядка. Элементы массивов с четными номерами строки и столбца заменить нулем (стереть). Напечатать исходные и полученные массивы, количество четных и число нечетных чисел в каждом. 12. Даны одномерные массивы A[1..6], B[1..8], C[1..10]. Записать их в виде матриц AA [1..3,1..2], BB [1..2,2..4], CC [1..5,1..2], найти наименьшие элементы в каждой и напечатать их номера. 13. Даны две целые квадратные матрицы шестого порядка. Распеча- тать элементы главных диагоналей каждой из них и вычислить суммы элементов отдельно главной и побочной диагоналей. 14. По заданным 10 элементам вещественных массивам A, B и С вы- числить i i B min A min при ) i min(c i c) max(b i minB i minA при i c) ))/min(b i (max(c ) i ))/max(a i (b (max z 15. Даны матрицы целых чисел V (-1..2,0..3), W [1..3,0..2]. Сформиро- вать из них одномерные массивы VV и WW, записывая элементы построч- но. Напечатать индексы исходных мартиц для максимальных значений. 36 16. Дана матрица чисел H [1..5,1..6]. Переставить элементы в строкам матрицы таким образом, чтобы они были расположены в порядке возрас- тания их модулей. Подсчитать сколько в исходных матрицах положитель- ных и отрицательных чисел. 17. Дана матрица чисел G [1..2,1..6]. Переставить элементы в матрице так, чтобы элементы каждого столбца матрицы были смещены циклически вправо. Перестановку элементов в столбце реализовать подпрограммой, напечатать два «выпавших» элемента. 18. Даны массивы A [1..6], B [1..6], C [1..6]. Упорядочить элементы в них в порядке убывания их модулей, напечатать наименьшее и наиболь- шее значения. 19. Даны две матрицы целых чисел V [1..2,1..3], W [1..2,1..3]. Найти общие суммы элементов строк, из функции вернуть две суммы. 20. Даны две целые квадратные матрицы шестого порядка. Вычислить суммы элементов выше главной диагонали и ниже нее. Определить, можно ли отражением относительно главной диагонали преобразовать одну в другую. Лабораторная работа 10 Обработка символьных и строковых данных Символьный тип (char) – это тип данных, используемый для описания отдельных символов (знаков, букв, кодов) [1,6,7] . Основные функции преобразования символов Строка – это массив символов. В языке С строка представляет собой массив элементов типа char, завершающийся признаком конца строки „\0‟. Основные функции для работы со строками ( unsigned strlen(const char *str); (Определяет длину строки str.) char *strcpy(char *sp, const char *si); (Копирует строку si в строку sp.) char * strncpy(char *sp, const char *si, int kol); (Копирует первые kol сим- волов строки si в строку sp). int strcmp (const char *str1, const char *str2); (Сравнивает строки str1иstr2.) int strncmp(const char *str1, const char *str2, int kol); (Сравнивает строку str1 с kol символами str2.) char *strcat (char *const char *si);(Объединяет строки (конкатенация).) char * strncat(char *sp, const char *si, int kol); (Приписывает kol символов строки si к строке sp ) char * strstr (const char *str1, const char *str2); (Ищет в строке str1 под- строку str2. ) char *strchr (const char *str, int c); (Ищет в строке str первое вхождение символа с.) 37 char * strrchr (const char *str, int c); (Ищет в str последнее вхождение „с‟) int strpbrk (const char *str1, const char *str2); (Ищет в строке str1 первое появление любого из строки str2.) В приложении Е сведены функции для работы со строками [7] из библиотек Пример: Ввести строку st1.Сформировать строку st2 перестанов- кой символов исходной строки в обратном порядке и заменой всех строч- ных латинских букв прописными. #include #include #include #include void main() { int i, j; char st1[255], st2[255]; clrscr(); printf("Введите строки \n"); gets (st1); // ввод строки printf ("исходная строка : %s\n",st1); j = strlen(st1)-1; //максимальный индекс элемента в строке for ( i=0; i // изменить регистр j -= j; // j = j-1 } st2[i] = '\0'; // символ конца строки printf("новая строка %s ",st2) ; printf ("\n"); // перевод строки getch(); } Задание 1 (программа 10_1) 1. Дана строка из 20 символов. Вывести из нее на печать только строчные буквы латинского алфавита. 2. Вывести на печать все строчные, а затем все прописные буквы рус- ского и латинского алфавитов. 3. В заданной строке подсчитать частоту появления букв «a», «b». 4. Дан текст из 60 литер. Напечатать только строчные русские буквы, входящие в этот текст. 5. Дана последовательность символов, содержащая символ «я». Опре- делить порядковый номер символа «я» в последовательности. 38 6. Дана последовательность символов. Определить в ней символ, ко- торый по алфавиту предшествует другим. 7. Напечатать в алфавитном порядке все различные строчные буквы, входящие в заданный текст из 100 литер. 8. Определить, является ли заданная последовательность символов в строке симметричной: читается одинаково слева направо и справа налево. 9. Напечатать текст, образованный символами с порядковыми номе- рами 56, 89, 84 и 69 и текст с изменением регистра. 10. Даны две строки с1 и с2, содержащие до 5 цифр каждая. Преобра- зовать их к данным целого типа, используя процедуру VAL, вычислить арифметическое выражение с3 = (с1-с2)/(с1+с2). 11. Вычислить суммы кодов всех букв, входящих в слова SUM и ALFA. Сравнить слова и определить, какое из них больше. 12. Напечатать заданный текст с удалением из него всех букв b, непо- средственно перед которыми находится буква с. 13. Имеется символьная переменная d, присвоить логической пере- менной T значение true, если значение d-цифра, и значение false в против- ном случае. 14. Если в заданный тексте входит каждая из букв слова key, тогда напечатать «yes» , иначе – «no». 15. Написать программу, которая предварительно запрашивает ваше имя, а затем приветствует вас по имени. 16. Ввести вещественное число, преобразовать его в строку. Подсчи- тать количество разрядов в целой и дробной частях. Найти представление числа в виде мантиссы (по модулю меньшее единицы) и порядка. 17. Ввести строку, состоящую из нулей, единиц и десятичной точки. Преобразовать ее в десятичное число. Задание 2 (программа 10_2) 1. Дана строка, содержащая не более двадцати латинских букв. Все вхождение «max» в ней заменить на «min» и «макс» на «мин». Подсчи- тать число таких замен. 2. Дана строка, содержащая сорок латинских букв. Подсчитать все вхождение «abc» в строку и их удалить. Вывести на экран два варианта полученных строк, заполняя образовавшую «дыру» последующими буква- ми с добавлением в конце пробелов, и, оставляя на месте удаленных сим- волов пробелы. 3. Определить сколько различных символов входит в заданный текст, содержащий не более 100 литер и оканчивающийся точкой. 4. Определить номера позиций гласных букв в заданном тексте. 5. Напечатать заданный текст из 60 символов, удалив из него повтор- ные вхождения каждой литеры. 39 6. Дана строка, состоящая из слов, разделенных пробелами, в конце строки – точ- ка. Определить, сколько в строке слов, содержащих четное число символов. 7. Дан набор слов на английском языке, разделенных пробелами, в конце точка. Выделить в последовательности нечетные слова прописными буквами. 8. Дан непустой текст из строчных букв, за которыми следует точка. Определить упорядочены ли эти буквы по алфавиты. Напечатать результат проверки и исходный текст прописными буквами. 9. Дана последовательность от двух до восьми слов, в каждом из кото- рых от одной до десяти строчных букв; между соседними словами – не менее одного пробела, за последним словом – точка. Напечатать слово с максимальной длиной. 10. Дано несколько слов, в каждом из которых от одной до семи строчных букв, между соседними словами – не менее одного пробела, за последним словом – точка. Напечатать эти слова в алфавитном порядке. 11. Дана последовательность, содержащая от одного до восьми слов, в каждом из которых от одной до пяти строчных букв; между соседними словами – запятая, за последним словом – точка. Напечатать эту же после- довательность, удалив из нее повторные вхождения слов. 12. В заданном тексте (слова разделены пробелами) поменять местами первое и последнее слово. 13. Даны числа K и текст из слов, разделенных пробелами, в конце – точка. Определить количество слов в тексте, состоящих из K букв. 14. Дана последовательность, содержащая от двух до десяти слов, в каждом из которых от одной до восьми строчных букв; между соседними словами – не менее одного пробела, за последним словом – точка. Напеча- тать те слова, в которых буквы слова упорядочены по алфавиту. 15. Дана последовательность, содержащая от двух до десяти слов, в каждом из которых от одной до пяти строчных букв; между соседними словами – запятая, за последним словом – точка. Напечатать эту же после- довательность слов, но в обратном порядке. 16. В заданный текст входят только цифры и буквы. Определить, яв- ляется ли текст десятичной, шестнадцатеричной или двоичной записью целого либо вещественного числа (указать при выводе какого). 17. В заданном тексте найти и, если есть, напечатать все слова-палиндромы (сло- ва, которые одинаково читаются слева направо и справа налево). 18. Дан текст из слов, разделенных пробелами, в конце - точка. Найти слово наименьшей длины (содержащее наименьшей количество букв). 19. Разработать программу шифровки – дешифровки текста путем заме- ны каждой буквы текста другой, с кодом на N больше (меньше) исходной. 20. Дана непустая последовательность слов, в каждом на которых от одной до шести букв; между соседними словами – запятая, за последним – 40 точка. Напечатать те слова, у которых одинаковые «соседи». (Определить процедуру, которая вводит очередное слово и присваивает его шестили- терной строке, а запятую или точку присваивает некоторой глобальной пе- ременной). Лабораторная работа 11 Файлы Цель работы: создание, чтение и обработка файлов из программы. Под файлом обычно подразумевается именованная область памяти на внешнем носителе. Стандартная библиотека содержит три класса для ра- боты с файлами: Прежде чем читать информацию из файла или записывать в него, нужно его открыть. В библиотеке FILE *fopen(char *fname, char *mode); где *fname – имя файла, *mode – режим [1, 5, 6, 10]. Функция возвращает указатель (ссылку) на файл, который должен быть предвари- тельно описан. Пример. Объявим указатели на переменные файлового типа FILE *uin, *uout; // (указатели на переменные файлового типа) uin = fopen(“name1”, “r”); // открыть файл “name1” для чтения и далее идентифицировать как uin uout = fopen(”name2”, “w”); // открывается для записи и связывается с идентификатором uout. Если производиться открытие несуществующего файла, то он созда- ется. Для открытия файла с именем test рекомендуется метод, который по- зволяет определить ошибку при открытии файла [8,10]. # include // работа с файлами и константа NULL (FILEOPEN.C) # include //для функции exit() void main() { FILE *fp; // fp – файловая переменная if (( fp = fopen("test", "w"))==NULL) { puts("Не могу открыть файл\n"); // печать строки exit(1); } puts("Файл открыт\n"); } 41 После окончания работы с файлом необходимо его закрыть функци- ей int fclose(FILE *fp) , которая возвращает нуль, если операция выполне- на успешно, и иное значение в противном случае. Функция является реко- мендуемой, поскольку файлы при нормальном завершении закрываются автоматически. Пример. Вычислить суммы элементов в столбцах двумерного числово- го массива А[1..2,1..4], заданного в файле FILE1.dat. Полученные значения поместить в файл FILE2.dat. Для решения задачи разработана СА (рис.12) Программа: #include #include void main() { int a[2][4]; // объявление переменных int s[4]; int i, j; FILE * f1,* f2; // объявление файловых переменных clrscr(); // очистка экрана f1 = fopen("FILE1.dat", "r"); // открыть файл file1.dat для чтения for(i=0; i<2; ++i) for ( j=0; j<4; ++j ) Начало Объявление ф.п. f1,f2 Открыть f1 i=1,2 j=1,4 Ввод a ij из файла f1 Закрыть f1, Открыть f2 j=1,4 S j =0 i=1,2 S j =S j +a ij Вывод S j в файл f2 Закрыть f2 Конец Рис.12 42 fscanf(f1, "%d", &a[i][j]); // чтение из файла, связанного с f1 fclose(f1); // закрыть файл, связанный с f1 f2 = fopen("FILE2.dat","w"); // открыть файл для записи fprintf(f2, "1 2 3 4 – столбцы \n"); fprintf(f2, "суммы по столбцам \n"); for ( j=0; j<4; ++j ) { s[j] = 0; for (i=0; i<2; ++i) s[j] = s[j] + a[i][j]; fprintf(f2, "%d", s[j]); } // на экран ничего не выводится // результат действий программы в file2.dat } Задание 1 (программа 11_1) Выполнить задачу из лабораторной работы 9, считывая исходные данные из одного файла и записывая полученные результаты в другой текстовый файл. Файл с исходными данными должен быть подготовлен предварительно. |