Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание двумерного массива 
:(
    Опции темы
dimmon123
Дата 13.10.2012, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



Привет!подскажите как будет выглядеть код с таким заданием: Реализовать программу "заполнение матрицы" создающую двумерный массив 2х2 чисел с плавающей точкой, запрашивающую у пользователя значение каждого элемента массива в формате "введите элемент 1,1 :" и выводящую заполненный пользователем массив на экран.
Синтаксис объявления двумерного массива: 
 ТипЭлементовМассива ИмяМассива[РАЗМЕРНСОТЬ_1_ИЗМEРЕНИЯ][РАЗМЕРНОСТЬ_2_ИЗМЕРЕНИЯ] ; 
В качестве РАЗМЕРНСОТЬ_1_ИЗМEРЕНИЯ и РАЗМЕРНСОТЬ_2_ИЗМEРЕНИЯ нельзя использовать переменные - можно использовать только непосредственные значения. 
Для вывода матрицы на экран воспользуйтесь функцией printf. В строке форматирования для перевода строки указывайте \n, а для выравнивания столбцов воспользуйтесь символом табуляции - \t. 
Для обхода всех элементов матрицы воспользуйтесь циклом for. 
Обратите особое внимание на то, что РАЗМЕРНСОТЬ_1_ИЗМEРЕНИЯ и РАЗМЕРНСОТЬ_2_ИЗМEРЕНИЯ при создании массива - это количество элементов, а не максимально допустимый индекс в массиве. 
Элементы массива всегда нумеруются с 0. Соответственно, если Вы создаете массив из 3 элементов, то вы можете обращаться только к первым 3м элементам, а именоо - с индексом 0, с индексом 1 и с индексом 2. Обращение к элементу с индексом 3 может привести к непредсказуемым результатам.
PM MAIL   Вверх
feodorv
Дата 13.10.2012, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  13.10.2012,  20:28 Найти цитируемый пост)
В качестве РАЗМЕРНСОТЬ_1_ИЗМEРЕНИЯ и РАЗМЕРНСОТЬ_2_ИЗМEРЕНИЯ нельзя использовать переменные - можно использовать только непосредственные значения. 

Так это хорошо!
Код

#define DIM1    2
#define DIM2    2

double massive[DIM1][DIM2]; 


Цитата(dimmon123 @  13.10.2012,  20:28 Найти цитируемый пост)
Для обхода всех элементов матрицы воспользуйтесь циклом for. 

Одним? Или можно вложенным?
Код

int i, j;

for( i = 0; i < DIM1; i++)
  for( j = 0; j < DIM2; j++)
  {
    printf( "введите элемент %d,%d :", i, j);
    scanf( "%f", &massive[i][j]);
    printf( "\n" );
  }


Цитата(dimmon123 @  13.10.2012,  20:28 Найти цитируемый пост)
Для вывода матрицы на экран воспользуйтесь функцией printf

Код

for( i = 0; i < DIM1; i++)
  for( j = 0; j < DIM2; j++)
    printf( "элемент %d,%d : %f\n", i, j, massive[i][j]);



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 13.10.2012, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



в общем код должен получиться вот такой?
Код
#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
#include "iostream"


using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
#define DIM1    2
#define DIM2    2

double massive[DIM1][DIM2]; 

int i, j;

for( i = 0; i < DIM1; i++)
  for( j = 0; j < DIM2; j++)
  {
    printf( "Enter the element %d,%d :", i, j);
    scanf_s( "%f", &massive[i][j]);
    printf( "element %d,%d : %f\n", i, j, massive[i][j]);
  }


}



Модератор: не забываем пользоваться кнопочкой "Код"
PM MAIL   Вверх
feodorv
Дата 13.10.2012, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  13.10.2012,  22:36 Найти цитируемый пост)
#include "iostream"

using namespace std;


Гм. Стоит определиться, что Вам нужно - C или C++... Ибо тогда лучше
Код

const int DIM1 = 2;
const int DIM2 = 2;



Цитата(dimmon123 @  13.10.2012,  22:36 Найти цитируемый пост)
   printf( "Enter the element %d,%d :", i, j);
    scanf_s( "%f", &massive[i][j]);
    printf( "element %d,%d : %f\n", i, j, massive[i][j]);

Ввод значений и их вывод лучше разделить, даже если это будет второй обход матрицы.


А так - пойдёт  smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 13.10.2012, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



feodorv, нужно в С++ через Visual Studio 2012

Цитата(feodorv @  13.10.2012,  22:20 Найти цитируемый пост)
Ввод значений и их вывод лучше разделить, даже если это будет второй обход матрицы.


а как разделить?))

Это сообщение отредактировал(а) dimmon123 - 13.10.2012, 22:47
PM MAIL   Вверх
feodorv
Дата 13.10.2012, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  13.10.2012,  23:45 Найти цитируемый пост)
а как разделить?))


Цитата(feodorv @  13.10.2012,  22:24 Найти цитируемый пост)

for( i = 0; i < DIM1; i++)
  for( j = 0; j < DIM2; j++)
  {
    printf( "введите элемент %d,%d :", i, j);
    scanf( "%f", &massive[i][j]);
  }

for( i = 0; i < DIM1; i++)
  for( j = 0; j < DIM2; j++)
    printf( "элемент %d,%d : %f\n", i, j, massive[i][j]);




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 14.10.2012, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



вот код получился: 
Код

int _tmain(int argc, _TCHAR* argv[])
{
const int DIM1 = 2;
const int DIM2 = 2;

double massive[DIM1][DIM2]; 

int i, j;

for( i = 0; i < DIM1; i++)
  for( j = 0; j < DIM2; j++)
  {
    printf( "Enter the element %d,%d :", i, j);
    scanf_s( "%f", &massive[i][j]);
  }

for( i = 0; i < DIM1; i++)
  for( j = 0; j < DIM2; j++)
    printf( "Element %d,%d : %d\n", i, j, massive[i][j]);
    return 0;



массив после ввода элементов отображается вот так(во вложенном фото), правильно?

Это сообщение отредактировал(а) dimmon123 - 15.10.2012, 15:57

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  Безымянный.png 68,33 Kb
PM MAIL   Вверх
dimmon123
Дата 14.10.2012, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



потом надо будет сделать: Модифицировать программу  так, чтобы пользователь выполнял заполнение 2х квадратных матриц. После этого программа должна выполнять сложение введенных пользователем матриц и вывод исходных матриц и результата на экран.

 

Для обхода всех элементов матрицы в процессе сложения воспользуйтесь циклом do-while.
PM MAIL   Вверх
feodorv
Дата 14.10.2012, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  14.10.2012,  18:13 Найти цитируемый пост)
правильно?

Неправильно. Это же заметно невооружённым глазом  smile 
Ошибка в формате вывода:
Цитата(dimmon123 @  14.10.2012,  18:13 Найти цитируемый пост)
    printf( "Element %d,%d : %d\n", i, j, massive[i][j]);

Для double предусмотрены форматы %e,%f,%g,%E,%F,%G, но никак не %d.


Цитата(dimmon123 @  14.10.2012,  18:36 Найти цитируемый пост)
потом надо будет сделать

Делайте по аналогии smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 15.10.2012, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



feodorv, вроде код прописал:


Код

#include "stdio.h"
#include "stdafx.h"
#include "windows.h"
#include "math.h"
#include "conio.h"
#include "stdlib.h"
#define n 100

 int i,j;
 int nl1,nc1;
 int nl2,nc2;    
 int nl,nc;
 int mt1[n][n];
 int mt2[n][n];
 int summa[n][n];
 
void main()
{
   do {

        printf("Nomer liniy dlia mt1:");  scanf_s("%d",&nl1);
        printf("Nomer colon dlia mt1:"); scanf_s("%d",&nc1);
        
        printf("Nomer liniy dlia mt2:");  scanf_s("%d",&nl2);
        printf("Nomer colon dlia mt2:"); scanf_s("%d",&nc2);
 
        if(nc1!=nc2 && nl1!=nl2)
        {
                printf("Summa nevozmojna!");
        }
 
        else
        {
                nl=nl1=nl2;             
                nc=nc1=nc2;
                
                printf("\nmt1:\n");
                for(i=1;i<=nl;i++)
                {
                        for(j=1;j<=nc;j++)
                        {
                                printf("Element %d, %d:  ",i,j);
                                scanf_s(" %d",&mt1[i][j]);
                        }
                }
                
                printf("\nmt2:\n");
                for(i=1;i<=nl;i++)
                {
                        for(j=1;j<=nc;j++)
                        {
                                printf("Element %d, %d:  ",i,j);
                                scanf_s("%d",&mt2[i][j]);
                        }
                }
                printf("\nResultat:\n");
                for(i=1;i<=nl;i++)
                {
                        for(j=1;j<=nc;j++)
                        {
                                summa[i][j]=mt1[i][j]+mt2[i][j];
                        }
                }
                for(i=1;i<=nl;i++)
                {
                        for(j=1;j<=nc;j++)
                        {
                                printf(" %d",summa[i][j]);
                        }
                        putchar('\n');
                }
        }
        _getch();
    }
    while (true);
}



Добавлено @ 12:58
feodorv, а как сделать  в высланном мной коде чтобы пользователю перед вводом элементов каждой из матриц предлагалось произвести автозаполнение всех элементов матрицы случайными величинами, либо заполнение диагонали матрицы единицами, а остальных элементов - нулями, либо ввод каждого элемента с клавиатуры - по желанию пользователя?[code=cpp]


Это сообщение отредактировал(а) dimmon123 - 15.10.2012, 15:45
PM MAIL   Вверх
feodorv
Дата 15.10.2012, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  15.10.2012,  13:57 Найти цитируемый пост)
 вроде код прописал

Что-то в этом роде smile Несколько замечаний:
  • Цитата(dimmon123 @  15.10.2012,  13:57 Найти цитируемый пост)
                    for(i=1;i<=nl;i++)

    и подобное. В C/C++ отсчёт идет от нуля, не от единицы, правильная запись:
    Код

    for(i=0;i<nl;i++)

    иначе Вы вылезаете за пределы массива (очень грубая ошибка!)
  • Цитата(dimmon123 @  15.10.2012,  13:57 Найти цитируемый пост)
            if(nc1!=nc2 && nl1!=nl2)

    Тогда стОит проверить, что nc1... > 0 и <= n (мало что).
    Но, мне кажется, размерности можно запрашивать один раз (зачем два-то?)
  • Цитата(dimmon123 @  14.10.2012,  18:36 Найти цитируемый пост)
    Для обхода всех элементов матрицы в процессе сложения воспользуйтесь циклом do-while. 

    У Вас же сплошной for, а do-while используется глобально, для всей задачи в целом.


Цитата(dimmon123 @  15.10.2012,  13:57 Найти цитируемый пост)
 как сделать  в высланном мной коде чтобы пользователю перед вводом элементов каждой из матриц предлагалось произвести автозаполнение всех элементов матрицы случайными величинами, либо заполнение диагонали матрицы единицами, а остальных элементов - нулями, либо ввод каждого элемента с клавиатуры - по желанию пользователя? 

Можно предложить пользователю список действий под номерами, например, как сделано здесь smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
feodorv
Дата 15.10.2012, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Да, всё время забываю Вас попросить при демонстрации кода пользоваться кнопкой "Код", находящейся над полем ввода сообщения, чтобы код в сообщении культурно выделялся.
И, пожалуйста, поправьте в этом смысле свои прежние сообщения smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 15.10.2012, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



Цитата(feodorv @  15.10.2012,  15:18 Найти цитируемый пост)
Да, всё время забываю Вас попросить при демонстрации кода пользоваться кнопкой "Код", находящейся над полем ввода сообщения, чтобы код в сообщении культурно выделялся.И, пожалуйста, поправьте в этом смысле свои прежние сообщения  


все сделал))спасибо!буду доделывать лабу, там еще 3 задания smile 

Задание 4: Модифицировать программу из предыдущего задания так, чтобы после заполнения 2х матриц пользователя спрашивали, желает ли он выполнить умножение или сложение матриц и выполнялась выбранная пльзователем операция. После этого программа должна осуществлять вывод исходных матриц, наименования операции и результата на экран.
 
Задание 5: Модифицировать программу из предыдущего задания так, чтобы сначала программа узнавала у пользователя размеры используемых квадратных матриц (в пределах от 1 до 20) и все действия производились над матрицами указанных пользователем размеров. 
 
Изначально создавайте матрицы 20х20, а в процессе работы используйте только первые iElementNum элементов матрицы, где iElementNum - размер матрицы, укказываемый пользователем. 
 
Результат продемонстрировать преподавателю. 
 
Задание 6: Модифицировать программу из предыдущего задания так, пользователь имел возможность при задании матриц редактировать любой элемент:пользователю задается вопрос, желает ли он редактировать матрицу. Если желает - пользователь вводит координаты редактируемого элемента и новое значение. Затем процедура повторяется.


Это сообщение отредактировал(а) dimmon123 - 15.10.2012, 16:06
PM MAIL   Вверх
feodorv
Дата 15.10.2012, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  15.10.2012,  16:59 Найти цитируемый пост)
все сделал))

Спасибо!

Цитата(dimmon123 @  15.10.2012,  16:59 Найти цитируемый пост)
там еще 3 задания

Ну хорошо хоть не "отрицательный факториал" smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 15.10.2012, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



Цитата(feodorv @  15.10.2012,  16:13 Найти цитируемый пост)
Ну хорошо хоть не "отрицательный факториал" 

отрицательный я так и не понял как сделать да и в основном задании такого условия не было, это препод уже потом придумал, буду выносить ему мозг чтоб не делать отрицательный)))
PM MAIL   Вверх
dimmon123
Дата 15.10.2012, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



feodorv, сделал 3 задание, в 4 надо модифицировать программу из предыдущего задания так, чтобы после заполнения 2х матриц пользователя спрашивали, желает ли он выполнить умножение или сложение матриц и выполнялась выбранная пльзователем операция. После этого программа должна осуществлять вывод исходных матриц, наименования операции и результата на экран.Вопрос, куда вставить умножение матриц?
 вот код:
Код

// ConsoleApplication7.cpp: определяет точку входа для консольного приложения.
//

#include "stdio.h"
#include "stdafx.h"
#include "windows.h"
#include "math.h"
#include "conio.h"
#include "stdlib.h"
#define n 20

 int i,j;
 int nl1,nc1;
 int nl2,nc2;    
 int nl,nc;
 int mt1[n][n];
 int mt2[n][n];
 int summa[n][n];

 
void main()
{
  do {
        printf("Nomer liniy dlia mt1:");  scanf_s("%d",&nl1);
        printf("Nomer colon dlia mt1:"); scanf_s("%d",&nc1);
        
        printf("Nomer liniy dlia mt2:");  scanf_s("%d",&nl2);
        printf("Nomer colon dlia mt2:"); scanf_s("%d",&nc2);
 
        if(nc1!=nc2 && nl1!=nl2)
        {
                printf("Summa nevozmojna!");
        }
 
        else
        {
            
             system ("cls");
             printf ("(1) - Aftozapolnenie\n (2) - Zapolnenie diagonali\n (3) - Vvod s klaviaturi\n \n Please select: ");
                nl=nl1=nl2;             
                nc=nc1=nc2;
             char iSelect = _getch();
             switch (iSelect)
             {
             case '1': 
               system("cls");
               for(i=0;i<=nl;i++)
                {
                        for(j=0;j<=nc;j++)
                
               mt1[i][j]=rand();
               mt2[i][j]=rand();
                }
               printf("\nResultat:\n");
                for(i=0;i<=nl;i++)
                {
                        for(j=0;j<=nc;j++)
                        {
                                summa[i][j]=mt1[i][j]+mt2[i][j];
                        }
                }
                for(i=0;i<=nl;i++)
                {
                        for(j=0;j<=nc;j++)
                        {
                                printf(" %d",summa[i][j]);
                        }
                        putchar('\n');
                }

               _getch(); _getch();

            break;
                                            
            case '2':
              system("cls");
              for(i=0;i<=nl;i++)
                {
                        for(j=0;j<=nc;j++)
              if (i==j)
                mt1[i][j]=1;
              else
                mt1[i][j]=0;
                }
               printf("\nResultat:\n");
                for(i=0;i<=nl;i++)
                {
                        for(j=0;j<=nc;j++)
                        {
                                summa[i][j]=mt1[i][j]+mt2[i][j];
                        }
                }
                for(i=0;i<=nl;i++)
                {
                        for(j=0;j<=nc;j++)
                        {
                                printf(" %d",summa[i][j]);
                        }
                        putchar('\n');
                }

              _getch(); _getch();
              
            break;
                
            case '3':
              system("cls");
                printf("\nmt1:\n");
                 
                for(i=0;i<=nl;i++)
                {
                        for(j=0;j<=nc;j++)
                        {
                                printf("Element %d, %d:  ",i,j);
                                scanf_s(" %d",&mt1[i][j]);
                        }
                }
               
                printf("\nmt2:\n");
                for(i=0;i<=nl;i++)
                {
                        for(j=0;j<=nc;j++)
                        {
                                printf("Element %d, %d:  ",i,j);
                                scanf_s("%d",&mt2[i][j]);
                        }
                }
                printf("\nResultat:\n");
                 for(i=0;i<=nl;i++)
                {
                        for(j=0;j<=nc;j++)
                        {
                                summa[i][j]=mt1[i][j]+mt2[i][j];
                        }
                }
                for(i=0;i<=nl;i++)
                {
                        for(j=0;j<=nc;j++)
                        {
                                printf(" %d",summa[i][j]);
                        }
                        putchar('\n');
                }

                _getch(); _getch();

                break;
                
            default: 
            printf ("\n\nBad select, try again"); 
            _getch(); _getch(); 

            break;
                                           
        _getch();
        }
     
      }
    }
while (true);
}



Это сообщение отредактировал(а) dimmon123 - 15.10.2012, 19:40
PM MAIL   Вверх
feodorv
Дата 15.10.2012, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  15.10.2012,  20:22 Найти цитируемый пост)
Вопрос, куда вставить умножение матриц?

Ну, я бы просто завёл переменную, равную 0, если нужна сумма, и не 0, если умножение:
Код

                printf("\n%s resultat:\n", doMul ? "Mul" : "Sum");
                if( doMul )
                  ... // умножаем матрицы
                else
                {
                      // складываем матрицы
                   for(i=0;i<nl;i++)
                     for(j=0;j<nc;j++)
                        res[i][j]=mt1[i][j]+mt2[i][j];
                }

Я вот сейчас задумался - а Вам действительно нужно настоящее перемножение матриц? Из серии:
Код

for( i=0; i<nl; i++)
   for( j=0; j<nc; j++)
   {
      res[i][j] = 0;
      for( k = 0; k < nc; k++) res[i][j] += mt1[i][k] * mt2[k][j];
   }

а не просто перемножение элементов матрицы:
Код

for( i=0; i<nl; i++)
   for( j=0; j<nc; j++)
      res[i][j] = mt1[i][j] * mt2[i][j];

Тогда матрицы обязаны быть квадратными (чтобы их можно было и умножать и складывать)...

PS 
Цитата(dimmon123 @  15.10.2012,  20:22 Найти цитируемый пост)
                 for(i=0;i<=nl;i++)

Если отсчёт начинается с 0, то заканчиваться должен на (nl-1), то есть
Код

for(i=0;i<nl;i++)

А то матрица 2x2 превратится в 3x3...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 15.10.2012, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



сначало было задание 2: Модифицировать программу из предыдущего задания так, чтобы пользователь выполнял заполнение 2х квадратных матриц. После этого программа должна выполнять сложение введенных пользователем матриц и вывод исходных матриц и результата на экран.
потом задание 3: Модифицировать программу из предыдущего задания так, чтобы пользователю перед вводом элементов каждой из матриц предлагалось произвести автозаполнение всех элементов матрицы случайными величинами, либо заполнение диагонали матрицы единицами, а остальных элементов - нулями, либо ввод каждого элемента с клавиатуры - по желанию пользователя.

 результат 3 задания я синул, вот 4 задание: Модифицировать программу из предыдущего задания так, чтобы после заполнения 2х матриц пользователя спрашивали, желает ли он выполнить умножение или сложение матриц и выполнялась выбранная пльзователем операция. После этого программа должна осуществлять вывод исходных матриц, наименования операции и результата на экран.

я что то не так сделал перед тем как 4 задание выполнить?
PM MAIL   Вверх
feodorv
Дата 15.10.2012, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  15.10.2012,  21:24 Найти цитируемый пост)
я что то не так сделал перед тем как 4 задание выполнить? 

Ну, кроме
Цитата(feodorv @  15.10.2012,  21:13 Найти цитируемый пост)
Цитата(dimmon123 @  15.10.2012,  20:22 Найти цитируемый пост)
                 for(i=0;i<=nl;i++)

Если отсчёт начинается с 0, то заканчиваться должен на (nl-1), то есть
Выделить всёкод C++
1:
    
for(i=0;i<nl;i++)

А то матрица 2x2 превратится в 3x3... 

нет, всё так.

Просто в уме уже стоит держать 5-ый пункт... И для квадратных матриц нужна одна единственная размерность, вместо четырёх...

Это сообщение отредактировал(а) feodorv - 15.10.2012, 21:03


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 15.10.2012, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



Цитата(feodorv @  15.10.2012,  21:00 Найти цитируемый пост)
Просто в уме уже стоит держать 5-ый пункт... И для квадратных матриц нужна одна единственная размерность, вместо четырёх...

не понял?

вот так прально поменял?надо и nl и nc сделать не <=, а просто <?
Код

// ConsoleApplication7.cpp: определяет точку входа для консольного приложения.
//

#include "stdio.h"
#include "stdafx.h"
#include "windows.h"
#include "math.h"
#include "conio.h"
#include "stdlib.h"
#define n 20

 int i,j;
 int nl1,nc1;
 int nl2,nc2;    
 int nl,nc;
 int mt1[n][n];
 int mt2[n][n];
 int summa[n][n];

 
void main()
{
  do {
        printf("Nomer liniy dlia mt1:");  scanf_s("%d",&nl1);
        printf("Nomer colon dlia mt1:"); scanf_s("%d",&nc1);
        
        printf("Nomer liniy dlia mt2:");  scanf_s("%d",&nl2);
        printf("Nomer colon dlia mt2:"); scanf_s("%d",&nc2);
 
        if(nc1!=nc2 && nl1!=nl2)
        {
                printf("Summa nevozmojna!");
        }
 
        else
        {
            
             system ("cls");
             printf ("(1) - Aftozapolnenie\n (2) - Zapolnenie diagonali\n (3) - Vvod s klaviaturi\n \n Please select: ");
                nl=nl1=nl2;             
                nc=nc1=nc2;
             char iSelect = _getch();
             switch (iSelect)
             {
             case '1': 
               system("cls");
               for(i=0;i<nl;i++)
                {
                        for(j=0;j<nc;j++)
                
               mt1[i][j]=rand();
               mt2[i][j]=rand();
                }
               printf("\nResultat:\n");
                for(i=0;i<nl;i++)
                {
                        for(j=0;j<nc;j++)
                        {
                                summa[i][j]=mt1[i][j]+mt2[i][j];
                        }
                }
                for(i=0;i<nl;i++)
                {
                        for(j=0;j<nc;j++)
                        {
                                printf(" %d",summa[i][j]);
                        }
                        putchar('\n');
                }

               _getch(); _getch();

            break;
                                            
            case '2':
              system("cls");
              for(i=0;i<nl;i++)
                {
                        for(j=0;j<nc;j++)
              if (i==j)
                mt1[i][j]=1;
              else
                mt1[i][j]=0;
                }
               printf("\nResultat:\n");
                for(i=0;i<nl;i++)
                {
                        for(j=0;j<nc;j++)
                        {
                                summa[i][j]=mt1[i][j]+mt2[i][j];
                        }
                }
                for(i=0;i<nl;i++)
                {
                        for(j=0;j<nc;j++)
                        {
                                printf(" %d",summa[i][j]);
                        }
                        putchar('\n');
                }

              _getch(); _getch();
              
            break;
                
            case '3':
              system("cls");
                printf("\nmt1:\n");
                 
                for(i=0;i<nl;i++)
                {
                        for(j=0;j<nc;j++)
                        {
                                printf("Element %d, %d:  ",i,j);
                                scanf_s(" %d",&mt1[i][j]);
                        }
                }
               
                printf("\nmt2:\n");
                for(i=0;i<nl;i++)
                {
                        for(j=0;j<nc;j++)
                        {
                                printf("Element %d, %d:  ",i,j);
                                scanf_s("%d",&mt2[i][j]);
                        }
                }
                printf("\nResultat:\n");
                 for(i=0;i<nl;i++)
                {
                        for(j=0;j<nc;j++)
                        {
                                summa[i][j]=mt1[i][j]+mt2[i][j];
                        }
                }
                for(i=0;i<nl;i++)
                {
                        for(j=0;j<nc;j++)
                        {
                                printf(" %d",summa[i][j]);
                        }
                        putchar('\n');
                }

                _getch(); _getch();

                break;
                
            default: 
            printf ("\n\nBad select, try again"); 
            _getch(); _getch(); 

            break;
                                           
        _getch();
        }
     
      }
    }
while (true);
}



Это сообщение отредактировал(а) dimmon123 - 15.10.2012, 21:36
PM MAIL   Вверх
feodorv
Дата 15.10.2012, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  15.10.2012,  22:32 Найти цитируемый пост)
напиши номер строки где что заменить надо))


Смотри:
Цитата(dimmon123 @  15.10.2012,  20:22 Найти цитируемый пост)
 int nl1,nc1;
 int nl2,nc2;


Цитата(dimmon123 @  15.10.2012,  20:22 Найти цитируемый пост)
        printf("Nomer liniy dlia mt1:");  scanf_s("%d",&nl1);
        printf("Nomer colon dlia mt1:"); scanf_s("%d",&nc1);
        
        printf("Nomer liniy dlia mt2:");  scanf_s("%d",&nl2);
        printf("Nomer colon dlia mt2:"); scanf_s("%d",&nc2);


Если матрицы квадратные, то нужна одна переменная (назовём её dim):
Код

int dim = 0;

printf( "Please, enter matrix dimention:" );  scanf_s( "%d", &dim);
if( dim <= 0 || dim > n ) 
{
   printf( "Invalid value %d\n", dim);
   continue;
}
nl1 = nc1 = nl2 = nc2 = dim; // лучше совсем избавиться от переменных nl1, nc1, nl2, nc2



Цитата(dimmon123 @  15.10.2012,  20:22 Найти цитируемый пост)
                for(i=0;i<=nl;i++)

Везде в форах нужно поменять <= на просто <.


Ты так и не сказал, как матрицы перемножать нужно...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 15.10.2012, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



Ты так и не сказал, как матрицы перемножать нужно...

в задании не указано как перемножать нужно, написано просто "модифицировать программу из предыдущего задания так, чтобы после заполнения 2х матриц пользователя спрашивали, желает ли он выполнить умножение или сложение матриц и выполнялась выбранная пльзователем операция. После этого программа должна осуществлять вывод исходных матриц, наименования операции и результата на экран"

 вот исправил код на одну переменную, так как матрица квадратная:
Код

// ConsoleApplication7.cpp: определяет точку входа для консольного приложения.
//

#include "stdio.h"
#include "stdafx.h"
#include "windows.h"
#include "math.h"
#include "conio.h"
#include "stdlib.h"
#define n 20

 int i,j;
 int dim = 0;
 int mt1[n][n];
 int mt2[n][n];
 int summa[n][n];

 
void main()
{
  do {
         printf( "Please, enter matrix dimension:" );  scanf_s( "%d", &dim);
         if( dim <= 0 || dim > n ) 
          {
             printf( "Invalid value %d\n", dim);
              continue;
          }
          
       else
        {
            
             system ("cls");
             printf ("(1) - Aftozapolnenie\n (2) - Zapolnenie diagonali\n (3) - Vvod s klaviaturi\n \n Please select: ");
                
             char iSelect = _getch();
             switch (iSelect)
             {
             case '1': 
               system("cls");
               for(i=0;i<dim;i++)
                {
                        for(j=0;j<dim;j++)
                
               mt1[i][j]=rand();
               mt2[i][j]=rand();
                }
               printf("\nResultat:\n");
                for(i=0;i<dim;i++)
                {
                        for(j=0;j<dim;j++)
                        {
                                summa[i][j]=mt1[i][j]+mt2[i][j];
                        }
                }
                for(i=0;i<dim;i++)
                {
                        for(j=0;j<dim;j++)
                        {
                                printf(" %d",summa[i][j]);
                        }
                        putchar('\n');
                }

               _getch(); _getch();

            break;
                                            
            case '2':
              system("cls");
              for(i=0;i<dim;i++)
                {
                        for(j=0;j<dim;j++)
              if (i==j)
                mt1[i][j]=1;
              else
                mt1[i][j]=0;
                }
               printf("\nResultat:\n");
                for(i=0;i<dim;i++)
                {
                        for(j=0;j<dim;j++)
                        {
                                summa[i][j]=mt1[i][j]+mt2[i][j];
                        }
                }
                for(i=0;i<dim;i++)
                {
                        for(j=0;j<dim;j++)
                        {
                                printf(" %d",summa[i][j]);
                        }
                        putchar('\n');
                }

              _getch(); _getch();
              
            break;
                
            case '3':
              system("cls");
                printf("\nmt1:\n");
                 
                for(i=0;i<dim;i++)
                {
                        for(j=0;j<dim;j++)
                        {
                                printf("Element %d, %d:  ",i,j);
                                scanf_s(" %d",&mt1[i][j]);
                        }
                }
               
                printf("\nmt2:\n");
                for(i=0;i<dim;i++)
                {
                        for(j=0;j<dim;j++)
                        {
                                printf("Element %d, %d:  ",i,j);
                                scanf_s("%d",&mt2[i][j]);
                        }
                }
                printf("\nResultat:\n");
                 for(i=0;i<dim;i++)
                {
                        for(j=0;j<dim;j++)
                        {
                                summa[i][j]=mt1[i][j]+mt2[i][j];
                        }
                }
                for(i=0;i<dim;i++)
                {
                        for(j=0;j<dim;j++)
                        {
                                printf(" %d",summa[i][j]);
                        }
                        putchar('\n');
                }

                _getch(); _getch();

                break;
                
            default: 
            printf ("\n\nBad select, try again"); 
            _getch(); _getch(); 

            break;
                                           
        _getch();
        }
     
      }
    }
while (true);
}



Это сообщение отредактировал(а) dimmon123 - 15.10.2012, 22:13
PM MAIL   Вверх
feodorv
Дата 15.10.2012, 22:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  15.10.2012,  22:57 Найти цитируемый пост)
модифицировать программу из предыдущего задания так, чтобы после заполнения 2х матриц пользователя спрашивали, желает ли он выполнить умножение или сложение матриц и выполнялась выбранная пльзователем операция. После этого программа должна осуществлять вывод исходных матриц, наименования операции и результата на экран

Ну тогда стОит разбить программу на такие блоки:
Код

цикл
  * вопрос о размерности
  * вопрос о заполнении матрицы (случайно, диагонально, с клавиатуры)
  * заполнение матриц в зависимости от выбора пользователя
  * вопрос об операции с матрицами (сложение, вычитание)
  * выполнение операций над матрицами в зависимости от выбора пользователя
  * печать матриц
  * печать операции и результата
в начало цикла


Цитата(dimmon123 @  15.10.2012,  22:57 Найти цитируемый пост)
в задании не указано как перемножать нужно

Значит, обычным для матриц способом - строка одной на столбец другой)))


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 15.10.2012, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



Цитата(feodorv @  15.10.2012,  22:32 Найти цитируемый пост)
Значит, обычным для матриц способом - строка одной на столбец другой)))

это как в коде выглядеть будет?напиши плиз пример))завтра сделаю 4 задание и выложу на проверку, останеться еще 2 задания тут))
PM MAIL   Вверх
feodorv
Дата 15.10.2012, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  15.10.2012,  23:39 Найти цитируемый пост)
это как в коде выглядеть будет?напиши плиз пример))

Так ведь уже писал:
Цитата(feodorv @  15.10.2012,  21:13 Найти цитируемый пост)
for( i=0; i<nl; i++)
   for( j=0; j<nc; j++)
   {
      res[i][j] = 0;
      for( k = 0; k < nc; k++) res[i][j] += mt1[i][k] * mt2[k][j];
   }


Цитата(dimmon123 @  15.10.2012,  23:39 Найти цитируемый пост)
завтра сделаю 4 задание и выложу на проверку

Ты бы их проверял, запуская программы и сравнивая результаты выполнения с тем, что должно было получиться. А то я только код оценить могу.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 16.10.2012, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



Цитата(feodorv @  15.10.2012,  23:02 Найти цитируемый пост)
Ты бы их проверял, запуская программы и сравнивая результаты выполнения с тем, что должно было получиться. А то я только код оценить могу.

ну вроде все работает, а лаба будет в следующий понедельник, преподу надо будет показать самое последнее задание))
PM MAIL   Вверх
dimmon123
Дата 16.10.2012, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



feodorv, вставил в код и умножение и сложение,проверь пожалуйтса))

Код

// ConsoleApplication7.cpp: определяет точку входа для консольного приложения.
//

#include "stdio.h"
#include "stdafx.h"
#include "windows.h"
#include "math.h"
#include "conio.h"
#include "stdlib.h"
#define n 20

 int i,j,k;
 int dim = 0;
 int mt1[n][n];
 int mt2[n][n];
 int summa[n][n];
 int mult[n][n];

 
void main()
{
  do {
         printf( "Please, enter matrix dimension:" );  scanf_s( "%d", &dim);
       if( dim <= 0 || dim > n ) 
          {
             printf( "Invalid value %d\n", dim);
              continue;
          }
          
        else
          {
             system ("cls");
             printf (" (1) - Aftozapolnenie\n (2) - Zapolnenie diagonali\n (3) - Vvod s klaviaturi\n \n Please select: ");
                
             char iSelect = _getch();
             switch (iSelect)
             {
             case '1': 
               system("cls");
               for(i=0;i<dim;i++)
                {
                        for(j=0;j<dim;j++)
                
                 {
                  mt1[i][j]=rand();
                  mt2[i][j]=rand();
                 }
                printf("\nResultat:\n");
               }
            
             {
               system ("cls");
               printf (" (1) -  Mult\n (2) - Summa\n \n Please select: ");
                 char iSelect1 = _getch();
                 switch (iSelect1)
               { 
                 case '1': 
                 system("cls");
                 for( i=0; i<dim; i++)
                    for( j=0; j<dim; j++)
                   
                        mult[i][j] = 0;
                     for( k = 0; k < dim; k++) 
                         mult[i][j] += mt1[i][k] * mt2[k][j];
                   for(i=0;i<dim;i++)
                    {
                        for(j=0;j<dim;j++)
                        {
                              printf(" %d",mult[i][j]);
                        }
                        putchar('\n');
                    }
                   _getch(); 
                
                 break;

                 case '2': 
                 system("cls");
                    for(i=0;i<dim;i++)
                   {
                        for(j=0;j<dim;j++)
                        {
                                summa[i][j]=mt1[i][j]+mt2[i][j];
                        }
                   }
                 for(i=0;i<dim;i++)
                  {
                        for(j=0;j<dim;j++)
                        {
                                printf(" %d",summa[i][j]);
                        }
                        putchar('\n');
                  }
                                                
               _getch(); 
               break;

               default: 
               printf ("\n\nBad select, try again"); 
               _getch();  

               break;
                                           
               _getch();
               }
            }                        
            case '2':
              system("cls");
              for(i=0;i<dim;i++)
                {
                  for(j=0;j<dim;j++)
                  if (i==j)
                    mt1[i][j]=1;
                  else
                    mt1[i][j]=0;
                }
               printf("\nResultat:\n");
                for(i=0;i<dim;i++)
                {
                        for(j=0;j<dim;j++)
                        {
                                summa[i][j]=mt1[i][j]+mt2[i][j];
                        }
                }
                for(i=0;i<dim;i++)
                {
                        for(j=0;j<dim;j++)
                        {
                                printf(" %d",summa[i][j]);
                        }
                        putchar('\n');
                }

              _getch(); 
              
            break;

                
            case '3':
              system("cls");
                printf("\nmt1:\n");
                 
                for(i=0;i<dim;i++)
                {
                        for(j=0;j<dim;j++)
                        {
                                printf("Element %d, %d:  ",i,j);
                                scanf_s(" %d",&mt1[i][j]);
                        }
                }
               
                printf("\nmt2:\n");
                for(i=0;i<dim;i++)
                {
                        for(j=0;j<dim;j++)
                        {
                                printf("Element %d, %d:  ",i,j);
                                scanf_s("%d",&mt2[i][j]);
                        }
                }
                printf("\nResultat:\n");
                 for(i=0;i<dim;i++)
                 {
                        for(j=0;j<dim;j++)
                        {
                                summa[i][j]=mt1[i][j]+mt2[i][j];
                        }
                 }
                 for(i=0;i<dim;i++)
                 {
                        for(j=0;j<dim;j++)
                        {
                                printf(" %d",summa[i][j]);
                        }
                        putchar('\n');
                 }

                 _getch(); 

                 break;
                
            default: 
            printf ("\n\nBad select, try again"); 
            _getch();  

            break;
                                           
        _getch();
        
        }
    }
  }
 while (true);




Это сообщение отредактировал(а) dimmon123 - 16.10.2012, 12:52
PM MAIL   Вверх
feodorv
Дата 16.10.2012, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  16.10.2012,  11:29 Найти цитируемый пост)
вставил в код и умножение и сложение,проверь пожалуйтса))

Смотри, смысла держать два массива для одного результата нет. Достаточно иметь один массив - res:
Код

 if( doMult ) res = mt1 * mt2; else res = mt1 + mt2;
 print( res );

Код условный, но смысл понятный. 

Потом, ты вставил умножение матриц только в заполнение_матрицы_1, а остальные два варианта остались не у дел. Поэтому нужно сначала заполнять матрицы, потом спрашивать, что с ними делать, потом с ними делать то, что запрошено. То есть заполнение - отдельно, операция - отдельно. Порядок действий уже описан:
Цитата(feodorv @  15.10.2012,  23:32 Найти цитируемый пост)
цикл
  * вопрос о размерности
  * вопрос о заполнении матрицы (случайно, диагонально, с клавиатуры)
  * заполнение матриц в зависимости от выбора пользователя
  * вопрос об операции с матрицами (сложение, вычитание)
  * выполнение операций над матрицами в зависимости от выбора пользователя
  * печать матриц
  * печать операции и результата
в начало цикла


Приблизительно это будет выглядеть так:
Код

#include <stdio.h>
#include <windows.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>

#define n 20

 int i,j,k;
 int dim = 0;
 int mt1[n][n];
 int mt2[n][n];
 int res[n][n];
 
void main()
{
   do 
   {
       /* вопрос о размерности */
       system ("cls");
       printf( "Please, enter matrix dimension:" );  
       scanf_s( "%d", &dim);
       if( dim <= 0 || dim > n ) 
       {
          printf( "Invalid value %d\n", dim);
          continue;
       }
 
       /* вопрос о заполнении матрицы (случайно, диагонально, с клавиатуры) */
       system ("cls");
       printf (" (1) - Aftozapolnenie\n (2) - Zapolnenie diagonali\n (3) - Vvod s klaviaturi\n (4) - exit\n\n Please select: ");
       char iSelect = _getch();
       if( iSelect == '4' ) break;

       /* заполнение матриц в зависимости от выбора пользователя */
       switch( iSelect )
       {
          case '1': 
             for( i=0; i<dim; i++)
                for( j=0; j<dim; j++)
                {
                   mt1[i][j]=rand();
                   mt2[i][j]=rand();
                 }
             break;

          case '2':
             for( i=0; i<dim; i++)
                for( j=0; j<dim; j++)
                {
                   mt1[i][j] = (i == j) ? 1 : 0;
                   mt2[i][j] = (i == j) ? i : 0;
                }
             break;
                
          case '3':
              printf("\nEnter mt1:\n");
              for( i=0; i<dim; i++)
                 for( j=0; j<dim; j++)
                 {
                    printf("  Element %d, %d:  ", i, j);
                    scanf_s(" %d", &mt1[i][j]);
                 }
             
              printf("\nEnter mt2:\n");
              for( i=0; i<dim; i++)
                 for( j=0; j<dim; j++)
                 {
                    printf("  Element %d, %d:  ", i, j);
                    scanf_s( "%d", &mt2[i][j]);
                 }
                 break;
                
          default: 
             printf ("\n\nBad select, try again\n\n"); 
             _getch();  
             continue;
      }

      /* вопрос об операции с матрицами (сложение, вычитание) */
      system ("cls");
      printf (" (1) -  Mult\n (2) - Summa\n \n Please select: ");
      iSelect = _getch();

      /* выполнение операций над матрицами в зависимости от выбора пользователя */
      switch( iSelect )
      { 
         case '1': 
            system("cls");
            for( i=0; i<dim; i++)
               for( j=0; j<dim; j++)
               {    
                   res[i][j] = 0;
                   for( k = 0; k<dim; k++)  res[i][j] += mt1[i][k] * mt2[k][j];
                }
            break;

         case '2': 
            for(i=0;i<dim;i++)
               for(j=0;j<dim;j++)
                  res[i][j] = mt1[i][j] + mt2[i][j];
            break;

         default: 
            printf ("\n\nBad select, try again"); 
            _getch();  
            continue;
      }

      /* печать матриц */
      system ("cls");

      printf("mt1:\n");
      for( i=0; i<dim ;i++)
         for( j=0; j<dim; j++)
            printf( " %d", mt1[i][j]);
      printf( "\n" );

      printf("mt2:\n");
      for( i=0; i<dim ;i++)
         for( j=0; j<dim; j++)
            printf( " %d", mt2[i][j]);
      printf( "\n" );

      /* печать операции и результата */
      printf( "Operation:\n %s\n", (iSelect == '1') ? "multiplication" : "addition");

      printf( "Result:\n" );
      for( i=0; i<dim ;i++)
         for( j=0; j<dim; j++)
            printf( " %d", res[i][j]);
      printf( "\n" );
      _getch();  

   }while (true);



Как-то так  smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 17.10.2012, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



feodorv, я почти позже похожее сделал, ток немного не до конца, но суть понял))вот только у тебя элементы матрицы в  строчку пишутся а не в столбик)я в столбик изменил, вот:
Код

// ConsoleApplication8.cpp: определяет точку входа для консольного приложения.
//

#include "stdio.h"
#include "stdafx.h"
#include "windows.h"
#include "math.h"
#include "conio.h"
#include "stdlib.h"

#define n 20

 int i,j,k;
 int dim = 0;
 int mt1[n][n];
 int mt2[n][n];
 int res[n][n];
 
void main()
{
   do 
   {
       /* вопрос о размерности */
       system ("cls");
       printf( "Please, enter matrix dimension:" );  
       scanf_s( "%d", &dim);
       if( dim <= 0 || dim > n ) 
       {
          printf( "Invalid value %d\n", dim);
          continue;
       }
 
       /* вопрос о заполнении матрицы (случайно, диагонально, с клавиатуры) */
       system ("cls");
       printf (" (1) - Aftozapolnenie\n (2) - Zapolnenie diagonali\n (3) - Vvod s klaviaturi\n (4) - exit\n\n Please select: ");
       char iSelect = _getch();
       if( iSelect == '4' ) break;

       /* заполнение матриц в зависимости от выбора пользователя */
       switch( iSelect )
       {
          case '1': 
             for( i=0; i<dim; i++)
                for( j=0; j<dim; j++)
                {
                   mt1[i][j]=rand();
                   mt2[i][j]=rand();
                 }
             break;

          case '2':
             for( i=0; i<dim; i++)
                for( j=0; j<dim; j++)
                {
                   if (i==j)
                    mt1[i][j]=1;
                  else
                    mt1[i][j]=0;
                   if (i==j)
                    mt2[i][j]=1;
                  else
                    mt2[i][j]=0;
                }
             break;
                
          case '3':
              printf("\nEnter mt1:\n");
              for( i=0; i<dim; i++)
                 for( j=0; j<dim; j++)
                 {
                    printf("  Element %d, %d:  ", i, j);
                    scanf_s(" %d", &mt1[i][j]);
                 }
             
              printf("\nEnter mt2:\n");
              for( i=0; i<dim; i++)
                 for( j=0; j<dim; j++)
                 {
                    printf("  Element %d, %d:  ", i, j);
                    scanf_s( "%d", &mt2[i][j]);
                 }
                 break;
                
          default: 
             printf ("\n\nBad select, try again\n\n"); 
             _getch();  
             continue;
      }

      /* вопрос об операции с матрицами (сложение, вычитание) */
      system ("cls");
      printf (" (1) -  Mult\n (2) - Summa\n \n Please select: ");
      iSelect = _getch();

      /* выполнение операций над матрицами в зависимости от выбора пользователя */
      switch( iSelect )
      { 
         case '1':             
            for( i=0; i<dim; i++)
               for( j=0; j<dim; j++)
               {    
                   //res[i][j] = 0;
                   for( k = 0; k<dim; k++)  res[i][j] += mt1[i][k] * mt2[k][j];
                }
            break;

         case '2': 
            for(i=0;i<dim;i++)
               for(j=0;j<dim;j++)
                  res[i][j] = mt1[i][j] + mt2[i][j];
            break;

         default: 
            printf ("\n\nBad select, try again"); 
            _getch();  
            continue;
      }

      /* печать матриц */
      system ("cls");

      printf("mt1:\n");
      for( i=0; i<dim ;i++)
      {
          for( j=0; j<dim; j++)
          {
            printf( " %d", mt1[i][j]);
          }
     putchar('\n');
      }

      printf("mt2:\n");
      for( i=0; i<dim ;i++)
      {
          for( j=0; j<dim; j++)
          {
            printf( " %d", mt2[i][j]);
          }
     putchar('\n');
      }

      /* печать операции и результата */
      printf( "Operation:\n %s\n", (iSelect == '1') ? "multiplication" : "addition");

      printf( "\nResult:\n" );
      for( i=0; i<dim ;i++)
      {
          for( j=0; j<dim; j++)
          {
              printf( " %d", res[i][j]);
          }
      putchar('\n');
      }
      _getch();  

   }while (true);
}

спасибо за советы!!!))осталось теперь выполнить последнее задание:  Модифицировать программу из предыдущего задания так, пользователь имел возможность при задании матриц редактировать любой элемент:пользователю задается вопрос, желает ли он редактировать матрицу. Если желает - пользователь вводит координаты редактируемого элемента и новое значение. Затем процедура повторяется. 

Это сообщение отредактировал(а) dimmon123 - 17.10.2012, 10:50
PM MAIL   Вверх
feodorv
Дата 17.10.2012, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  17.10.2012,  11:27 Найти цитируемый пост)
                   //res[i][j] = 0;

За что убита эта строчка?
Цитата(dimmon123 @  17.10.2012,  11:27 Найти цитируемый пост)
 int res[n][n];

У нас res объявлена глобально, поэтому эта матрица инициализируется нулями. А если бы мы написали так:
Код

void main()
{
   int res[n][n];
...

то в res был бы мусор. Никто не гарантирует, что Вас не попросят все объявления переменных перенести внутрь main, а если попросят, то будет сюрприз. Прошу вернуть строчку на место)))


Цитата(dimmon123 @  17.10.2012,  11:27 Найти цитируемый пост)
Модифицировать программу из предыдущего задания так, пользователь имел возможность при задании матриц редактировать любой элемент:пользователю задается вопрос, желает ли он редактировать матрицу. Если желает - пользователь вводит координаты редактируемого элемента и новое значение. Затем процедура повторяется. 

Ну что? Переставляем блоки?
Код

цикл
  * вопрос о размерности
  * вопрос о заполнении матрицы (случайно, диагонально, с клавиатуры)
  * заполнение матриц в зависимости от выбора пользователя
  цикл2
    * печать матриц
    * вопрос о редактировании матриц (1 - хочу редактировать mt1 2 - хочу редактировать mt2 3 - не хочу)
    * не хочу - уходим из цикла
    * вопрос об редактируемом элементе (координаты+значение)
    * меняем значение у mt1 или mt2
  в начало цикла 2
  * вопрос об операции с матрицами (сложение, вычитание)
  * выполнение операций над матрицами в зависимости от выбора пользователя
  * печать операции и результата
в начало цикла



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 19.10.2012, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



Цитата(feodorv @  17.10.2012,  14:36 Найти цитируемый пост)
то в res был бы мусор. Никто не гарантирует, что Вас не попросят все объявления переменных перенести внутрь main, а если попросят, то будет сюрприз. Прошу вернуть строчку на место)))

понял!вернул)))на выхах как сделаю Цикл2 скину на проверку)
PM MAIL   Вверх
dimmon123
Дата 20.10.2012, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



feodorv, после вопроса о редактировании матрицы что то код не срабатывает, посмотри что не так)

Код

// ConsoleApplication8.cpp: определяет точку входа для консольного приложения.
//

#include "stdio.h"
#include "stdafx.h"
#include "windows.h"
#include "math.h"
#include "conio.h"
#include "stdlib.h"
#define n 20

 int i,j,k;
 int dim = 0;
 int mt1[n][n];
 int mt2[n][n];
 int res[n][n];
 float A[20][20];
 
void main()
{
   do 
   {
       /* вопрос о размерности */
       system ("cls");
       printf( "Please, enter matrix dimension:" );  
       scanf_s( "%d", &dim);
       if( dim <= 0 || dim > n ) 
       {
          printf( "Invalid value %d\n", dim);
          continue;
       }
 
       /* вопрос о заполнении матрицы (случайно, диагонально, с клавиатуры) */
       system ("cls");
       printf (" (1) - Aftozapolnenie\n (2) - Zapolnenie diagonali\n (3) - Vvod s klaviaturi\n (4) - Exit\n\n Please select: ");
       char iSelect = _getch();
       if( iSelect == '4' ) break;

       /* заполнение матриц в зависимости от выбора пользователя */
       switch( iSelect )
       {
          case '1': 
             for( i=0; i<dim; i++)
                for( j=0; j<dim; j++)
                {
                   mt1[i][j]=rand();
                   mt2[i][j]=rand();
                 }
             break;

          case '2':
             for( i=0; i<dim; i++)
                for( j=0; j<dim; j++)
                {
                   if (i==j)
                    mt1[i][j]=1;
                  else
                    mt1[i][j]=0;
                   if (i==j)
                    mt2[i][j]=1;
                  else
                    mt2[i][j]=0;
                }
             break;
                
          case '3':
              printf("\nEnter mt1:\n");
              for( i=0; i<dim; i++)
                 for( j=0; j<dim; j++)
                 {
                    printf("  Element %d, %d:  ", i, j);
                    scanf_s(" %d", &mt1[i][j]);
                 }
             
              printf("\nEnter mt2:\n");
              for( i=0; i<dim; i++)
                 for( j=0; j<dim; j++)
                 {
                    printf("  Element %d, %d:  ", i, j);
                    scanf_s( "%d", &mt2[i][j]);
                 }
                 break;
                
          default: 
             printf ("\n\nBad select, try again\n\n"); 
             _getch();  
             continue;
        }
 do 
   {
         /* печать матриц */
      system ("cls");
      printf("mt1:\n");
      for( i=0; i<dim ;i++)
      {
          for( j=0; j<dim; j++)
          {
            printf( " \t%d", mt1[i][j]);
          }
     putchar('\n');
      }

      printf("mt2:\n");
      for( i=0; i<dim ;i++)
      {
          for( j=0; j<dim; j++)
          {
            printf( " \t%d", mt2[i][j]);
          }
     putchar('\n');
      }

      /* вопрос о редактировании матриц (хочу редактировать mt1, хочу редактировать mt2, не хочу редактировать) */
       system ("cls");
       printf (" (1) - Redaction mt1\n (2) - Redaction mt2\n (3) - Exit\n\n Please select: ");
       char iSelect = _getch();
       if( iSelect == '3' ) break;

      /* вопрос об редактируемом элементе (координаты+значение) */
       system ("cls");
       printf (" Enter x,y in [x,y] format: ");
       
      /* меняем значение у mt1 или mt2 */
       int i = 0, j = 0;
       float tmp = 0.0;
       scanf_s (" %i, %j", &i, &j);
       printf (" Value [%i, %j] is: %f", i, j, A[i][j]); 
       printf (" New value: ");
       scanf_s ("%f", &tmp);
       A[i][j] = tmp;

   }while (true);

      /* вопрос об операции с матрицами (сложение, вычитание) */
      system ("cls");
      printf (" (1) -  Mult\n (2) - Summa\n \n Please select: ");
      iSelect = _getch();

      /* выполнение операций над матрицами в зависимости от выбора пользователя */
      switch( iSelect )
      { 
         case '1':             
            for( i=0; i<dim; i++)
               for( j=0; j<dim; j++)
               {    
                   res[i][j] = 0;
                   for( k = 0; k<dim; k++)  res[i][j] += mt1[i][k] * mt2[k][j];
                }
            break;

         case '2': 
            for(i=0;i<dim;i++)
               for(j=0;j<dim;j++)
                  res[i][j] = mt1[i][j] + mt2[i][j];
            break;

         default: 
            printf ("\n\nBad select, try again"); 
            _getch();  
            continue;
      }

      /* печать операции и результата */
      printf( "Operation:\n %s\n", (iSelect == '1') ? "multiplication" : "addition");

      printf( "\nResult:\n" );
      for( i=0; i<dim ;i++)
      {
          for( j=0; j<dim; j++)
          {
              printf( " \t%d", res[i][j]);
          }
      putchar('\n');
      }
      _getch();  

   }while (true);
}

PM MAIL   Вверх
feodorv
Дата 20.10.2012, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  20.10.2012,  18:00 Найти цитируемый пост)
 float A[20][20];

А что это за новая сущность? Каким боком она нам нужна?

Если вопрос во флоатах, то можно просто поменять типы у матриц mt1, mt2 и res, а также заменить %d на %f. Но про float A[20][20] я ничего не знаю...


Цитата(dimmon123 @  20.10.2012,  18:00 Найти цитируемый пост)
       A[i][j] = tmp;

просто замени на 
Код

if( iSelect == '1' ) mt1[i][j] = tmp; else mt2[i][j] = tmp;


PS Но смотри, у тебя матрицы заточены под int, а ты float теперь захотел)))

Это сообщение отредактировал(а) feodorv - 20.10.2012, 18:21


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 21.10.2012, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



Цитата(feodorv @  20.10.2012,  18:21 Найти цитируемый пост)
PS Но смотри, у тебя матрицы заточены под int, а ты float теперь захотел)))

вот измненил, но код на изменение элементов матрцы не хочет срабатывать((
посмотри пожалуйста что не так я сдела...
Код

// ConsoleApplication8.cpp: определяет точку входа для консольного приложения.
//

#include "stdio.h"
#include "stdafx.h"
#include "windows.h"
#include "math.h"
#include "conio.h"
#include "stdlib.h"
#define n 20

 int i,j,k;
 int dim = 0;
 int mt1[n][n];
 int mt2[n][n];
 int res[n][n];
 int tmp = 0;
 
 
void main()
{
   do 
   {
       /* вопрос о размерности */
       system ("cls");
       printf( "Please, enter matrix dimension:" );  
       scanf_s( "%d", &dim);
       if( dim <= 0 || dim > n ) 
       {
          printf( "Invalid value %d\n", dim);
          continue;
       }
 
       /* вопрос о заполнении матрицы (случайно, диагонально, с клавиатуры) */
       system ("cls");
       printf (" (1) - Aftozapolnenie\n (2) - Zapolnenie diagonali\n (3) - Vvod s klaviaturi\n (4) - Exit\n\n Please select: ");
       char iSelect = _getch();
       if( iSelect == '4' ) break;

       /* заполнение матриц в зависимости от выбора пользователя */
       switch( iSelect )
       {
          case '1': 
             for( i=0; i<dim; i++)
                for( j=0; j<dim; j++)
                {
                   mt1[i][j]=rand();
                   mt2[i][j]=rand();
                 }
             break;

          case '2':
             for( i=0; i<dim; i++)
                for( j=0; j<dim; j++)
                {
                   if (i==j)
                    mt1[i][j]=1;
                  else
                    mt1[i][j]=0;
                   if (i==j)
                    mt2[i][j]=1;
                  else
                    mt2[i][j]=0;
                }
             break;
                
          case '3':
              printf("\nEnter mt1:\n");
              for( i=0; i<dim; i++)
                 for( j=0; j<dim; j++)
                 {
                    printf("  Element %d, %d:  ", i, j);
                    scanf_s(" %d", &mt1[i][j]);
                 }
             
              printf("\nEnter mt2:\n");
              for( i=0; i<dim; i++)
                 for( j=0; j<dim; j++)
                 {
                    printf("  Element %d, %d:  ", i, j);
                    scanf_s( "%d", &mt2[i][j]);
                 }
                 break;
                
          default: 
             printf ("\n\nBad select, try again\n\n"); 
             _getch();  
             continue;
        }
    
    do 
      {
         /* печать матриц */
         system ("cls");
         printf("mt1:\n");
         for( i=0; i<dim ;i++)
         {
             for( j=0; j<dim; j++)
             {
               printf( " \t%d", mt1[i][j]);
             }
         putchar('\n');
         }

         printf("mt2:\n");
         for( i=0; i<dim ;i++)
         {
             for( j=0; j<dim; j++)
             {
               printf( " \t%d", mt2[i][j]);
             }
         putchar('\n');
         }
         _getch();  
             
         /* вопрос о редактировании матриц (хочу редактировать mt1, хочу редактировать mt2, не хочу редактировать) */
     
         system ("cls");
         printf (" (1) - Redaction mt1\n (2) - Redaction mt2\n (3) - Exit\n\n Please select: ");
         char iSelect = _getch();
         if( iSelect == '3' ) break;
         
         /* вопрос об редактируемом элементе (координаты+значение) */
         system ("cls");
         printf (" Enter x,y in [x,y] format: ");
       
         /* меняем значение у mt1 или mt2 */
         if( iSelect == '1' ) mt1[i][j] = tmp; 
         else mt2[i][j] = tmp;
         int i = 0, j = 0;
         scanf_s (" %i, %j", &i, &j);
         printf (" Value [%i, %j] is: %d, %d", i, j); 
         printf (" New value: ");
         scanf_s ("%d", &tmp);
         

     }while (true);

        /* вопрос об операции с матрицами (сложение, вычитание) */
        system ("cls");
        printf (" (1) -  Mult\n (2) - Summa\n \n Please select: ");
        iSelect = _getch();

        /* выполнение операций над матрицами в зависимости от выбора пользователя */
       switch( iSelect )
        { 
         case '1':             
            for( i=0; i<dim; i++)
               for( j=0; j<dim; j++)
               {    
                   res[i][j] = 0;
                   for( k = 0; k<dim; k++)  res[i][j] += mt1[i][k] * mt2[k][j];
                }
            break;

         case '2': 
            for(i=0;i<dim;i++)
               for(j=0;j<dim;j++)
                  res[i][j] = mt1[i][j] + mt2[i][j];
            break;

         default: 
            printf ("\n\nBad select, try again"); 
            _getch();  
            continue;
        }

        /* печать операции и результата */
        printf( "Operation:\n %s\n", (iSelect == '1') ? "Multiplication" : "Addition");

        printf( "\nResult:\n" );
        for( i=0; i<dim ;i++)
        {
            for( j=0; j<dim; j++)
            {
                printf( " \t%d", res[i][j]);
            }
        putchar('\n');
        }
        _getch();  

   }while (true);
}


Это сообщение отредактировал(а) dimmon123 - 21.10.2012, 14:32
PM MAIL   Вверх
feodorv
Дата 21.10.2012, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  21.10.2012,  01:38 Найти цитируемый пост)
         if( iSelect == '1' ) mt1[i][j] = tmp; 
         else mt2[i][j] = tmp;
         int i = 0, j = 0;
         scanf_s (" %i, %j", &i, &j);
         printf (" Value [%i, %j] is: %d, %d", i, j); 
         printf (" New value: ");
         scanf_s ("%d", &tmp);

Так эта... Сначала узнаём что на что меняем, и уж потом меняем, а не сначала меняем, потом узнаём  smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 21.10.2012, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



Цитата(feodorv @  21.10.2012,  16:04 Найти цитируемый пост)
Так эта... Сначала узнаём что на что меняем, и уж потом меняем, а не сначала меняем, потом узнаём   

чет не понял где поменять надо, менял в разных местах бесполезно((

Код

   
        /* вопрос об редактируемом элементе (координаты+значение) */
         system ("cls");
         int i = 0, j = 0;
         printf (" Enter x,y in [x,y] format: ");
         scanf_s (" %i, %j", &i, &j);

         /* меняем значение у mt1 или mt2 */
         if( iSelect == '1' ) mt1[i][j] = tmp; 
         else mt2[i][j] = tmp;
         
         printf (" Value [%i, %j] is: %d, %d", i, j);
         
         printf (" New value: ");
         scanf_s ("%d", &tmp);
         


Это сообщение отредактировал(а) dimmon123 - 21.10.2012, 18:44
PM MAIL   Вверх
feodorv
Дата 21.10.2012, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  21.10.2012,  19:18 Найти цитируемый пост)
чет не понял где поменять надо, менял в разных местах бесполезно((

Ну, я думаю, нужно менять со смыслом, а не в хаотическом порядке)))

Что делает строка
Цитата(dimmon123 @  21.10.2012,  19:18 Найти цитируемый пост)
         scanf_s ("%d", &tmp);

Почему она самая последняя? Это вместо printf?

printf - печатает, scanf считывает smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 21.10.2012, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



feodorv, а как тогда надо написать?не догоняю я блин...это последнее задание осталось, а азавтра уже сдавать надо..

Это сообщение отредактировал(а) dimmon123 - 21.10.2012, 19:31
PM MAIL   Вверх
feodorv
Дата 21.10.2012, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  21.10.2012,  20:31 Найти цитируемый пост)
а как тогда надо написать?не догоняю я блин...

А я было подумал, что ты понимаешь, что делаешь  smile 

Цитата(feodorv @  21.10.2012,  17:04 Найти цитируемый пост)
         if( iSelect == '1' ) mt1[i][j] = tmp; 
         else mt2[i][j] = tmp;
         int i = 0, j = 0;
         scanf_s (" %i, %j", &i, &j);
         printf (" Value [%i, %j] is: %d, %d", i, j); 
         printf (" New value: ");
         scanf_s ("%d", &tmp);

Ну, наверное, первые две строчки поставить последними:
Код

         int i = 0, j = 0;
         scanf_s (" %i, %j", &i, &j);
         printf (" Value [%i, %j] is: %d, %d", i, j); 
         printf (" New value: ");
         scanf_s ("%d", &tmp);

         if( iSelect == '1' ) mt1[i][j] = tmp; else mt2[i][j] = tmp;





--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 21.10.2012, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



Цитата(feodorv @  21.10.2012,  20:04 Найти цитируемый пост)
А я было подумал, что ты понимаешь, что делаешь   

что то понимаю что то нет, вот и возникают вопросов куча))

сделал как ты сказал, перенес в конеч и все равно не выходит(

Добавлено через 14 минут и 14 секунд
вот сделал так:
Код

 /* вопрос об редактируемом элементе (координаты+значение) */
         system ("cls");
         printf (" Enter x,y in [x,y] format: ");
       
         /* меняем значение у mt1 или mt2 */
         int i = 0, j = 0;
         scanf_s (" %i, %j", &i, &j);
         printf (" Value [%i, %j] is: %d, %d", i, j); 
         printf (" New value: ");
         scanf_s ("%d", &tmp);
         if( iSelect == '1' ) mt1[i][j] = tmp; 
         else mt2[i][j] = tmp;



эффекта ноль, как было так и осталось

Это сообщение отредактировал(а) dimmon123 - 21.10.2012, 20:16
PM MAIL   Вверх
dimmon123
Дата 21.10.2012, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



feodorv, а дургие варианты могут быть?
PM MAIL   Вверх
feodorv
Дата 21.10.2012, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  21.10.2012,  21:41 Найти цитируемый пост)
feodorv, а дургие варианты могут быть? 

В смысле? Давайте переставлять строчки, авось получится???)))

Цитата(dimmon123 @  21.10.2012,  21:09 Найти цитируемый пост)
 /* вопрос об редактируемом элементе (координаты+значение) */
         system ("cls");
         printf (" Enter x,y in [x,y] format: ");
       
         /* меняем значение у mt1 или mt2 */
         int i = 0, j = 0;
         scanf_s (" %i, %j", &i, &j);
         printf (" Value [%i, %j] is: %d, %d", i, j,res); // <-- в самый конец
         printf (" New value: ");
         scanf_s ("%d", &tmp);
         if( iSelect == '1' ) mt1[i][j] = tmp; 
         else mt2[i][j] = tmp;

Вот откуда взялся спецификатор %j??? Должен быть просто %i.

Это сообщение отредактировал(а) feodorv - 21.10.2012, 22:28


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 21.10.2012, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



Цитата(feodorv @  21.10.2012,  22:25 Найти цитируемый пост)
Вот откуда взялся спецификатор %j???

там надо поставить %i?
PM MAIL   Вверх
feodorv
Дата 21.10.2012, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  21.10.2012,  23:28 Найти цитируемый пост)
там надо поставить %i? 

По хорошему, должно стоять %d (d - от decimal), %i - это устаревший спецификатор (от integer).

Лучше всего, всё-таки, изучить семейство функций printf и правила оформления форматной строки, загляните хотя бы сюда.


Это сообщение отредактировал(а) feodorv - 21.10.2012, 22:35


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 21.10.2012, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



feodorv, у нас же везде было i  и j. мы их в самом начаде вводили
Код

// Лаба3.cpp: определяет точку входа для консольного приложения.
//

#include "stdio.h"
#include "stdafx.h"
#include "windows.h"
#include "math.h"
#include "conio.h"
#include "stdlib.h"
#define n 20

 int i,j,k;
 int dim = 0;
 int mt1[n][n];
 int mt2[n][n];
 int res[n][n];
 int tmp = 0;
 
 
void main()
{
   do 
   {
       /* вопрос о размерности */
       system ("cls");
       printf( "Please, enter matrix dimension:" );  
       scanf_s( "%d", &dim);
       if( dim <= 0 || dim > n ) 
       {
          printf( "Invalid value %d\n", dim);
          continue;
       }
 
       /* вопрос о заполнении матрицы (случайно, диагонально, с клавиатуры) */
       system ("cls");
       printf (" (1) - Aftozapolnenie\n (2) - Zapolnenie diagonali\n (3) - Vvod s klaviaturi\n (4) - Exit\n\n Please select: ");
       char iSelect = _getch();
       if( iSelect == '4' ) break;

       /* заполнение матриц в зависимости от выбора пользователя */
       switch( iSelect )
       {
          case '1': 
             for( i=0; i<dim; i++)
                for( j=0; j<dim; j++)
                {
                   mt1[i][j]=rand();
                   mt2[i][j]=rand();
                 }
             break;

          case '2':
             for( i=0; i<dim; i++)
                for( j=0; j<dim; j++)
                {
                   if (i==j)
                    mt1[i][j]=1;
                  else
                    mt1[i][j]=0;
                   if (i==j)
                    mt2[i][j]=1;
                  else
                    mt2[i][j]=0;
                }
             break;
                
          case '3':
              printf("\nEnter mt1:\n");
              for( i=0; i<dim; i++)
                 for( j=0; j<dim; j++)
                 {
                    printf("  Element %d, %d:  ", i, j);
                    scanf_s(" %d", &mt1[i][j]);
                 }
             
              printf("\nEnter mt2:\n");
              for( i=0; i<dim; i++)
                 for( j=0; j<dim; j++)
                 {
                    printf("  Element %d, %d:  ", i, j);
                    scanf_s( "%d", &mt2[i][j]);
                 }
                 break;
                
          default: 
             printf ("\n\nBad select, try again\n\n"); 
             _getch();  
             continue;
        }
    
    do 
      {
         /* печать матриц */
         system ("cls");
         printf("mt1:\n");
         for( i=0; i<dim ;i++)
         {
             for( j=0; j<dim; j++)
             {
               printf( " \t%d", mt1[i][j]);
             }
         putchar('\n');
         }

         printf("mt2:\n");
         for( i=0; i<dim ;i++)
         {
             for( j=0; j<dim; j++)
             {
               printf( " \t%d", mt2[i][j]);
             }
         putchar('\n');
         }
         _getch();  
             
         /* вопрос о редактировании матриц (хочу редактировать mt1, хочу редактировать mt2, не хочу редактировать) */
         system ("cls");
         printf (" (1) - Redaction mt1\n (2) - Redaction mt2\n (3) - Exit\n\n Please select: ");
         char iSelect = _getch();
         if( iSelect == '3' ) break;
         
         /* вопрос об редактируемом элементе (координаты+значение) */
         system ("cls");
         printf (" Enter x,y in [x,y] format: ");
       
         /* меняем значение у mt1 или mt2 */
         int i = 0, j = 0;
         scanf_s (" %i, %j", &i, &j);
         
         printf (" New value: ");
         scanf_s ("%d", &tmp);
         if( iSelect == '1' ) mt1[i][j] = tmp; 
         else mt2[i][j] = tmp;
         printf (" Value [%i, %j] is: %d, %d", i, j, res);
         _getch();

     }while (true);

        /* вопрос об операции с матрицами (сложение, вычитание) */
        system ("cls");
        printf (" (1) -  Mult\n (2) - Summa\n \n Please select: ");
        iSelect = _getch();

        /* выполнение операций над матрицами в зависимости от выбора пользователя */
       switch( iSelect )
        { 
         case '1':             
            for( i=0; i<dim; i++)
               for( j=0; j<dim; j++)
               {    
                   res[i][j] = 0;
                   for( k = 0; k<dim; k++)  res[i][j] += mt1[i][k] * mt2[k][j];
                }
            break;

         case '2': 
            for(i=0;i<dim;i++)
               for(j=0;j<dim;j++)
                  res[i][j] = mt1[i][j] + mt2[i][j];
            break;

         default: 
            printf ("\n\nBad select, try again"); 
            _getch();  
            continue;
        }

        /* печать операции и результата */
        printf( "Operation:\n %s\n", (iSelect == '1') ? "Multiplication" : "Addition");

        printf( "\nResult:\n" );
        for( i=0; i<dim ;i++)
        {
            for( j=0; j<dim; j++)
            {
                printf( " \t%d", res[i][j]);
            }
        putchar('\n');
        }
        _getch();  

   }while (true);
}


Это сообщение отредактировал(а) dimmon123 - 21.10.2012, 22:49
PM MAIL   Вверх
dimmon123
Дата 21.10.2012, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



feodorv, а сам вопрос о координатах редактируемого элемента прально записан?
Код

 /* вопрос об редактируемом элементе (координаты+значение) */
         system ("cls");
         printf (" Enter x,y in [x,y] format: ");


если да, то с клавы в ответ надо вводить значение например "[0,1]"?
PM MAIL   Вверх
feodorv
Дата 21.10.2012, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  22.10.2012,  00:08 Найти цитируемый пост)
с клавы в ответ надо вводить значение например "[0,1]"?

Нет, а так как запрограммировано:
Цитата(dimmon123 @  21.10.2012,  23:48 Найти цитируемый пост)
        scanf_s (" %d, %d", &i, &j);

то есть так:
Код

0,1


Добавлено через 2 минуты и 6 секунд
Почему %j остался???

Добавлено через 5 минут и 12 секунд
Цитата(dimmon123 @  21.10.2012,  23:48 Найти цитируемый пост)
feodorv, у нас же везде было i  и j. мы их в самом начаде вводили

А причём здесь %i, %j и i,j? Как они друг с другом связаны? Потому что где-то есть &i, &j, и захотелось аналогично сделать?

Это сообщение отредактировал(а) feodorv - 21.10.2012, 23:42


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 22.10.2012, 13:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



feodorv, с помощью твоих подсказок  и немного домыслив, получилось все!!!вот исправил ту часть кода, теперь все работает))

Код

/* вопрос об редактируемом элементе (координаты+значение) */
         system ("cls");
         printf (" Enter x,y in [x,y] format: ");
       
         /* меняем значение у mt1 или mt2 */
         int i = 0, j = 0;
         scanf_s ("%d, %d", &i, &j);
         
         printf (" New value: ");
         int tmp = 0;
         scanf_s ("%d", &tmp);
         if( iSelect == '1' ) { mt1[i][j] = tmp; printf (" Value [%d, %d] is: %d", i, j, mt1[i][j]);}
         else { mt2[i][j] = tmp; printf (" Value [%d, %d] is: %d", i, j, mt2[i][j]);}
         
         _getch();


Это сообщение отредактировал(а) dimmon123 - 22.10.2012, 14:13
PM MAIL   Вверх
dimmon123
Дата 22.10.2012, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



feodorv,препод зверствует. как сделать ограничение на вод только цифр в Case3?

PM MAIL   Вверх
feodorv
Дата 22.10.2012, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  22.10.2012,  19:12 Найти цитируемый пост)
feodorv,препод зверствует. как сделать ограничение на вод только цифр в Case3?

Не понял, в каком месте?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 22.10.2012, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



feodorv, у нас во всем коде где есть запросы мы вводим цыфры, если вместо них ввести буквы то  программа глючит, поэтому надо везде где можно поставить ограничение на ввод букв...
PM MAIL   Вверх
feodorv
Дата 22.10.2012, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



ок. Подпрограммы разрешены?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 22.10.2012, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



Цитата(feodorv @  22.10.2012,  18:39 Найти цитируемый пост)
ок. Подпрограммы разрешены? 

ограничений никаких нет, надо чтоб при вводе букв писал ошибку и требовал ввести цифры)))
PM MAIL   Вверх
feodorv
Дата 22.10.2012, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Тупое решение:
Код
int getNumber( const char *header )
{
  char line[128], *ptr;
  int number = 0;

  do
  {
    int i, error = 0;

    if( header != NULL ) printf( "%s: ", header);
    if( fgets( line, sizeof(line), stdin) == NULL ) return 0;

    for( i = 0; line[i] != '\n' && line[i] != '\0'; i++)
      if( !(line[i] >= '0' && line[1] <= '9') )
      {
        error = 1;
        break;
      }

    if( i != 0 && !error ) return (int) strtol( line, NULL, 10);
    printf( "Invalid value: %s\n", line);
  } while( 1 );
}

Только для ввода положительных значений!!!


И вместо scanf пользуем getNumber:
Код
       /* вопрос о размерности */
       system ("cls");
       dim = getNumber( "Please, enter matrix dimension" );
       if( dim <= 0 || dim > n )
       {
          printf( "Invalid value %d\n", dim);
          continue;
       }

Остальное - аналогично...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 22.10.2012, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



feodorv, не проглатывает код то что ты написал,ошибки выдает..
PM MAIL   Вверх
feodorv
Дата 22.10.2012, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  22.10.2012,  21:38 Найти цитируемый пост)
feodorv, не проглатывает код то что ты написал,ошибки выдает.. 

Какие именно ошибки? У меня всё проглотилось...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 22.10.2012, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



feodorv
Код

int getNumber( const char *header )
{
  char line[128], *ptr;
  int number = 0;

  do
  {
    int i, error = 0;

    if( header != NULL ) printf( "%s: ", header);
    if( fgets( line, sizeof(line), stdin) == NULL ) return 0;

    for( i = 0; line[i] != '\n' && line[i] != '\0'; i++)
      if( !(line[i] >= '0' && line[1] <= '9') )
      {
        error = 1;
        break;
      }

    if( i != 0 && !error ) return (int) strtol( line, NULL, 10);
    printf( "Invalid value: %s\n", line);
  } while( 1 );


эту часть в какое место вставляем?
у меня код начинается вот так:
Код

int i,j,k;
 int dim = 0;
 int mt1[n][n];
 int mt2[n][n];
 int res[n][n];
 int tmp = 0;
 
 
void main()
{
   do 
   {
       /* вопрос о размерности */
       system ("cls");
       printf( "Please, enter matrix dimension:" );  
       scanf_s( "%d", &dim);
       if( dim <= 0 || dim > n ) 
       {
          printf( "Invalid value %d\n", dim);
          continue;
       }
 
       /* вопрос о заполнении матрицы (случайно, диагонально, с клавиатуры) */
       system ("cls");
       printf (" (1) - Aftozapolnenie\n (2) - Zapolnenie diagonali\n (3) - Vvod s klaviaturi\n (4) - Exit\n\n Please select: ");
       char iSelect = _getch();
       if( iSelect == '4' ) break;



Это сообщение отредактировал(а) dimmon123 - 22.10.2012, 22:21
PM MAIL   Вверх
feodorv
Дата 22.10.2012, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  22.10.2012,  23:20 Найти цитируемый пост)
эту часть в какое место вставляем?

Перед main() smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 22.10.2012, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



feodorv, в этом коде выдает вот эту ошику: ptr: неиспользованная локальная переменная

Код

#include "stdio.h"
#include "stdafx.h"
#include "windows.h"
#include "math.h"
#include "conio.h"
#include "stdlib.h"
#define n 20

 int i,j,k;
 int dim = 0;
 int mt1[n][n];
 int mt2[n][n];
 int res[n][n];
 int tmp = 0;
 
 int getNumber( const char *header )
{
  char line[128], *ptr;
  int number = 0;

  do
  {
    int i, error = 0;

    if( header != NULL ) printf( "%s: ", header);
    if( fgets( line, sizeof(line), stdin) == NULL ) return 0;

    for( i = 0; line[i] != '\n' && line[i] != '\0'; i++)
      if( !(line[i] >= '0' && line[1] <= '9') )
      {
        error = 1;
        break;
      }

    if( i != 0 && !error ) return (int) strtol( line, NULL, 10);
    printf( "Invalid value: %s\n", line);
  } while( 1 );
}
 
void main()
{
   do 
   {
       /* вопрос о размерности */
       system ("cls");
        dim = getNumber( "Please, enter matrix dimension:" );  
       scanf_s( "%d", &dim);
       if( dim <= 0 || dim > n ) 
       {
          printf( "Invalid value %d\n", dim);
          continue;
       }
 
       /* вопрос о заполнении матрицы (случайно, диагонально, с клавиатуры) */
       system ("cls");
       printf (" (1) - Aftozapolnenie\n (2) - Zapolnenie diagonali\n (3) - Vvod s klaviaturi\n (4) - Exit\n\n Please select: ");
       char iSelect = _getch();
       if( iSelect == '4' ) break;


Добавлено @ 22:39
feodorv, сдела))у тебя ошибка была в коде))
Код

if( !(line[i] >= '0' && line[1] <= '9') )

второй лайн стоит у тебя 1 а не i)заменил и все заработало и на введение букв выдает ошибку, вот только если потом ввести цыфру ничего дальше не происходит, код дальше не считывается почему то

Это сообщение отредактировал(а) dimmon123 - 22.10.2012, 22:41
PM MAIL   Вверх
feodorv
Дата 22.10.2012, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  22.10.2012,  23:34 Найти цитируемый пост)
в этом коде выдает вот эту ошику: ptr: неиспользованная локальная переменная

Это не ошибка. ptr можно убрать smile 

Цитата(dimmon123 @  22.10.2012,  23:34 Найти цитируемый пост)
второй лайн стоит у тебя 1 а не i)

А это ошибка)))


Цитата(dimmon123 @  22.10.2012,  23:34 Найти цитируемый пост)
вот только если потом ввести цыфру ничего дальше не происходит, код дальше не считывается почему то

В смысле? Если в строке встретился неправильный символ, ввод значения придётся повторить ;)
Строка вводится завершающим ENTER)))


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 22.10.2012, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



feodorv, раньше было "Please, enter matrix dimension:" с ордним двоеточием, а щас после этой фразы почему то 2 двоеточия и с первого раза Enter не срабатывает
PM MAIL   Вверх
feodorv
Дата 22.10.2012, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  23.10.2012,  00:19 Найти цитируемый пост)
после этой фразы почему то 2 двоеточия

Цитата(dimmon123 @  22.10.2012,  23:34 Найти цитируемый пост)
    if( header != NULL ) printf( "%s: ", header);

Цитата(dimmon123 @  22.10.2012,  23:34 Найти цитируемый пост)
        dim = getNumber( "Please, enter matrix dimension:" );  

Где-то одну ':' надо убирать. Я в примере убрал с "Please..."

Цитата(dimmon123 @  23.10.2012,  00:19 Найти цитируемый пост)
первого раза Enter не срабатывает 

Это как?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dimmon123
Дата 22.10.2012, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



Цитата(feodorv @  22.10.2012,  23:23 Найти цитируемый пост)
Это как?

ну например вводим мы не буквы а число 2, появляется снова плавающая _ и приходится еще раз 2 ввести, тогда выскакивает следующее действие


и почему то в коде где автозаполнение все время заполняются одни и теже цыфры

Это сообщение отредактировал(а) dimmon123 - 22.10.2012, 23:30
PM MAIL   Вверх
feodorv
Дата 23.10.2012, 00:46 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  23.10.2012,  00:26 Найти цитируемый пост)
ну например вводим мы не буквы а число 2, появляется снова плавающая _ и приходится еще раз 2 ввести, тогда выскакивает следующее действие

Ну я же сказал - вместо scanf, а не вместе с ней. Это
Цитата(dimmon123 @  22.10.2012,  23:34 Найти цитируемый пост)
       scanf_s( "%d", &dim);

теперь лишнее...


Твой препод - маньяк. Вот тебе ещё один вариант с редактированием (возможен BACKSPACE):
Код

int getNumberEx( const char *header )
{
  char line[16];
  int i = 0, len = 0;

  if( header != NULL ) printf( "%s: \n", header); else printf( "\n" ); // <- это важно!

  for( i = 0; i < sizeof(line); i++) line[i] = ' ';
  line[sizeof(line)-1] = '\0';

  while( 1 )
  {
    int c = _getch();
    if( (len > 0 && c >= '0' && c <= '9') ||
        (len == 0 && c >= '1' && c <= '9') ||
        (len == 0 && c == '-') )
    {
      if( len < sizeof(line)-1 )
      {
        _putch( c );
        line[len++] = c;
      }
    }
    else if( c == 8 && len > 0 )
    {
      len--;
      line[len] = ' ';
      _putch( '\r' );
      _cputs( line );
      line[len] = '\0';
      _putch( '\r' );
      _cputs( line );
      line[len] = ' ';
    }
    else if( c == 3 )
      exit( 0 );
    else if( c == '\r' && len > 0 )
    {
      line[len] = '\0';
      _putch( '\n' );
      return (int) strtol( line, NULL, 10);
    }
  }
}



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
ansar0
Дата 23.10.2012, 16:58 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 23.10.2012

Репутация: нет
Всего: нет



Сообщение от PodOnoK 
прямоугольный массив
Код C#
1
2
3
4
5
int[,] a;
//или так
int[,] b = new int[2, 3];
//или так
int[,] c = {{1, 2, 3}, {4, 5, 6}};
 Сообщение от PodOnoK 
ступенчатый массив
Код C#
1
2
3
4
5
6
int[][] a = new int[3][];
a[0] = new int[5];
a[1] = new int[3];
a[2] = new int[4];
//или так
int[][] b = {new int[5], new int[3], new int[4]};

PM MAIL WWW   Вверх
dimmon123
Дата 26.10.2012, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.10.2012

Репутация: нет
Всего: нет



feodorv, ставлю  dim = getNumberEx в местах где нужен ток ввод цифр и ерунда получается..либо прога сама у меня глючит..в общем проверь пожалуйста этот код полностью))
Код

// ConsoleApplication8.cpp: определяет точку входа для консольного приложения.
//

#include "stdio.h"
#include "stdafx.h"
#include "windows.h"
#include "math.h"
#include "conio.h"
#include "stdlib.h"
#define n 20

 int i,j,k;
 int dim = 0;
 int mt1[n][n];
 int mt2[n][n];
 int res[n][n];
 int tmp = 0;
 
 int getNumberEx( const char *header )
{
  char line[16];
  int i = 0, len = 0;

  if( header != NULL ) printf( "%s: \n", header); else printf( "\n" ); // <- это важно!

  for( i = 0; i < sizeof(line); i++) line[i] = ' ';
  line[sizeof(line)-1] = '\0';

  while( 1 )
  {
    int c = _getch();
    if( (len > 0 && c >= '0' && c <= '9') ||
        (len == 0 && c >= '1' && c <= '9') ||
        (len == 0 && c == '-') )
    {
      if( len < sizeof(line)-1 )
      {
        _putch( c );
        line[len++] = c;
      }
    }
    else if( c == 8 && len > 0 )
    {
      len--;
      line[len] = ' ';
      _putch( '\r' );
      _cputs( line );
      line[len] = '\0';
      _putch( '\r' );
      _cputs( line );
      line[len] = ' ';
    }
    else if( c == 3 )
      exit( 0 );
    else if( c == '\r' && len > 0 )
    {
      line[len] = '\0';
      _putch( '\n' );
      return (int) strtol( line, NULL, 10);
    }
  }
}
 
void main()
{
   do 
   {
       /* вопрос о размерности */
       system ("cls");
        dim = getNumberEx( "Please, enter matrix dimension:" );  
       scanf_s( "%d", &dim);
       if( dim <= 0 || dim > n ) 
       {
          printf( "Invalid value %d\n", dim);
          continue;
       }
 
       /* вопрос о заполнении матрицы (случайно, диагонально, с клавиатуры) */
       system ("cls");
       printf (" (1) - Aftozapolnenie\n (2) - Zapolnenie diagonali\n (3) - Vvod s klaviaturi\n (4) - Exit\n\n Please select: ");
       char iSelect = _getch();
       if( iSelect == '4' ) break;

       /* заполнение матриц в зависимости от выбора пользователя */
       switch( iSelect )
       {
          case '1': 
             for( i=0; i<dim; i++)
                for( j=0; j<dim; j++)
                {
                   mt1[i][j]=rand();
                   mt2[i][j]=rand();
                 }
             break;

          case '2':
             for( i=0; i<dim; i++)
                for( j=0; j<dim; j++)
                {
                   if (i==j)
                    mt1[i][j]=1;
                  else
                    mt1[i][j]=0;
                   if (i==j)
                    mt2[i][j]=1;
                  else
                    mt2[i][j]=0;
                }
             break;
                
          case '3':
              printf("\nEnter mt1:\n");
              for( i=0; i<dim; i++)
                 for( j=0; j<dim; j++)
                 {
                    dim = getNumberEx("  Element %d, %d:  ", i, j);
                    scanf_s(" %d", &mt1[i][j]);
                 }
             
              printf("\nEnter mt2:\n");
              for( i=0; i<dim; i++)
                 for( j=0; j<dim; j++)
                 {
                    dim = getNumberEx("  Element %d, %d:  ", i, j);
                    scanf_s( "%d", &mt2[i][j]);
                 }
                 break;
                
          default: 
             printf ("\n\nBad select, try again\n\n"); 
             _getch();  
             continue;
        }
    
    do 
      {
         /* печать матриц */
         system ("cls");
         printf("mt1:\n");
         for( i=0; i<dim ;i++)
         {
             for( j=0; j<dim; j++)
             {
               printf( " \t%d", mt1[i][j]);
             }
         putchar('\n');
         }

         printf("mt2:\n");
         for( i=0; i<dim ;i++)
         {
             for( j=0; j<dim; j++)
             {
               printf( " \t%d", mt2[i][j]);
             }
         putchar('\n');
         }
         _getch();  
             
         /* вопрос о редактировании матриц (хочу редактировать mt1, хочу редактировать mt2, не хочу редактировать) */
         system ("cls");
         dim = getNumberEx (" (1) - Edit mt1\n (2) - Edit mt2\n (3) - Exit\n\n Please select: ");
         char iSelect = _getch();
         if( iSelect == '3' ) break;
         
         /* вопрос об редактируемом элементе (координаты+значение) */
         system ("cls");
         dim = getNumberEx (" Enter x,y in [x,y] format: ");
       
         /* меняем значение у mt1 или mt2 */
         int i = 0, j = 0;
         scanf_s ("%d, %d", &i, &j);
         
         printf (" New value: ");
         int tmp = 0;
         scanf_s ("%d", &tmp);
         if( iSelect == '1' ) { mt1[i][j] = tmp; dim = getNumberEx (" Value [%d, %d] is: %d", i, j, mt1[i][j]);}
         else { mt2[i][j] = tmp;  getNumberEx (" Value [%d, %d] is: %d", i, j, mt2[i][j]);}
         _getch();

     }while (true);

        /* вопрос об операции с матрицами (сложение, вычитание) */
        system ("cls");
        dim = getNumberEx (" (1) -  Mult\n (2) - Summa\n \n Please select: ");
        iSelect = _getch();

        /* выполнение операций над матрицами в зависимости от выбора пользователя */
       switch( iSelect )
        { 
         case '1':             
            for( i=0; i<dim; i++)
               for( j=0; j<dim; j++)
               {    
                   res[i][j] = 0;
                   for( k = 0; k<dim; k++)  res[i][j] += mt1[i][k] * mt2[k][j];
                }
            break;

         case '2': 
            for(i=0;i<dim;i++)
               for(j=0;j<dim;j++)
                  res[i][j] = mt1[i][j] + mt2[i][j];
            break;

         default: 
            printf ("\n\nBad select, try again"); 
            _getch();  
            continue;
        }

        /* печать операции и результата */
        printf( "Operation:\n %s\n", (iSelect == '1') ? "Multiplication" : "Addition");

        printf( "\nResult:\n" );
        for( i=0; i<dim ;i++)
        {
            for( j=0; j<dim; j++)
            {
                printf( " \t%d", res[i][j]);
            }
        putchar('\n');
        }
        _getch();  

   }while (true);
}


Это сообщение отредактировал(а) dimmon123 - 26.10.2012, 21:36
PM MAIL   Вверх
feodorv
Дата 26.10.2012, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dimmon123 @  26.10.2012,  22:35 Найти цитируемый пост)
dim = getNumberEx в местах где нужен ток ввод цифр

"dim = getNumberEx" - это не волшебная палочка. Нужно всё таки понимать, что делает  getNumberEx, что означает dim...

getNumberEx всего лишь возвращает введённое с клавиатуры число (одно-единственное число). Зачем это число грузить исключительно в dim? И ничего, если dim, которую мы так бережно запрашивали у пользователя в начале и под которую готовили матрицы, вдруг меняется где-то в середине цикла? 


Почему scanf до сих пор в коде? Почему scanf используется вместе с getNumberEx?
Цитата(dimmon123 @  26.10.2012,  22:35 Найти цитируемый пост)
       dim = getNumberEx( "Please, enter matrix dimension:" );  
       scanf_s( "%d", &dim);

Вот скажи, что ты ожидаешь от этого кода? Что сделает scanf со значением переменной dim, полученным от getNumberEx? Третий раз пишу:
Цитата(feodorv @  23.10.2012,  01:46 Найти цитируемый пост)
вместо scanf, а не вместе с ней.

И вообще, что делает scanf? Для чего она предназначена?


Ты в курсе, что форматная строка вида "  Element %d, %d:  " используется в printf и printf-подобных функциях, которые разбирают форматную строку и понимают, что %d соответствует печати целого числа, которое передаётся этой функции в качестве аргумента? У нас getNumberEx - printf-подобная функция? Она умеет разбирать форматную строку? Совсем нет.


Я в печали. Я не знаю что делать. Писать длинные инструкции типа "прямо 100 метров, потом направо 200 метров, потом 2 шага назад" я не в состоянии. Делать за тебя лабу - не вариант, лаба - твоя, не моя. Я призываю тебя собраться с мыслями, разобрать работу программы, применить отладчик для лучшего понимания того, что и как происходит в программе и т.д.


Для примера приведу исправленный вариант кода:
Цитата(dimmon123 @  26.10.2012,  22:35 Найти цитируемый пост)
         /* вопрос об редактируемом элементе (координаты+значение) */
         system ("cls");
         dim = getNumberEx (" Enter x,y in [x,y] format: ");
       
         /* меняем значение у mt1 или mt2 */
         int i = 0, j = 0;
         scanf_s ("%d, %d", &i, &j);
         
         printf (" New value: ");
         int tmp = 0;
         scanf_s ("%d", &tmp);
         if( iSelect == '1' ) { mt1[i][j] = tmp; dim = getNumberEx (" Value [%d, %d] is: %d", i, j, mt1[i][j]);}
         else { mt2[i][j] = tmp;  getNumberEx (" Value [%d, %d] is: %d", i, j, mt2[i][j]);}
         _getch();

Остальное можно сделать по аналогии, если понимать, что делаешь...

Код
         /* вопрос об редактируемом элементе (координаты+значение) */
         system ("cls"); // <- очищаем экран. Это красиво в уже отлаженной программе, но 
                               //      в программе, которую только разрабатываем, это сильно мешает...

         i = getNumberEx (" Enter x: ");
         j = getNumberEx (" Enter y: ");
         if( i < 0 || i >= dim || j < 0 || j >= dim ) // <- проверим правильность введённых значений координат
         {
            printf( "Invalid values. Please, try again\n" );
            _getch();
            continue;
         }

         int tmp = getNumberEx( " New value: " ); // <- получаем новое значение для ячейки матрицы

        /* меняем значение у mt1 или mt2 */
         if( iSelect == '1' ) 
         {
             mt1[i][j] = tmp;
             printf( "New value of mt1[%d][%d] is %d\n", i, j, mt1[i][j]);
         }
         else 
         {
             mt2[i][j] = tmp;
             printf( "New value of mt2[%d][%d] is %d\n", i, j, mt2[i][j]);
         }
         _getch();

И никаких scanf, %d в getNumberEx, ...

Это сообщение отредактировал(а) feodorv - 26.10.2012, 22:46


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.3070 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.