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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.60
dima170892
0 / 0 / 0
Регистрация: 16.03.2010
Сообщений: 11
#1

Найти скалярное произведение - C++

14.09.2010, 10:08. Просмотров 1890. Ответов 13
Метки нет (Все метки)

неправильное оформление
ДОБРООГО ДНЯ ВСИМ КТО МОЖЕ МЕНИ ДОПОМОГТИ В РИШЕНІ ДАНОЇ ЗАДАЧИ
НЕХАЙ ДАНА МАТРИЦЯ N*N ВСІ ЕЛЕММЕНТИ ЯКОЇ РІЗНІ ЗНАЙДІТЬ СКАЛЯРНИЙ ДОБУТОК РЯДКА З НАЙБИЛЬШИМ ЕЛЕМЕНТОМ МАТРИЦІ І СТОПЦЯ ЗНАЙМЕНШИМ ЕДЕМЕНТОМ .N ВОДИТЬСЯ С КЛАВИАТУРИ ЕЛЕМЕНТИ МАТРИЦІ ГЕНЕРУЮТЬСЯ ВИПАДКОВІМ ЧИНОМ


Пусть дана матрица N*N, все элементы которой разные. Найти скалярное произведение ряда с самым большим элементом матрицу и строки с наименьшим элементом. N - вводится с клавиатуры, элементы матрицы генерируются случайным образом.

 Комментарий администратора 
капс лок при написании сообщения должен быть выключен. официальный язык форума - русский. название темы должно отображать суть проблемы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.09.2010, 10:08     Найти скалярное произведение
Посмотрите здесь:

Найти скалярное произведение векторов C++
Найти скалярное и векторное произведение векторов C++
Даны 2 матрицы. Проверить условие. Найти скалярное произведение. C++
C++ Даны векторы AN={ ai }i=1,N и BN={ bi }i=1,N . Найти их скалярное произведение по формуле:
C++ Найти скалярное произведение двух n-мерных векторов
Найти скалярное произведение матрицы строки на столбец C++
C++ Даны два одномерных массива А и B. Найти их скалярное произведение.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
2443 / 1648 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
14.09.2010, 12:26     Найти скалярное произведение #2
какого еще ряда?
dihlofos
Бродяга
303 / 257 / 17
Регистрация: 27.08.2010
Сообщений: 553
14.09.2010, 13:25     Найти скалярное произведение #3
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
#include <iostream.h>
 
int main()
{
    int mas[100][100], res[100];
    int n, max, min, col, row;
    cout<<"Введите N: ";
    cin>>n;
    srand(time(NULL));
 
 // Заполнение массива
    cout<<"Исходный массив:\n";
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
            cout<<(mas[i][j]=rand()%100)<<'\t';
        cout<<'\n';
    }
 
    min=max=mas[0][0];
 
 //Поиск наиб. и наим.
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
        {
            if (mas[i][j]>max)
            {
                max=mas[i][j];
                row=i;
            }
            if (mas[i][j]<min)
            {
                min=mas[i][j];
                col=j;
            }
        }
 
    cout<<"max = "<<max<<" min = "<<min<<'\n';
    cout<<"Строка= "<<row<<" Столб = "<<col<<'\n';
 
    // Умножение
    cout<<"Результат:\n";
    for(int i=0; i<n; i++)
    {
        cout<<(res[i]=mas[row][i]*mas[i][col])<<'\t';
 
    }
    cout<<endl;
    system("pause");
}
Сделано, правда не в "студии".
asics
Freelance
Эксперт C++
2842 / 1779 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
14.09.2010, 15:03     Найти скалярное произведение #4
dihlofos
Ты забыл подключить библиотеку ctime или time.h,в болие старых версиях компилятора!
dima170892
0 / 0 / 0
Регистрация: 16.03.2010
Сообщений: 11
15.09.2010, 00:53  [ТС]     Найти скалярное произведение #5
dihlofos а в чем??
dihlofos
Бродяга
303 / 257 / 17
Регистрация: 27.08.2010
Сообщений: 553
15.09.2010, 07:15     Найти скалярное произведение #6
dima170892
Это в билдере, хотя особой разницы нет. В студии почти не работал, наверное как-то так (заодно косячок поправил):

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
#include <stdafx.h>
#include "iostream"
#include <time.h>
 
using namespace std; 
 
 
int main()
{
    setlocale(0,"Rus");
        int mas[100][100], res[100];
        int n, max, min, col=0, row=0;
        cout<<"Введите N: ";
        cin>>n;
        srand(time(NULL));
 
 // Заполнение массива
        cout<<"Исходный массив:\n";
        for(int i=0; i<n; i++)
        {
                for(int j=0; j<n; j++)
                        cout<<(mas[i][j]=rand()%100)<<'\t';
                cout<<'\n';
        }
 
        min=max=mas[0][0];
        
 
 //Поиск наиб. и наим.
        for(int i=0; i<n; i++)
                for(int j=0; j<n; j++)
                {
                        if (mas[i][j]>max)
                        {
                                max=mas[i][j];
                                row=i;
                        }
                        if (mas[i][j]<min)
                        {
                                min=mas[i][j];
                                col=j;
                        }
                }
 
        cout<<"max = "<<max<<" min = "<<min<<'\n';
        cout<<"Строка= "<<row<<" Столб = "<<col<<'\n';
 
        // Умножение
        cout<<"Результат:\n";
        for(int i=0; i<n; i++)
        {
                cout<<(res[i]=mas[row][i]*mas[i][col])<<'\t';
 
        }
        cout<<endl;
        system("pause");
}
M128K145
Эксперт C++
8280 / 3499 / 143
Регистрация: 03.07.2009
Сообщений: 10,707
15.09.2010, 14:04     Найти скалярное произведение #7
dihlofos, а если мне нужна матрица 101x101, ваши действия? Исправляйте ошибку


Цитата Сообщение от dihlofos Посмотреть сообщение
C++
1
#include "iostream"
так подключаются ваши файлы, а не ваши вот так
C++
1
#include <iostream>


dihlofos, где возврат значения? У вас main возвращает тип int, но вы ничего не возвращаете


Цитата Сообщение от dihlofos Посмотреть сообщение
C++
1
2
for(int i=0; i<n; i++)
    for(int j=0; j<n; j++)
Объявлять переменную в цикле не хорошо. К тому же студия будет ругаться на многократное объявление переменных i и j


Цитата Сообщение от dihlofos Посмотреть сообщение
C++
1
2
3
4
for(int i=0; i<n; i++)
{
    cout<<(res[i]=mas[row][i]*mas[i][col])<<'\t';
}
Лучше разнести на 2 цикла, все равно быстродействие не повысится
dihlofos
Бродяга
303 / 257 / 17
Регистрация: 27.08.2010
Сообщений: 553
15.09.2010, 18:59     Найти скалярное произведение #8
M128K145, спасибо, что поправили. Давайте по порядку, только больно не бейте

Если нужен массив больше, ладно, можно сделать динамический. После ввода n:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Исходный
                int **mas=new int*[n];
        for(int i=0;i<n;i++)
            mas[i]=new int[n];
 
// Полученный
                int *res=new int[n];
 
..........
 
// Удалить по завершению обработки
                for (int i=0;i<n;i++)
            delete []mas[i];
        delete []mas;
        delete []res;
Сделал статическим, полагая что раз задачка на массивы, ТС возможно не дошёл до изучения указателей.

Насчёт includ'ов, разницу знаю, просто смутила студия, ругающаяся на #include <iostream.h>, а без .h заработала как со скобками, так и с кавычками!

Возврат значения создался автоматом, а я его стёр и даже не заметил, хоть бы warning какой-нибудь выдавало... Вобщем ступил я, в конце надо дописать:
C++
1
return 0;
Насчёт i и j в циклах, раньше если честно никогда так не делал. Но постоянно вижу коды именно с такими конструкциями. Студия кстати не ругается. Переменная же вроде живёт только в пределах цикла? Так вызов её после цикла приведёт к ошибке. Или я ошибаюсь?
M128K145
Эксперт C++
8280 / 3499 / 143
Регистрация: 03.07.2009
Сообщений: 10,707
15.09.2010, 19:29     Найти скалярное произведение #9
Цитата Сообщение от dihlofos Посмотреть сообщение
Если нужен массив больше, ладно, можно сделать динамический
Не ладно, а во-первых вы делаете программу более универсальной, а во-вторых вы экономите память.


Цитата Сообщение от dihlofos Посмотреть сообщение
Студия кстати не ругается. Переменная же вроде живёт только в пределах цикла?
У вас студия случайно не 6.0? Иначе должна ругаться. На j не будет, а вот на i - должна. Плюс вы на создании переменной тратите много времени.

ЗЫ. надеюсь в следующем вашем посте увидеть окончательный вариант кода
dihlofos
Бродяга
303 / 257 / 17
Регистрация: 27.08.2010
Сообщений: 553
15.09.2010, 19:40     Найти скалярное произведение #10
Проверял на 2008 студии, всё было нормально. И в билдере тоже. Ни к j, ни к i никаких претензий.
Вот, вроде всё учёл:

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
#include <stdafx.h>
#include <iostream>
#include <time.h>
 
using namespace std; 
 
 
int main()
{
        setlocale(0,"Rus");
        int n, max, min, col=0, row=0;
    int i,j;
 
        cout<<"Введите N: ";
        cin>>n;
        srand(time(NULL));
 
    int **mas=new int*[n];
        for(int i=0;i<n;i++)
        mas[i]=new int[n];
 
    int *res=new int[n];
 
    // Заполнение массива
        cout<<"Исходный массив:\n";
        for(i=0; i<n; i++)
        {
                for(j=0; j<n; j++)
                        cout<<(mas[i][j]=rand()%100)<<'\t';
                cout<<'\n';
        }
 
        min=max=mas[0][0];
                
 
    //Поиск наиб. и наим.
        for(i=0; i<n; i++)
                for(j=0; j<n; j++)
                {
                        if (mas[i][j]>max)
                        {
                                max=mas[i][j];
                                row=i;
                        }
                        if (mas[i][j]<min)
                        {
                                min=mas[i][j];
                                col=j;
                        }
                }
 
        cout<<"max = "<<max<<" min = "<<min<<'\n';
        cout<<"Строка= "<<row<<" Столб = "<<col<<'\n';
 
        // Умножение
        cout<<"Результат:\n";
        for(i=0; i<n; i++)
        {
                cout<<(res[i]=mas[row][i]*mas[i][col])<<'\t';
 
        }
 
    for (i=0;i<n;i++)
        delete []mas[i];
        delete []mas;
 
        delete []res;
 
        cout<<endl;
        system("pause");
    return 0;
}
M128K145
Эксперт C++
8280 / 3499 / 143
Регистрация: 03.07.2009
Сообщений: 10,707
15.09.2010, 19:52     Найти скалярное произведение #11
Цитата Сообщение от dihlofos Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
if (mas[i][j]>max)
{
    max=mas[i][j];
    row=i;
}
if (mas[i][j]<min)
{
    min=mas[i][j];
    col=j;
}
лучше переписать так
C++
1
2
3
4
5
6
7
8
9
10
11
if (mas[i][j]>max)
{
    max=mas[i][j];
    row=i;
}
else
    if (mas[i][j]<min)
    {
        min=mas[i][j];
        col=j;
    }
В этом случае не выполняется лишняя проверка



Цитата Сообщение от M128K145 Посмотреть сообщение
Цитата Сообщение от dihlofos Посмотреть сообщение
C++
1
2
3
4
for(int i=0; i<n; i++)
{
    cout<<(res[i]=mas[row][i]*mas[i][col])<<'\t';
}
Лучше разнести на 2 цикла, все равно быстродействие не повысится
Добавлю сюда еще один блок из вашего кода
Цитата Сообщение от dihlofos Посмотреть сообщение
C++
1
2
3
4
5
6
for(i=0; i<n; i++)
{
    for(j=0; j<n; j++)
        cout<<(mas[i][j]=rand()%100)<<'\t';
    cout<<'\n';
}
Также быстродействие не повышается, а читабельность ухудшается
dihlofos
Бродяга
303 / 257 / 17
Регистрация: 27.08.2010
Сообщений: 553
15.09.2010, 20:02     Найти скалярное произведение #12
Цитата Сообщение от M128K145 Посмотреть сообщение
Также быстродействие не повышается, а читабельность ухудшается
Ваша правда, и моя тупая привычка.
CyBOSSeR
Эксперт C++
2298 / 1668 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
15.09.2010, 22:07     Найти скалярное произведение #13
Цитата Сообщение от M128K145 Посмотреть сообщение
Объявлять переменную в цикле не хорошо. К тому же студия будет ругаться на многократное объявление переменных i и j
Данные переменные живут только в пределах цикла, проблем никаких не будет.
Цитата Сообщение от M128K145 Посмотреть сообщение
У вас main возвращает тип int, но вы ничего не возвращаете
Это не страшно, по стандарту если поток выполения дошел до конца функции main и не встретил return'а, то будет возвращен 0. Но все же лучше явно возвращать код завершения из main'a.
Цитата Сообщение от M128K145 Посмотреть сообщение
Плюс вы на создании переменной тратите много времени.
Это спорный вопрос, ограничение области видимости порою важнее мизерных затрат на создание объектов встроенных типов.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2010, 08:48     Найти скалярное произведение
Еще ссылки по теме:

C++ Найти скалярное произведение векторов
Динамические структуры данных: Найти скалярное произведение строки с наибольшим элементом и столбца с наименьшим элементом C++
C++ Скалярное произведение
C++ Найти пару векторов из заданного набора имеющую минимальное скалярное произведение
C++ Найти скалярное произведение векторов

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
M128K145
Эксперт C++
8280 / 3499 / 143
Регистрация: 03.07.2009
Сообщений: 10,707
16.09.2010, 08:48     Найти скалярное произведение #14
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Это спорный вопрос, ограничение области видимости порою важнее мизерных затрат на создание объектов встроенных типов.
CyBOSSeR, но учитывая то, для чего планируется использовать переменную j, то ограничение видимости тут не при чем и поэтому лучше в сишном стиле вынести объявление переменных i и j в начало main.

Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Данные переменные живут только в пределах цикла, проблем никаких не будет.
Но в какой-то MS'овской IDE(не помню точно в какой) они точно будут
Yandex
Объявления
16.09.2010, 08:48     Найти скалярное произведение
Ответ Создать тему
Опции темы

Текущее время: 21:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru