Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++]МАТРИЦА


Автор: twise 21.1.2008, 18:46
короче проблема в следующем мне сказали в универе что типа делать нада по вот этому исходнику и никак иначе
кто может помочь?
исходник писал сам так что возможно будут ошибки хотя врядли

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



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

        
Код

#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
задание которое нада сделать 
Дана целочисленная прямоугольная матрица. Определить номер первого из столбцов, содержащих хотя бы один нулевой элемент.
Характеристикой строки целочисленной матрицы назовем сумму ее отрицательных четных элементов. Переставляя строки заданной матрицы, расположить их в соответствии с убыванием характеристик.

ЗАРАНИЕ СПАСИБО

Автор: Dov 22.1.2008, 03:04
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;        
}

Автор: Palladin 22.1.2008, 03:16
а епть ток писать сам начал, ну ты быстрый smile  smile 
P.S. Сорри за флуд

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

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

Автор: Dov 22.1.2008, 21:39
Цитата(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();        
}



Автор: twise 23.1.2008, 13:49

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

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

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

Код

#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();
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)