Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
metodichka_SI.doc
Скачиваний:
30
Добавлен:
23.02.2015
Размер:
2.05 Mб
Скачать

3 Задача

Вычислить среднее арифметическое 10 элементов одномерного массива.

Дополнительное условие: работа с массивом типа int a[N].

#include <stdio.h>

#defineN10

// функция для ввода чисел массива

void Input(int a[N]);

// функция для вычисления среднего арифметического для заданного массива

float Mean(int a[N]);

intmain()

{

// выделение памяти массивом из 10 символов

int a[10];

// ввод массива

Input (a);

// вывод среднего арифметического

printf("Sr %f numbers",Mean(a));

return 0;

}

void Input (int a[N])

{

puts("Input the numbers\n");

for (int i=0;i<N;i++)

{

printf("Input the %d number",i);

scanf("%d",&a[i]);

}

}

float Mean(int a[N])

{

int sum=0;

puts("Input the numbers\n");

// вычисления суммы элементов

for (int i=0; i<N; i++)

sum+=a[i];

// возвращение среднего арифметического элементов массива

return (float)sum/N;

}

Дополнительное условие: работа с динамическим массивом.

#include <stdio.h>

#include <malloc.h>

// ввод элементов массива

void Input (int *a, int n);

// вычисление среднего арифметического для элементов заданного массива

float Mean(int *a, int n);

// вывод на экран элементов массива

void Print (int *a, int n);

intmain()

{

// указатель на значение целого типа

int* a;

int n;

puts("Input the quantity of elements: ");

// ввод количества элементов массива

scanf("%d",&n);

// выделение памяти под n элементов массива целых чисел

a = (int*)malloc(sizeof(int)* n);

// ввод элементов массива

Input(a,n);

printf("Sr %f numbers\n",Mean(a,n));

// вывод на экран элементов массива

Print(a,n);

// освобождение памяти

free(a);

return 0;

}

void Input (int *a, int n)

{

puts("Input the numbers\n");

for (int i=0;i<n;i++)

{

printf("Input the %d number ",i);

// вводi-го элемента

scanf("%d",a+i);

}

}

float Mean(int *a, int n)

{

int sum=0;

puts("Input the numbers ");

for (int i=0;i<n;sum+=a[i],i++);

// возвращение среднего арифметического для заданного массива

return (float)sum/n;

}

void Print (int *a, int n)

{

puts("Array:");

for (int i=0;i<n;i++)

{

printf("%d , ",*(a+i));

}

}

Самостоятельная работа

  1. Добавить функцию нахождения максимального значения в одномерном массиве.

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

Лабораторная работа №6

Матрицы

Цель: закрепление на практике знаний работы с матрицами. Работа с указателями и двумерными массивами. Связь многомерного массива и указателя. Разбиение проекта на разные файлы, использование заголовочного файла. Работа с русским алфавитом.

Методические рекомендации: лабораторная работа рассчитана на 4 часа и состоит из анализа пяти заданий и выполнения самостоятельной работы.

Обязательное зачетное задание.

Необходимый уровень знаний:

  • понятие указателя;

  • работа с адресной арифметикой;

  • связь между указателями и одномерными массивами.

1 Задача

Дан двумерный массив. Переставить с нем строки следующим образом: первую с последней, вторую - с предпоследней и т.д.

Дополнительное условие: размер матрицы фиксированный.

// заголовочный файл

Matr.h

# include <stdio.h>

// задание количества строк

# defineN3

// задание количества столбцов

# defineM3

// функция печати элементов матрицы

void Print_Matr(int A[N][M]);

// функция ввода элементов матрицы

void Input_Matr(int A[N][M]);

// функция модификации элементов матрицы

void Change(int A[N][M]);

// вспомогательная функция обмена строк

void swap(int A[N][M],int l);

// заголовочный файл

Matr.cpp

# include "matr.h"

int main(void)

{

// объявление матрицы целых чисел размерности mнаn

int A[N][M];

// ввод матрицы целых чисел

Input_Matr(A);

// функция печати элементов матрицы

Print_Matr(A);

// переход на следующую строку

printf("\n");

Change(A);

printf("\n");

Print_Matr(A);

return 0;

}

// заголовочный файл

Matr_fun.cpp

# include <stdio.h>

# include "matr.h"

void Change(int A[N][M])

{

inti;

//цикл работает до тех пор пока не встретит среднюю строку в матрице

for(i=0;i<(int)N/2;i++)

// меняем элементы в матрице А, передавая номер строки

swap(A,i);

}

// вспомогательная функция обмена строк

void swap(int A[N][M],int k)

{

intj;

// одномерный массив целых чисел размерности M

int B[M];

for(j=0;j<M;j++)

// меняем местами элементы матрицы

{

B[j]=A[k][j];

A[k][j]=A[N-1-k][j];

A[N-1-k][j]=B[j];

}

}

// функция ввода статической матрицы размера NнаM

void Input_Matr(int A[N][M])

{

int i,j;

printf("Enter matrix\n");

// цикл по строкам

for(i=0;i<N;i++)

// цикл по столбцам

for(j=0;j<M;j++)

// считываем элементы матрицы

scanf("%d",&A[i][j]);

printf("\n");

}

// функция вывода элементов матрицы на экран

void Print_Matr(int A[N][M])

{

int j,i;

for(i=0;i<N;i++)

{

for(j=0;j<M;j++)

// печать элементов матрицыA[i][j]

printf("%d ",A[i][j]);

printf("\n");

}

}

Хранение элементов двумерной матрицы как одномерный массив. В функции ввода, вывода передаются размеры матрицы.

// заголовочный файл

Matr.h

# include <stdio.h>

# include <malloc.h>

void Print_Matr(int *A,int n, int m);

void Input_Matr(int *A,int n, int m);

void Change(int *A,int n,int m);

void swap(int *A,int k,int m,int n);

Matr.cpp

# include "matr.h"

int main(void)

{

int n,m;

int* A;

printf("enter the size of matrix");

// ввод размеров матрицыmиn

scanf("%d%d",&n,&m);

// выделяем память под элементы матрицы

A=(int*)malloc(sizeof(int)*n*m);

Input_Matr(A,n,m);

Print_Matr(A,n,m);

printf("\n");

Change(A,n,m);

Print_Matr(A,n,m);

printf("\n");

// освобождаем память, выделенную под элементы матрицы

free(A);

return 0;

}

Matr_fun.cpp

# include "matr.h"

# include <stdio.h>

void Change(int *A,int n,int m)

{

int i;

for(i=0;i<(int)n/2;i++)

swap(A,i,m,n);

}

void swap(int *A,int k,int m,int n)

{

int j;

int *B;

// выделяем память под вспомогательный массив

B=(int*)malloc(sizeof(int)*m);

for(j=0;j<m;j++)

{

//*(B+j)-это указатель на началоB+элементj

*(B+j)=*(A+j+k*m);

*(A+j+k*m)=*(A+n*m-m+j-k*m);

*(A+n*m-m+j-k*m)=*(B+j);

}

}

void Input_Matr(int* A,int n,int m)

{

int i;

printf("Enter matrix\n");

for(i=0;i<n*m;i++)

scanf("%d",(A+i));

printf("\n");

}

void Print_Matr(int* A,int n,int m)

{

int i,k=0;

for(i=0;i<n*m;i++)

{

printf("%d ",*(A+i));

if (i==m-1+k)

{

printf("\n");

k=k+m;

}

}

}

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

# include <stdio.h>

# include <malloc.h>

void Print_Matr(int *A,int n, int m);

void Input_Matr(int *A,int n, int m);

void Change(int* A,int n,int m);

void swap(int* A,int k,int m,int n);

int main(void)

{

int n,m;

int*A;

printf("enter the size of matrix");

scanf("%d%d",&n,&m);

// считываем размерности матрицыnиm

A=(int*)malloc(sizeof(int)*n*m);

Input_Matr(A,n,m);

Print_Matr(A,n,m);

printf("\n");

Change(A,n,m);

Print_Matr(A,n,m);

free(A);

printf("\n");

return 0;

}

void Change(int* A,int n,int m)

{

int i;

for(i=0;i<(int)n/2;i++)

swap(A,i,m,n);

}

void swap(int *A,int k,int m,int n)

{

int j;

int *B;

B=(int*)malloc(sizeof(int)*m);

for(j=0;j<m;j++)

{

B[j]=A[k][j];

A[k][j]=A[n-1-k][j];

A[n-1-k][j]=B[j];

}

}

void Input_Matr(int* A,int n,int m)

{

int i,j;

printf("Enter matrix\n");

for(i=0;i<n;i++)

for(j=0;j<m;j++)

scanf("%d",(A+j*m+i));

printf("\n");

}

void Print_Matr(int* A,int n,int m)

{

int i,j;

for(i=0;i<n;i++)

{

for(j=0;j<m;j++)

printf("%d ",*(A+j*m+i));

printf("\n");

}

}

Известно количество строк, но неизвестно количество элементов в каждой строке. Добавлена функция работы с русским алфавитом. Количество элементов в строке задает пользователь. Выделение и освобождение памяти выделено в отдельные функции. Ограничение – в каждой строке количество элементов одинаково. В функции ввода, вывода передается количество элементов в строке.

#include <stdio.h>

#include <windows.h>

#include <malloc.h>

// задание количества строк

#defineN4

// функция ввода элементов матрицы

void InputArr(int *arr[], int m);

// вывод элементов матрицы на экран

void OutputArr(int *arr[], int m);

// функция модификации матрицы

voidChange(int*arr[],intm);

// вспомогательная функция обмена

void swap(int *arr[],int k,int m);

// функция, для работы с русским алфавитом

char* Rus(const char* text);

// функция освобождения памяти

void Despose (int *arr[], int m);

int main()

{

intm;

printf(Rus("Введите количество элементов в строке :\n"));

scanf("%d",&m);

int *arr[N];

InputArr(arr,m);

OutputArr(arr,m);

printf("\n");

Change(arr,m);

OutputArr(arr,m);

Despose (arr,m);

return 0;

}

void Despose (int *arr[], int m)

{

for(int i=0;i<m;i++)

// освобождаем память под элементы в каждой строке

free(arr[i]);

}

// функция, которая позволяет работать с русским алфавитом

char bufRus[256];

char* Rus(const char* text)

{

// загоняем текст переменной textвbufRusи преобразовываем в символы ЕОМ

CharToOem(text,bufRus);

return bufRus;

}

void InputArr(int *arr[], int m)

{

printf(Rus("Вывод элементов матрицы: \n"));

for(int i=0;i<N;i++)

{

// выделяем память под массив

arr[i]=(int*)malloc(m*sizeof(int));

for(int j=0;j<m;j++)

{

scanf("%d",arr[i]+j);

}

}

}

void OutputArr(int *arr[], int m)

{

for(int i=0;i<N;i++)

{

for(int j=0;j<m;j++)

printf("%d\t",*(arr[i]+j));

printf("\n");

}

}

void Change(int *arr[],int m)

{

int i;

for(i=0;i<(int)N/2;i++)

swap(arr,i,m);

}

void swap(int *arr[],int k,int m)

{

int j;

int *B;

B=(int*)malloc(sizeof(int)*m);

for(j=0;j<m;j++)

{

*(B+j)=*(arr[k]+j);

*(arr[k]+j)=*(arr[N-1-k]+j);

*(arr[N-1-k]+j)=*(B+j);

}

}

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

#include <stdio.h>

#include <windows.h>

#include <malloc.h>

void InputArr(int **arr, int row, int col);

void OutputArr(int **arr, int row, int col);

void swap(int **arr,int k,int row,int col);

void Change(int **arr,int row,int col);

char* Rus(const char* text);

void Dispose(int **arr, int col);

int main()

{ int row, col;

printf("Stroka");

// введитечисло строк

scanf("%d",&row);

printf("Stolbec");

// введите количество элементов в строке

scanf("%d",&col);

// выделение памяти под массив указателей на строки

int **arr=(int**)malloc(row*sizeof(int*));

InputArr(arr,row,col);

OutputArr(arr,row,col);

printf("\n");

Change(arr,row,col);

OutputArr(arr,row,col);

Dispose(arr,col);

free(arr);

return 0;

}

char bufRus[256];

char* Rus(const char* text)

{

CharToOem(text,bufRus);

return bufRus;

}

void InputArr(int **arr, int row, int col)

{

printf(Rus("Введите элементы матрицы: \n"));

for(int i=0;i<row;i++)

{

*(arr+i)=(int*)malloc(col*sizeof(int));

for(int j=0;j<col;j++)

{

scanf("%d",&arr[i][j]);

}

}

}

void OutputArr(int **arr, int row, int col)

{

printf(Rus("Вывод матрицы:\n"));

for(int i=0;i<row;i++)

{

for(int j=0;j<col;j++)

printf("%d\t",*(*(arr+i)+j));

printf("\n");

}

}

void Change(int **arr,int row,int col)

{

int i;

for(i=0;i<(int)row/2;i++)

swap(arr,i,row,col);

}

void swap(int **arr,int k,int row,int col)

{ int j;

int *B;

B=(int*)malloc(sizeof(int)*row);

for(j=0;j<col;j++)

{

*(B+j)=*(arr[k]+j);

*(arr[k]+j)=*(arr[row-1-k]+j);

*(arr[row-1-k]+j)=*(B+j);

}

}

void Dispose(int **arr,int col)

{

for(int j=0;j<col;j++)

free(*(arr+j));

}

Самостоятельная работа

Изменить задания , так, чтобы количество элементов в строках было различно.

Лабораторная работа №7

Строки

Цель: применение на практике знаний работы с массивами символов и строкой. Работа с библиотекой string.h.

Методические рекомендации: лабораторная работа рассчитана на 4 часа и состоит из анализа трех задания и выполнения самостоятельной работы. В заданиях продемонстрирована работа с символом строк и со строкой.

Обязательное зачетное задание.

Необходимый уровень знаний:

  • работа с массивами;

  • работа с указателями;

  • работа с функциями.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]