Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Латинский квадрат - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Используя рекурсию вивести групу даних с их индексами не используя масив http://www.cyberforum.ru/cpp-beginners/thread392996.html
Вот мой код на с++ #include<iostream> #include<conio.h> using namespace std; void elementu(int); void main(void){ setlocale(LC_ALL,".1251"); int n,i; cout<<"Введiть кiлькiсть елементiв=";...
C++ Поиск гамильтонова пути в орграфе Задача такая: Дан ориентированный граф без циклов. Требуется проверить, существует ли в нем путь, прохо- дящий по всем вершинам. Первая строка входного файла содержит два целых числа n и m —... http://www.cyberforum.ru/cpp-beginners/thread392992.html
C++ Вставить функцию в программу!
Помогите пжлст вставить функцию в программу #include <stdio.h> #include <locale.h> float func (float x, float eps) { return (x + eps); } void tabul (float a, float b, int n, float eps) {...
Сортировка подсчётом C++
Нужно написать функцию для сортировки одномерного массива подсчётом(простой алгоритм).
C++ Зеркально отразить ее элементы относительно побочной диагонали. http://www.cyberforum.ru/cpp-beginners/thread392953.html
Дана квадратная матрица A порядка M. Зеркально отразить ее элементы относительно побочной диагонали. (при этом элементы побочной диагонали останутся на прежнем месте, элемент A1,1 поменяется местами...
C++ Непонятные знаки Обьясните пожалуйста, что значит *char (char - любая переменная). Очень часто вижу в разных кодах. подробнее

Показать сообщение отдельно
alenka-46
16 / 16 / 2
Регистрация: 28.04.2011
Сообщений: 38
27.11.2011, 19:49
Можно решить эту задачу с помощью одномерного динамического массива ( динамические массивы позволяют существенно экономить память, не нужно будет создавать массив 100 на 100, если не известен размер квадрата заранее) .

Добавлено через 53 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream.h>
#include <conio.h>
 
void main()
{
int i, j,       // счётчики для циклов,
    n,         // количество элементов в строке 
    flag=0,  // переменная, определяющая действительно ли это латинский квадрат
    sum=0,   // фактическая сумма элементов в строке или столбце
    summa;  // сумма элементов в строке или столбце, которая должна быть
 
clrscr(); // очистка экрана
 
cout <<"\n Введите количество чисел в строке квадрата: ";
cin >> n; 
 
// рассчитаем сумму элементов в строке квадрата по след. формуле n*(n+1)/2
// (результат всегда будет целым числом)
 
summa=n*(n+1)/2;
 
// создадим одномерный динамический массив для элементов квадрата
 
int *mass = new int [n*n];
 
// попросим пользователя произвольно заполнить квадрат
 
for(i=0; i<n; i++)
   for(j=0; j<n; j++)
   {
      cout << "\n Введите элемент строки " <<i+1 <<" столбца " <<j+1 <<" : ";
      cin >> mass[i*n+j];
   }
 
// проверка элементов строк
 
for(i=0; i<n; i++)
{
   for(j=0; j<n; j++)
   {
      if(mass[i*n+j]<1 || mass[i*n+j]>n)   // если один из элементов строки меньше 1 или больше n ,
      {                                                 // то это не латинский квадрат,
          i=n;                                          // приравниваем счётчики i и j к n,
          j=n;                                          // что обеспечивает выход из циклов for
          flag=1;                                      // объединичиваем flag  для нелатинских квадратов
      }
      sum+=mass[i*n+j];                         // прибавляем к sum очередной элемент строки
   }
   if(sum!=summa)   // если сумма элементов в строке не равна нужной summa,
   {                      // то это не латинский квадрат (дальше делаем то же самое)
       i=n; 
       j=n; 
       flag=1;
   }
   sum=0;              // обнуляем переменную sum
}
 
// проверяем элементы столбцов (практически также)
if(flag==0)    // если в строках не обнаружено несоответствие, то проверяем столбцы
{
   for(i=0; i<n; i++)
   {
      for(j=0; j<n; j++)
      {
         if(mass[i+j*n]<1 || mass[i+j*n]>n)   // если один из элементов столбца меньше 1 или больше n ,
         {                                                 // то это не латинский квадрат,
            i=n;                                          // приравниваем счётчики i и j к n,
            j=n;                                          // что обеспечивает выход из циклов for
            flag=1;                                      // объединичиваем flag  для нелатинских квадратов
         }
         sum+=mass[i+j*n];                         // прибавляем к sum очередной элемент строки
      }
      if(sum!=summa)   // если сумма элементов в строке не равна нужной summa,
      {                      // то это не латинский квадрат (дальше делаем то же самое)
          i=n; 
          j=n; 
          flag=1;
      }
      sum=0;              // обнуляем переменную sum
   }
}
 
clrscr(); // очистка экрана
 
// печать массива в виде квадрата
 
cout <<"  Квадрат: ";
 
for(i=0; i<n; i++)
   {
   cout <<"\n ";
   for(j=0; j<n; j++)
      cout << mass[i*n+j] <<"\t";
   }
   
if(flag==0)
   cout << "\n Данный квадрат действительно латинский";
else
   cout << "\n Квадрат не является латинским";
 
}
Добавлено через 8 минут
ПРОВЕРЬТЕ эту программу на ошибки, они там могут быть (если что - пишите)
// В этой программе можно было использовать обычные массивы, а не динамические (смотря что требует задача). также можно было сделать двумерный массив-матрицу ( но с одномерным мне было удобнее)
//Вместо cout и cin можно использовать printf() и scanf(), тогда вместо <iostream.h> подключают <stdio.h>

В общем, главное разберитесь в алгоритме, надеюсь эта программа хоть чем-то поможет
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru