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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++]МАТРИЦА, всё таже задача но с другим подходом 
:(
    Опции темы
twise
Дата 21.1.2008, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



короче проблема в следующем мне сказали в универе что типа делать нада по вот этому исходнику и никак иначе
кто может помочь?
исходник писал сам так что возможно будут ошибки хотя врядли

задание к этому исходнику 
Программа сортировки строк прямоугольной целочисленной матрицы по возрастанию сумм их элементов с использованием динамической памяти 



зарание сори за то что написано криво

        
Код

#include <stdafx.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>

void main()
{
    time_t t;
    time(&t);
    FILE *f_in,*f_out;
    unsigned rows,cols,i,j;
    f_in=fopen("sel_mat.dat","r");
    f_out=fopen("sel_mat.rez","w");
    fprintf(f_out,"              %s",ctime(&t));
    fscanf(f_in,"%i%i",&rows,&cols);
    fprintf(f_out,"rows - %i  cols - %i\n",rows,cols);
    unsigned **pm=new unsigned *[rows];
    for (i=0;i<rows;i++)
    pm[i]=new unsigned [cols];
    for (i=0;i<rows;i++)
    for (j=0;j<cols;j++)
    fscanf(f_in,"%i",&pm[i][j]);
    fprintf(f_out,"m[][]\n");
    for (i=0;i<rows;i++)
    {
    for (j=0;j<cols;j++)
    fprintf(f_out,"%4d",pm[i][j]);
    fprintf(f_out,"\n");
    }
    long *sum=new long [rows];
    for (i=0;i<rows;i++)
    {
        sum[i]=0;
        for (j=0;j<cols;j++)
            sum[i]+=pm[i][j];
    }
    for (i=0;i<rows;i++)
    {
        fprintf(f_out," result sum=%4d\n",sum[i]);
        for (j=0;j<cols;j++)
            fprintf(f_out,"%4d",pm[i][j]);
        fprintf(f_out,"\n");
    }
    long temp_s;
    int nmin,temp_pm;
    for (i=0;i<rows-1;i++)
    {
        nmin=i;
        for (j=i+1;j<rows;j++)
            if (sum[j]<sum[nmin]) nmin=j;
        temp_s=sum[i];
        sum[i]=sum[nmin];
        sum[nmin]=temp_s;
        for (j=0;j<cols;j++)
        {
            temp_pm=pm[i][j];
            pm[i][j]=pm[nmin][j];
            pm[nmin][j]=temp_pm;
        }
    }
    fprintf(f_out,"out result\n");
    for (i=0;i<rows;i++)
    {
        for (j=0;j<cols;j++)
            fprintf(f_out,"%4d",pm[i][j]);
        fprintf(f_out,"\n");
    }
    fclose(f_in);
    fclose(f_out);
    time(NULL);
    for (i=0;i<rows;i++)
        delete []pm[i];
    delete []pm;
    delete sum;
    getch();

}





Исходные данные sel_mat.dat этот файл должен быть создан в директории проекта
2 8
-44 55 -12 0 94 18 06 -67
54 -12 0 94 -18 -06 67 44

тоесть rows =2 cols =8
m[][]
-44 55 -12 0 94 18 06 -67
54 -12 0 94 -18 -06 67 44
задание которое нада сделать 
Дана целочисленная прямоугольная матрица. Определить номер первого из столбцов, содержащих хотя бы один нулевой элемент.
Характеристикой строки целочисленной матрицы назовем сумму ее отрицательных четных элементов. Переставляя строки заданной матрицы, расположить их в соответствии с убыванием характеристик.

ЗАРАНИЕ СПАСИБО
PM MAIL   Вверх
Dov
Дата 22.1.2008, 03:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



twise, тебе осталось только в файл записать. 
Код
#include <stdio.h> 

// ф-ция ищет первый столбец с нулевым значением и
// возвращает его порядковый номер(не индекс) или 0, если не нашла
int stolbec(int** matr, int row, int col)
{
    int i;
    
    for(i = 0; i < row; i++)
        if(matr[i][col] == 0)
            return col + 1;
        
    return 0;
}

// ф-ция возвращает сумму отрицательных
// четных(не по индексу, а по порядку) элементов 
int sum_elem(int* arr, int size)
{
    int j;
    int sum = 0;
    
    for(j = 1; j < size; j += 2)
        if(arr[j] < 0)
            sum += arr[j];
        
        return sum;        
}

int main(int argc, char* argv[])

    FILE* file;
    int   i, j, st, rows, cols, *tmp;
    int** matrix;
    
    // открываем файл для чтения
    if((file = fopen("test.txt", "rt")) == NULL)
    {
        puts("Unable to open file...\n");
        return 1;
    }

    // считываем из файла кол-во строк и столбцов
    fscanf(file, "%d %d", &rows, &cols);

    // выделяем память для динамической матрицы размером rows х cols
    matrix = new int*[rows];
    for(i = 0; i < rows; i++)
        matrix[i] = new int[cols];

    // заполняем её значениями, считанными из файла
    for(i = 0; i < rows; i++)
        for(j = 0; j < cols; j++)
            fscanf(file, "%d", &matrix[i][j]);

    // закрываем файл
    fclose(file);

    // выводим матрицу на экран
    puts("Source: ");
    for(i = 0; i < rows; i++)
    {
        for(j = 0; j < cols; j++)
            printf("%4d", matrix[i][j]);
        puts("");    
    }
    
    // определяем первый столбец с нулевым значением
    for(i = 0; i < cols && (st = stolbec(matrix, rows, i)) == 0; i++);

    // печатаем результат
    st ? printf("\nstolbec #%d\n\n", st) : printf("\nstolbcov net\n\n");

    // переставляем строки матрицы, согласно условию задачи 
    for(j = 0; j < rows; j++)
    {
        for(i = 0; i < rows - 1; i++)
        {
            if(sum_elem(matrix[i], cols) < sum_elem(matrix[i + 1], cols))
            {
                tmp           = matrix[i];
                matrix[i]     = matrix[i + 1];
                matrix[i + 1] = tmp;
            }
        }
    }
    
    // печатаем результат
    puts("Result: ");
    for(i = 0; i < rows; i++)
    {
        for(j = 0; j < cols; j++)
            printf("%4d", matrix[i][j]);
        printf("   [%2d]\n", sum_elem(matrix[i], cols));         
    }
    
    // освобождаем память
    for(i = 0; i < rows; i++)
        delete[] matrix[i];
    delete[] matrix;
    
    return 0;        
}



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Palladin
Дата 22.1.2008, 03:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

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



а епть ток писать сам начал, ну ты быстрый smile  smile 
P.S. Сорри за флуд


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
twise
Дата 22.1.2008, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



люди спс конеш
показал код преподу он мну опять отправил((
говорит нада вот так 
unsigned **pm=new unsigned *[rows];
и делать только вот от этого
void main() и типа никаких други дополнительных функций не должно быть типа int stolbec(int** matr, int row, int col)

[censored 6]  smile 
говорит делайте как написано в исходнике пробовал сам написать но не получилось
плз перепишите .......

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


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Цитата(twise @  22.1.2008,  15:27 Найти цитируемый пост)
unsigned **pm=new unsigned *[rows];

unsigned нельзя, у тебя же отрицательные значения в матрице имеются. 

Код
void main()
{
    time_t t;
    FILE * f_in, *f_out;
    int    rows, cols, i, j, *tmp, st = 0;
    long*  sum;

    time(&t);

    f_in  = fopen("sel_mat.dat","r");
    f_out = fopen("sel_mat.rez","w");

    fprintf(f_out, "              %s", ctime(&t));
    printf("              %s", ctime(&t));
    fscanf(f_in, "%i%i", &rows, &cols);
    fprintf(f_out, "rows - %i  cols - %i\n", rows, cols);
    printf("rows - %i  cols - %i\n", rows, cols);

    int **pm = new int*[rows];
    for(i = 0; i < rows; i++)
        pm[i] = new int[cols];

    for(i = 0; i < rows; i++)
        for(j = 0; j < cols; j++)
            fscanf(f_in, "%i", &pm[i][j]);

    fprintf(f_out, "m[][]\n");
    printf("m[][]\n");

    for(i = 0; i < rows; i++)
    {
        for(j = 0; j < cols; j++)
        {
            fprintf(f_out, "%4d", pm[i][j]);
            printf("%4d", pm[i][j]); 
        }
        fprintf(f_out, "\n");
        puts("");
    }

    for(i = 0; i < cols; i++)
    {
        for(j = 0; j < rows; j++)
            if(pm[j][i] == 0)
            {
                st = i + 1;
                break;
            }
        if(st)
            break;
    }
    
    if(st)
    {
        fprintf(f_out, "\nstolbec #%d\n\n", st);
        printf("\nstolbec #%d\n\n", st);
    }
    else
    {
        fprintf(f_out, "\nstolbcov net\n\n");
        printf("\nstolbcov net\n\n"); 
    }

    sum = new long[rows];
    for(i = 0; i < rows; i++)
    {
        sum[i] = 0;
        for(j = 1; j < cols; j += 2)
            if(pm[i][j] < 0)
                sum[i] += pm[i][j];
    }              

    for(i = 0; i < rows; i++)
    {
        fprintf(f_out, "result sum =%4d\t", sum[i]);
        printf("result sum =%4d\t", sum[i]);
        for(j = 0; j < cols; j++)
        {
            fprintf(f_out, "%4d", pm[i][j]);
            printf("%4d", pm[i][j]);
        }
        fprintf(f_out, "\n");
        puts("");
    }

    for(j = 0; j < rows - 1; j++)
    {
        for(i = j + 1; i < rows; i++)
        {
            if(sum[i] > sum[j])
            {
                tmp    = pm[i];
                pm[i]  = pm[j];
                pm[j]  = tmp;
            }
        }
    }
    
    fprintf(f_out, "\nout result\n");
    printf("\nout result\n");
    for(i = 0; i < rows; i++)
    {
        for(j = 0; j < cols; j++)
        {
            fprintf(f_out, "%4d", pm[i][j]);
            printf("%4d", pm[i][j]);
        }
        fprintf(f_out,"\n");
        puts("");
    }

    fclose(f_in);
    fclose(f_out);
    time(NULL);

    for(i = 0; i < rows; i++)
        delete[] pm[i];
    delete[] pm;
    delete[] sum;

    getch();        
}





--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
twise
Дата 23.1.2008, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




плз напишите норм прогу только не надо чтобы был вывод значений на экран*(хотя пох) только работа с файлами
sel_mat.dat исходные данные
sel_mat.rez результат
если есть сложность с нахождением Характеристикой строки целочисленной матрицы назовем сумму ее отрицательных четных элементов.
то это выглядит как условие что каждый элемент строки должен быть меньше нуля и делиться на 2 без остатка тоесть должно быть чётным и когда строка проходит под это условие сумируем элементы этой строки
если все элементы строки не проходят это условие то характеристика строки будет равна 0

просто в последнем коде этого нет....а я пропустил не проверил сразу 
перепишите плз с этими условиями

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


Шустрый
*


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

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



Я тебе в личку ответил,  на всякий случай сюда дублирую:

Код

#include <stdafx.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>

void main()
{
    time_t t;
    time(&t);
    FILE *f_in,*f_out;
    unsigned rows,cols,i,j;

    // открытие файлов
    f_in=fopen("sel_mat.dat","r");
    f_out=fopen("sel_mat.rez","w");

    fprintf(f_out,"              %s",ctime(&t));
    // Чтение размерности матрицы
    fscanf(f_in,"%i%i",&rows,&cols);
    fprintf(f_out,"rows - %i  cols - %i\n",rows,cols);

    // Выделение памяти под хранение матрицы
    int **pm=new int *[rows]; // Выделятся память под хранение массива указателей на строки матрицы
    // В цикле выделяется память для каждой строки матрицы.
    // Указатель на выделеную память запоминается в соответствующем элементе массива указателей.
    for (i=0;i<rows;i++)
        pm[i]=new int [cols];

    // Чтение матрицы из файла.
    for (i=0;i<rows;i++)
        for (j=0;j<cols;j++)
            fscanf(f_in,"%d",&pm[i][j]);

    fprintf(f_out,"m[][]\n");

    // Вывод исходной матрицы в файл результата
    for (i=0;i<rows;i++)
    {
        for (j=0;j<cols;j++)
            fprintf(f_out,"%4d",pm[i][j]);
        fprintf(f_out,"\n");
    }

    int ncol = -1; // Минимальный номер столбца с нулевым значением (-1 означает что такой столбец не найден)
    // Поиск первого столбца с нулевым значением
    // Условие выхода из цикла (j < cols) && (ncol == -1) означает - если не все столбцы перебраны
    // и не найден столбец с нулями - продолжать цикл.
    for (j = 0; (j < cols) && (ncol == -1); j++) {
        for (i = 0; (i < rows) && (ncol == -1); i++)
            if (pm[i][j] == 0) {
                // В j-м столбце есть нулевые элементы
                ncol = j;
            }
    }
    // печать результата
    if (ncol != -1) {
        // печать номера первого столбца с нулевыми элементами (номер столбца начинается с 0 !!!!)
        fprintf(f_out,"First column with zero is %d\n", ncol );
    }
    else
        fprintf(f_out,"No column with zero\n");

    // Выделение памяти для массива, хранящего сумму четных отрицательных элементов для каждой строки
    int *sum=new int [rows];

    // Подсчет суммы четных отрицательных элементов для каждой строки матрицы.
    for (i=0;i<rows;i++)
    {
        sum[i]=0;
        for (j=0;j<cols;j++)
            if ((pm[i][j] < 0) && (pm[i][j] % 2 == 0)) 
                sum[i]+=pm[i][j];
    }

    // Вывод суммы четных отрицательных элементов для кажой строки в файл результата
    for (i=0;i<rows;i++)
    {
        fprintf(f_out,"row %d,result sum=%4d\n",i, sum[i]);
        for (j=0;j<cols;j++)
            fprintf(f_out,"%4d",pm[i][j]);
        fprintf(f_out,"\n");
    }

    // Сортировка по убыванию сумм четных отрицательных элементов строк матрицы.
    long temp_s;
    int nmax,temp_pm;
    // Цикл по всем строкам кроме последней. На каждом шаге цикла строки, номера которых меньше i отсортированы по убыванию
    for (i=0;i<rows-1;i++)
    {
        nmax=i; // Изначально полагаем что i-я строка является максимальной из оставшихся неотсортированными строк
        // поиск номера максимальной из оставшихся неотсортированными строк (номера которых больше i)
        for (j=i+1;j<rows;j++)
            if (sum[j]>sum[nmax]) nmax=j;

        // Если строкой с максимальной суммой является не i-я строка, 
        // то нужно их поменять местами (i-ю и максимальную)
        if (i != nmax) {
            // Меняем местами значения сумм.
            temp_s=sum[i];
            sum[i]=sum[nmax];
            sum[nmax]=temp_s;

            // Меняем местами строки матрицы
            for (j=0;j<cols;j++)
            {
                temp_pm=pm[i][j];
                pm[i][j]=pm[nmax][j];
                pm[nmax][j]=temp_pm;
            }
        }
    }
    
    // Вывод отсортированной матрицы в файл результатов
    fprintf(f_out,"out result\n");
    for (i=0;i<rows;i++)
    {
        for (j=0;j<cols;j++)
            fprintf(f_out,"%4d",pm[i][j]);
        fprintf(f_out,"\n");
    }
    // Закрываем файлы
    fclose(f_in);
    fclose(f_out);

    time(NULL);
    // Освобождение выделенной памяти
    // Цикл по строкам матрицы, освобождение памяти каждой строки
    for (i=0;i<rows;i++)
        delete []pm[i];
    // Освобождение памяти массива указателей на строки матрицы
    delete []pm;
    // Освобожденния массива сумм элементов строк.
    delete sum;
    // Нажмите любую клавишу
    getch();
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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