Программирование на языке СИ. контр на СИ. Лабораторная работа по дисциплине Программирование на языке си Выполнил специальность 230105 Содержание. Введение Постановка задач
Скачать 243.86 Kb.
|
институт гуманитарных и инженерных технологий» Кафедра «Программное обеспечение и защита информации» Лабораторная работа по дисциплине: «Программирование на языке СИ» Выполнил специальность 230105 Содержание. Введение Постановка задач Результат программы до работы Результат программы после работы Заключение Литература Введение С++ - язык общего назначения и задуман для того, чтобы настоящие программисты получили удовольствие от самого процесса программирования. За исключением второстепенных деталей он содержит язык С как подмножество. Язык С расширяется введением гибких и эффективных средств, предназначенных для построения новых типов. Программист структурирует свою задачу, определив новые типы, которые точно соответствуют понятиям предметной области задачи. Такой метод построения программы обычно называют абстракцией данных. Информация о типах содержится в некоторых объектах типов, определенных пользователем. С такими объектами можно работать надежно и просто даже в тех случаях, когда их тип нельзя установить на стадии трансляции. Программирование с использованием таких объектов обычно называют объектно-ориентированным. Если этот метод применяется правильно, то программы становятся короче и понятнее, а сопровождение их упрощается. Массивы в программах C++ могут быть не только линейными. Довольно частым является использование двух - (и более) -мерных структур. К примеру, прямоугольная матрица – типичная структура, представимая с помощью двумерного массива; а 3D-тензор может быть записан как соответствующий трехмерный массив. Многомерный массив в C++ организован по принципу «массива массивов». Общий формат его объявления тип имя[N1][N2]…[NM]; Здесь M – число индексов (или размерность) массива. Индексы изменяются в пределах от 0 до N1 – 1, от 0 до N2 – 1, от 0 до N3 – 1, ..., от 0 до NM – 1, соответственно. К примеру, запись int G[5][4]; означает объявление двумерного массива целых чисел с именем G и размерами 54. На рис. справа такой массив представлен в виде таблицы. Здесь первый индекс является номером строки, второй – номером столбца таблицы, с диапазонами изменения от 0 до 4, и от 0 до 3, соответственно. Доступ к элементам многомерного массива в программе производится так же, как и в одномерном случае, то есть путем указания имени массива и набора индексов в квадратных скобках. Например, операция присваивания значения 0 последнему элементу будет записана как G[4][3] = 0. При работе с многомерными массивами удобно использовать вложенные циклы for. С их помощью можно выполнить заданное действие с каждым из элементов массива путем перебора всех значений индексов. Приведенный ниже фрагмент программного кода выводит на экран все элементы массива G. for(int i=0; i<5; i++) // цикл по строкам i { for(int j=0; j<4; j++) // цикл по строкам j cout << G[i][j] << “\t”; // выводим G[i][j] cout << endl; // перевод на новую строку } Здесь внешний цикл по I последовательно пробегает все значения от 0 до 5. При каждом i запускается внутренний цикл по j от 0 до 4. В теле этого цикла на экран выводятся значение элемента G[i][j] и знак табуляции (горизонтальный отступ). Внутренний цикл продолжается до тех пор, пока не будут перебраны все значения j, то есть не будет выведена вся i-я строка. По завершении внутреннего цикла, экранный курсор перемещается на новую строку манипулятором endl, и далее внешний цикл продолжает свою работу, последовательно выводя на экран другие строки массива. Например: имеется вещественная квадратная матрица размером 44. Напишите программу, вычисляющую произведение элементов в каждой ее строке. Матрица вводится с клавиатуры. Решение. Условимся использовать для хранения матрицы массив float X[4][4]. Расчет произведения реализуем согласно следующему алгоритму. Введем вспомогательную переменную (к примеру, float P). Заметим, что в i-й строке расположены элементы X[i][j], где j меняется от 0 до 3, включительно. Организуем цикл по j, внутри которого будем домножать P на X[i][j]. Тогда на выходе из цикла P будет содержать искомое произведение. Выведем его на экран и продолжим расчеты для следующей строки. Для правильной работы алгоритма перед началом расчетов в каждой строке матрицы необходимо присвоить P значение 1. #pragma hdrstop #include #include #pragma argsused int main(int argc, char* argv[]) { float X[4][4]; // объявляем массив 44 for(int i=0; i<4; i++) for(int j=0; j<4; j++) { cout << "input X[" << i << "," << j << "] = "; cin >> X[i][j]; // вводим элементы матрицы } cout << "\n Results:\n"; for(int i=0; i<4; i++) // цикл по строкам { float P = 1.0; // вспомогательная переменная for(int j=0; j<4; j++) // цикл по элементам в строке P = P * X[i][j]; // домножаем P на X[i][j] cout << "\n proizvedenie " << i << "-i stroki = " << P; // выводим результат на экран } getch(); return 0; } Научилась набирать и откомпилировть код этой программы в Turbo C++. Цель: Организовать обработку массивов с использованием функций, научиться передавать массивы как параметры функций. Задача: Используя функции, решить указанную задачу. Массив должен передаваться в функцию как параметр: Написать функцию для вычисления суммы элементов квадратной матрицы, которые расположены ниже главной диагонали. С ее помощью найти максимальное значение такой суммы в n матрицах. Текст программы: #include #include #include #include #define SIZE 5 static int a[SIZE][SIZE]; void CreateArray(int a[SIZE][SIZE]){ int i,j; for(i=0;i for(j=0;j a[i][j]=rand()%100;}}} void PrintArray(int a[SIZE][SIZE]){ int i,j; for(i=0;i for(j=0;j printf("%d ",a[i][j]);} printf("\n");}} int MatrixSum1(int m[SIZE][SIZE]){ int i,j,s=0; for(i=1;i for(j=0;j s+=m[i][j];}} return s;} int main(int argc, char *argv[]){ int s=0,i,t,N; N=atoi(argv[1]); //количество матриц N вводится в параметре командной строки srand(time(NULL)); for(i=1;i<=N;i++){ CreateArray(a); PrintArray(a); t=MatrixSum1(a); printf("\nSumm:%d\n ",t); if(t>s){s=t;}} printf("\nMaximum %d\n",s); system("PAUSE"); return EXIT_SUCCESS;} Результат выполнения программы (N=3): 0 72 91 65 7 59 23 13 17 77 55 16 74 40 85 18 56 19 89 63 20 87 49 89 35 Summ:468 30 92 77 90 68 40 72 79 7 91 16 46 34 78 0 9 7 57 33 60 5 31 2 71 84 Summ:284 47 22 56 36 57 19 27 1 5 75 25 67 52 35 73 90 0 34 9 78 99 27 48 33 59 Summ:442 Maximum 468 Результат программы до работы Результат программы после работы Задача2: ввод символьных массивов. Ввести строку (массив), состоящую не более чем из 80 символов. Воспользоваться двумя способами ввода и вывода информации . #include #include #include // Ввод строки с клавиатуры main() { char str[80]; /* Место для строки */ char str0[80]; // Очистить экран textbackground(5); textcolor(15); clrscr(); CharToOem("Введите строку длиной не более 80 символов \n", str0); printf(str0); gets(str); /* Читает строку с клавиатуры */ CharToOem("Вы ввели строку: %s \n", str0); printf(str0, str); CharToOem("Введите еще одну строку длиной не более 80 символов \n", str0); printf(str0); scanf("%s", str); /* Читает строку с клавиатуры пока не встретится пробел */ CharToOem("Вы ввели строку \n", str0); printf(str0); puts(str); getch(); } Вы видите, что вначале оператором gets(str) введена строка: "Краснодар - город ярких цветов и красивых девушек" до нажатия клавиши Enter. Чуть ниже она выдана на экран оператором printf(): CharToOem("Вы ввели строку: %s \n", str0); printf(str0, str); Далее программа ввела еще одну строку: "Краснодарский край". Для этого был использован оператор scanf(): scanf("%s", str); /* Читает строку с клавиатуры пока не встретится пробел */ Но в последнем случае строка ввелась до первого пробела, то есть слово "Краснодарский" благополучно вошло в комапьтер. Однако, выполнился ввод только одного слова, так как между словами был пробел. Дополнительно практиковалась и решала задачу с четными и нечетными числами # include #include #include int s,i,m,buf,k,j; /*описание переменных*/ const int n=5; /*объявление целочисленной константы с именем n и значением 5*/ typedef int TArray[17]; void outspisok (TArray x) { for (int i=1; i<17; i++) { printf("%d",x[i]); /*вывод данных-вызов функции*/ d –десятичное число } } void main() { randomize(); clrscr(); TArray S; TArray N; TArray M; for (i=1;i<=n;i++) // цикл по строкам i { M[i]=random(10); printf("%d\n",M[i]); } s=1; for (i=1;i<=17;i++) { N[i]=s; s=s*2; } for (j=1;j<=n;j++) // цикл по строкам j { for (i=1;i<=17;i++) { S[i]=M[j]%2; M[j]=M[j]/2; } outspisok (S); if (S[1]==1) printf(" nechetnoe"); buf=S[1]; S[1]=S[17]; S[17]=buf; k=0; for (i=1;i<=17;i++) { k=k+S[i]*N[i]; } // if (S[1]==0) printf("nechetnoe %d"); //else printf("chetnoe %d"); printf("\n"); outspisok (S); if (S[1]==0) printf(" chetnoe"); printf("\n"); printf("%d\n",k); } getch(); } Результат программы после работы Заключение Выполнение задач было не из легких, так как личной практики на с++ у меня было мало, но в дальнейшем я пополню свои знания по изучению си, практикуясь в свободное время. Литература Шилдт, Герберт. Полный справочник по С, 4-е издание. : Пер. с англ. - М,: Издательский дом "Вильямс", 2002. - 704 с. : ил. - Парал.т ит. англ. Павловская Т.А. С/C++. Программирование на языке высокого уровня. / Т.А. Павловская. - СПб.: Питер, 2002. - 464 с.: ил. Культин Н.Б. C/C++ в задачах и примерах. - СПб.:БХВ-Петербург, 2001. - 288 с.: ил. Березин Б.И., Березин С.Б. Начальный курс С и С++. - М,: ДИАЛОГ_МИФИ, 1996. - 288 с. Дэвис Стефан Р. С++ для "чайников", 4-е издание.: Перев. с англ.: Уч. пос. - М.: Издательский дом "Вильямс", 2001. - 336 с.: ил. Джонс Р., Стюарт Я. Программируем на Си/Пер. с англ. и предисл. М.Л. Сальникова, Ю.В. Сальниковой. - М.: Компьютер, ЮНИТИ, 1994. - 236 с.: ил. |