Примеры программ к Лабораторной работе N6. "Умножение матриц"

/* array2d.c -- функции для двумерных массивов */
#include <stdio.h>
#define ROWS 3
#define COLS 4

void sum_rows(int ar[][COLS], int rows);
void sum_cols(int [][COLS], int); // можно опустить имена
int sum2d(int (*ar)[COLS], int rows); // другой вид синтаксиса

int main (void)
{
	int junk[ROWS][COLS] = {
			{2, 4, 6, 8},
			{3, 5, 7, 9},
			{12, 10, 8, 6}
			};
	sum_rows(junk, ROWS);
	sum_cols(junk, ROWS);
	printf("Cyммa всех элементов = %d\n", sum2d(junk, ROWS));
	return 0;
}


void sum_rows(int ar[][COLS], int rows)
{
	int r;
	int c;
	int tot;
	for (r = 0; r < rows; r++)
	{
		tot = 0;
		for (c = 0; c < COLS; c++)
			tot += ar[r][c];
		printf("cтpoкa %d: сумма = %d\n", r, tot);
	}
}

void sum_cols(int ar[][COLS], int rows)
{
	int r;
	int c;
	int tot;
	for (c = 0; c < COLS; c++)
	{
		tot = 0;
		for (r = 0; r < rows; r++)
			tot += ar[r][c];
		printf("cтoлбeц %d: сумма = %d\n", c, tot);
	}
}

int sum2d(int ar[][COLS], int rows)
{
	int r;
	int c;
	int tot = 0;
	for (r = 0; r < rows; r++)
	for (c = 0; c < COLS; c++)
		tot += ar[r][c];
	return tot;
}
/* lesser.c -- из двух зол она выбирает меньшую */
#include <stdio.h>

int imin (int, int);

int main (void)
{
	int evil1, evil2;
	printf("Bвeдитe два целых числа (или q для завершения программы):\n");
	while (scanf("%d %d", &evil1, &evil2) == 2)
	{
		printf("Меньшим из двух чисел %d и %d является %d.\n", evil1, evil2, imin(evil1, evil2));
		printf("Bвeдитe два целых числа (или q для завершения программы):\n");
	}
	printf("Пpoгpaммa завершена.\n");
	return 0;
}
int imin(int n, int m)
{
	int min;
	if (n < m)
		min = n;
	else
		min = m;
	return min;
}
/* lethead2.c */
#include <stdio.h>
#include <string.h> /* для функции strlen() */
#define NAME "GIGATНINK, INC."
#define ADDRESS "101 Megabuck Plaza"
#define PLACE "Megapolis, CA 94904"
#define WIDTH 40
#define SPACE ' '

void show_n_char(char ch, int num);

int main (void)
{
	int spaces;

	show_n_char('*', WIDTH); /* использование констант в качестве аргументов */
	putchar ('\n');
	show_n_char(SPACE, 12);  /* использование констант в качестве аргументов */
	printf("%s\n", NAME);
	
	spaces = (WIDTH - strlen(ADDRESS)) / 2; /* Пусть программа вычислит, сколько пробелов пропустить */
	
	show_n_char(SPACE, spaces); /* использование переменной в качестве аргумента */
	printf("%s\n", ADDRESS);
	show_n_char(SPACE, (WIDTH - strlen(PLACE)) / 2); /* выражение в качестве аргумента */
	printf("%s\n", PLACE);
	show_n_char('*', WIDTH);
	putchar('\n');
	return 0;
}

/* определение функции show_n_char() */
void show_n_char(char ch, int num)
{
	int count;
	for (count = 1; count <= num; count++)
		putchar(ch);
}
/* sum_arr2.c - суммирует элементы массива */
#include <stdio.h>
#define SIZE 10

int sump(int * start, int * end);

int main (void)
{
	int marbles[SIZE] = {20, 10, 5, 39, 4, 16, 19, 26, 31, 20};
	long answer;
	answer = sump(marbles, marbles + SIZE);
	printf("Oбщee количество элементов marbles равно %ld.\n", answer);

	return 0;
}
/* использование арифметики указателей */
int sump(int * start, int * end)
{
	int total = 0;
	while (start < end)
	{
		total += *start;
		start++;
	}
	return total;
}
/* sumarr1.c - сумма элементов массива */
/* используйте спецификаторы %u или %lu, если спецификатор %zd не работает */
#include <stdio.h>
#define SIZE 10
int sum(int ar[], int n);

int main(void)
{
	int marbles[SIZE] = {20, 10, 5, 39, 4, 16, 19, 26, 31, 20};
	long answer;
	answer = sum(marbles, SIZE);
	printf("Общая сумма элементов массива marbles равна %ld.\n", answer);
	printf( "Oбъeм памяти, отведенной под массив marbles, составляет %zd байт.\n",	sizeof marbles);

	return 0;
}

int sum(int ar[], int n)	// каков размер массива?
{
	int i;
	int total = 0;
	for(i = 0; i < n; i++)
		total += ar[i];
	
	printf("Paзмep переменной ar составляет %zd байт.\n", sizeof ar);
	return total;
}
/* swap3.c -- использование указателей для обмена значениями переменных */
#include <stdio.h>

void interchange(int * u, int * v );

int main(void)
{
	int x = 5, y = 10;
	printf("Первоначально x = %d и y = %d.\n", x, y);
	interchange(&x, &y);	/* передача адресов в функцию */
	printf("Teпepь x = %d и y = %d.\n", x, y);

	return 0;
}

void interchange(int * u, int * v )
{
	int temp;
	temp = *u; /* переменная temp получает значение, на которое указывает u */
	*u = *v;
	*v = temp;
}
/* zippo1.c - информация о массиве zippo */
#include <stdio.h>

int main (void)
{
	int zippo[4][2] = {{2, 4}, {6, 8}, {1, 3}, {5, 7}};
	printf("   zippo = %p,    zippo + 1 = %p\n", zippo, zippo + 1);
	printf("zippo[0] = %p, zippo[0] + 1 = %p\n", zippo[0], zippo[0] + 1);
	printf("  *zippo = %p,   *zippo + 1 = %p\n", *zippo, *zippo + 1);
	printf("zippo[0][0] = %d\n", zippo[0][0]);
	printf("  *zippo[0] = %d\n", *zippo[0]);
	printf("    **zippo = %d\n", **zippo);
	printf("zippo[2][1] = %d\n", zippo[2][1]);
	printf("*(*(zippo + 2) + 1) = %d\n", *(*(zippo + 2) + 1 ));
	return 0;
}
/* zippo2.c - получение информации о массиве zippo с помощью переменной типа указатель */
#include <stdio.h>

int main (void)
{
	int zippo[4][2] = {{2, 4}, {6, 8}, {1, 3}, {5, 7}};
	int (*pz)[2];
	pz = zippo;
	
	printf("   pz = %p,    pz + 1 = %p\n", pz, pz + 1);
	printf("pz[0] = %p, pz[0] + 1 = %p\n", pz[0], pz[0] + 1);
	printf("  *pz = %p,   *pz + 1 = %p\n", *pz, *pz + 1);
	printf("pz[0][0] = %d\n", pz[0][0]);
	printf("  *pz[0] = %d\n", *pz[0]);
	printf("    **pz = %d\n", **pz);
	printf("pz[2][1] = %d\n", pz[2][1]);
	printf("*(*(pz + 2) + 1) = %d\n", *(*(pz + 2) + 1));
	return 0;
}