Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

/С++/ Действительная квадратная матрица

17K
27 января 2007 года
S_A_M
10 / / 27.01.2007
[SIZE="6"][/SIZE]:confused: [FONT="Times New Roman"]Дана действительная квадратная матрица порядка n. Построить последовательность действительных чисел a1, ..., an по правилу: если в i-й строке матрицы элемент, принадлежащий главной диагонали, отрицателен, то ai равно суме элементов i-й строки, предшествующих первому отрицательному элементу; в противном случае ai равно сумме последних элементов i-й строки, начиная с первого по порядку неотрицательного элемента.[/FONT]
552
27 января 2007 года
Ivanhoe
373 / / 30.04.2006
Отрицательный в моем понимании - меньший нуля.
И - первый по порядку - откуда считая? Я считаю слева направо.
Ну вот набросок.
Код:
uses
  Crt;

const
  N = 10;

var
  Arr: array [1..N, 1..N] of Double;
  A: array [1..N] of Double;
  I, J: Byte;

begin
  ClrScr;

  {Как-то заполняешь матрицу}
 
  for I := 1 to N do
    if Arr[I, I] < 0 then
    begin
      J := 1;
      {Суммируем до первого неотрицательного}
      A := 0;
      while Arr[I, J] >= 0 do
      begin
        A := A + Arr[I, J];
        Inc(J);
      end;
    end
    else
    begin
      {Ищем первый неотрицательный}
      for J := I+1 to N do
        if J >= 0 then
          Break;

      {Суммируем от первого неотрицательного и до конца}
      A := 0;
      while J <= N do
      begin
        A := A + Arr[I, J];
        Inc(J);
      end;
    end;

  ReadKey;
end.

Не забудь сказать спасибо ;)
552
27 января 2007 года
Ivanhoe
373 / / 30.04.2006
Ой, блин... Только заметил, что тебе нада на сишнике :(
Ща я напишу :)
552
27 января 2007 года
Ivanhoe
373 / / 30.04.2006
Ну вот, набросал.
Стоит ли отмечать, что сишник не такой милосердный, как я, и ведет отсчет элементов массива с 0? :)
Код:
#include <stdio.h>

#define N 10

int main() {
  float arr[N][N];
  float a[N];
  int i, j;

  for (i = 0; i < N; i++) {
    if (arr[i, i] < 0) {
      j = 0;
      a = 0;
      // Здесь я маленька ступил в прошлый раз. Надо было делать проверку на достижение границы массива
      while ((arr[i, j] >= 0) && (i < N)) {
        a = a + arr[j];
        j++;
      }
    }
    else {
      for(j = i+1; j < N; j++)
        if (j >= 0)
      break;
     
      a = 0;
      while (j <= N) {
        a = a + arr[j];
    j++;
      }
    }
  }
 
  return 0;
}
552
27 января 2007 года
Ivanhoe
373 / / 30.04.2006
Тут мне намекнули на наличие косяков в программе (m_Valery, ;)). Да, их есть у меня.

Самый очевидный и позорный:
 
Код:
for(j = i+1; j < N; j++)
        [color=red]if (j >= 0)[/color]
      break;
Должно быть:
 
Код:
for(j = i+1; j < N; j++)
        [color=red]if (a[j] >= 0)[/color]
      break;


Поэтому я переписал прогу снуля, откомпилил и проверил. Вот новый RC :)
Сделал ее более C-стайл
Код:
#include <stdio.h>

#define N 5

int main()
{
  float arr[N][N];
  float a[N];
  int i, j;

  for (i = 0; i < N; i++)
  {
    // Заполняем arr случайными числами (-5..5)
    for (j = 0; j < N; j++)
    {
      arr[j] = rand()%10 - 5;
      printf("%f ", arr[j]);
    }
    printf("\n");
   
    // Заодно заполняем a нулями
    a = 0;
  }

  for (i = 0; i < N; i++)
  {
    if (arr < 0)
    {
      for (j = 0; j < N; j++)
      {
        if (arr[j] >= 0)
    {
      a = a + arr[j];
    }
    else
      break;
      }      
    }
    else
    {
      // Ищем первый неотрицательный
      int k = 0;
      for (j = 0; j < N; i++)
      {
        if (arr[j] >= 0)
    {
      k = j;
      break;
    }
      }
     
      for (j = k; j < N; j++)
      {
        a = a + arr[j];
      }
    }
  }      

  printf("\n\n");

  for (i = 0; i < N; i++)
  {
    printf("%f ", a);
  }

  printf("\n\n");

  return 0;
}
320
28 января 2007 года
m_Valery
1.0K / / 08.01.2007
2IvanhoeВот у меня так,похоже на твой вариант,но есть отличия
матрица - любого размера, ну и еще там по мелочам.Посмотри,
может еще улучшишь:)
Microsoft Visual Studio2003.
Код:
#include "stdafx.h"
#include <iostream>
#include "windows.h"
#include <ctime>
#include <iomanip>

using namespace std;

inline char *rus(char *s)
{
 char *t = new char[strlen(s) + 1];
 CharToOem(s,t);
 return t;
}
int _tmain(int argc, _TCHAR* argv[])
{
   srand(time(0));
   int n;
   cout<<rus("введите размер матрицы")<<endl;
   cin>>n;
   int **mas = new int*[n];
   int *a = new int[n];
   for(int i = 0;i<n;++i)
       a = 0;
   cout<<rus("исходная последовательность :")<<endl;
   cout<<endl;
   for(int i = 0;i<n;++i)
       cout<<a<<' ';
   cout<<endl;
   for(int i = 0;i<n;++i){
       mas = new int[n];
      for(int j = 0;j<n;++j)
          mas[j] = rand() % 10 - 5;
   }
    cout<<endl;
    cout<<rus("\tисходная матрица")<<"\n\n";
   for(int i = 0;i<n;++i){
      for(int j = 0;j<n;++j)
        cout<<setw(5)<<mas[j];
      cout<<"\n\n";
   }
  int j,value = 0;
   //проверяем диагонали
   for(int i = 0;i<n;++i){
       if(mas<0){
          for(j = 0;mas[j]>=0;++j)
            a += mas[j];
       }else{
            for(j = 0;j<n;++j)
    {
           
                 if(mas[j]>=0){//ищем 1-й неотриц.элемент
        value = j;
        break;
        }
    }
              for(j = value;j<n;++j)
         a += mas[j];
        }
   }
   cout<<'\n'<<rus("окончательная последовательность")<<"\n\n";
   for(int i = 0;i < n;++i)
       cout<<a<<' ';
   cout<<endl;
   delete a;
   for(int i=0;i<n;i++)
        delete[] mas;
    delete[] mas;
    return 0;
}
17K
28 января 2007 года
S_A_M
10 / / 27.01.2007
СПАСИБО ОГРОМНОЕ !!!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог