Консультация № 169492
16.06.2009, 23:32
0.00 руб.
0 2 1
1. Написать функцию нахождения наибольшего общего делителя двух числе.
2.Дана целочисленная прямоугольная матрица.Найти сумму элементов в тех столбцах,которые содержат хотя бы один положительный элемент

Обсуждение

Неизвестный
17.06.2009, 13:23
общий
Бинарный алгоритм нахождения НОД - алгоритм и его реализация на языке c++.
Неизвестный
17.06.2009, 14:16
общий
это ответ
Здравствуйте, xxBrizonxx.

Решения в приложении

Приложение:
1.
typedef unsigned int uint;

uint NOD (uint x, uint y) {
uint a, b;

if (x < y) {
a = y;
b = x;
}
else {
a = x;
b = y;
}

while (b > 0) {
uint r = a % b;
a = b;
b = r;
}

return a;
}

-----
2.
// Дана целочисленная прямоугольная матрица.
// Найти сумму элементов в тех столбцах,
// которые содержат хотя бы один положительный элемент

#include <stdio.h>
#include <stdlib.h>
#include <alloc.h>

// функция выделения памяти для матрицы
// параметры:
// n - кол-во строк
// m - кол-во столбцов
// результат:
// указатель на выделенную область
int ** allocateMatrix (int n, int m) {
int ** p;

if ((p = (int **)malloc (m * sizeof (int *))) == NULL) {
printf ("\n\nНе могу выделить область памяти!\n");
exit (-1);
}

for (int i = 0; i < m; i++)
if ((p [i] = (int *)malloc (n * sizeof (int))) == NULL) {
printf ("\n\nНе могу выделить область памяти!\n");
exit (-1);
}

return p;
}

// функция сохранения матрицы в файл
// параметры:
// a - матрица
// n - кол-во строк
// m - кол-во столбцов
// fname - имя файла
void SaveMatrix (int **a, int n, int m, char *fname) {
FILE *f;
char c;

if ((f = fopen (fname, "w")) == NULL) {
printf ("\n\nНевозможно создать указанный файл!\n");
printf ("Продолжить без сохранения (Y/N)? ");
scanf (&c);

if (c == 'N' || c == 'n') exit (-1); else return;
}

fprintf (f, "%d %d\n", n, m);

for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
fprintf (f, " %5d", a [j] [i]);
fprintf (f, "\n");
}

fclose (f);
}

// функция считывания матрицы из файла
// параметры:
// n - кол-во строк (возвращаемое значение)
// m - кол-во столбцов (возвращаемое значение)
// fname - имя файла
// результат:
// матрица
int ** LoadMatrix (int *n, int *m, char *fname) {
FILE *f;
int **a;

if ((f = fopen (fname, "r")) == NULL) {
printf ("\n\nНевозможно открыть указанный файл!\n");
exit (-1);
}

fscanf (f, "%d %d", n, m);

a = allocateMatrix (*n, *m);

for (int i = 0; i < *n; i++)
for (int j = 0; j < *m; j++)
fscanf (f, "%d", &(a [j] [i]));

fclose (f);

return a;
}

// функция заполнения матрицы с помощью ручного ввода
// параметры:
// n - кол-во строк (возвращаемое значение)
// m - кол-во столбцов (возвращаемое значение)
// результат:
// матрица
int ** InputMatrix (int *n, int *m) {
int ** a;
char s [100];

printf ("Введите количество строк матрицы: "); scanf ("%d", n);
printf ("Введите количество столбцов матрицы: "); scanf ("%d", m);

a = allocateMatrix (*n, *m);

printf ("Введите элементы матрицы:\n");
for (int i = 0; i < *n; i++)
for (int j = 0; j < *m; j++) {
printf ("Элемент a [%d] [%d] --> ", i, j);
scanf ("%d", &(a [j] [i]));
}

printf ("Ввод закончен.\nВведите имя файла для сохранения матрицы или '-' для продолжения без сохранения: ");
scanf ("%s", s);
if (s [0] != '-') SaveMatrix (a, *n, *m, s);

return a;
}

// функция заполнения матрицы
// параметры:
// n - кол-во строк (возвращаемое значение)
// m - кол-во столбцов (возвращаемое значение)
// результат:
// матрица
int ** GetMatrix (int *n, int *m) {
char s [100];

printf ("\nВведите имя файла для считывания матрицы из файла или '-' для ручного ввода: ");
scanf ("%s", s);
if (s [0] == '-') return InputMatrix (n, m); else return LoadMatrix (n, m, s);
}

// функция печати матрицы
// параметры:
// a - матрица
// n - кол-во строк
// m - кол-во столбцов
void PrintMatrix (int **a, int n, int m) {
printf ("\nОбрабатываемая матрица:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
printf (" %5d", a [j] [i]);
printf ("\n");
}
}

// Функция вычисления суммы элементов в столбце матрицы
// параметры:
// col - строка матрицы
// n - кол-во строк
// flag - признак того, что столбец содержит положительное число (1 - содержит, 0 - не содержит)
// результат:
// сумма элементов в столбце
int Sum (int *col, int n, int *flag) {
int s = 0;
*flag = 0;

for (int i = 0; i < n; i++) {
s+= col [i];
if (col [i] > 0) *flag = 1;
}

return s;
}

void main () {
int **a;
int n, m;
int s;
int f;

a = GetMatrix (&n, &m);
PrintMatrix (a, n, m);

for (int c = 0; c < m; c++) {
printf ("Столбец №%d: ", c);
s = Sum (a [c], n, &f);
if (f == 0) printf ("не содержит положительных элементов!\n");
else printf ("сумма элементов равна %d\n", s);
}
}
Форма ответа