Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2017, 11:50   #1
KariLex
Пользователь
 
Регистрация: 01.04.2017
Сообщений: 27
По умолчанию [C] В матрице поменять местами i-ю и j-ю строки. Динамический массив. Язык СИ

Написать программу с использованием динамических переменных, в которой данные сначала из файла считываются в память, потом обрабатываются и записываются в файл. Использовать динамическое создание массивов.

В матрице поменять местами i-ю и j-ю строки.

Попыталась написать программу со статическим массивом, не очень получилось, данные берутся из файла (запись пока не делала), а даже на экран результат не выходит (где-то напортачила)
Помогите найти ошибку и подскажите пожалуйста как сделать динамический массив и с памятью динамической

Помогите пожалуйста

Код:
#include "stdafx.h"
 
 
#include <locale.h> 
#define size 100                                                                
void inputsize(int *_n, int *_m);
int openf_and_mass(int _mass[size][size], int _n, int _m);
void change(int k, int l, int _m, int _mass[size][size]);
void print(int _mass[size][size], int _n, int _m);
 
 
int main(void)
{
    setlocale(LC_ALL, "Russian");
 
    int mass[size][size];
    int i=0,j=0,k,l;
    //FILE *fp; /*исходный файл*/
              //FILE *fo;
    int n, m;
    inputsize(&n, &m);
    openf_and_mass(mass, n, m);
    printf("Введите номера строк, которые нужно поменять\n ");
    printf("i = ");
    scanf("%d", &k);
    printf(" j = ");
    scanf("%d\n", &l);
    change(k, l, m, mass);
    print(mass, n, m);
 
    
 
    return 0;
}
/*подпрограмма ввода количества элементов матрицы*/
void inputsize(int *_n, int *_m)
{
    printf("Введите количество строк n<=10: ");
    scanf("%d", _n); 
    printf("Введите количество столбцов m<=10: ");
    scanf("%d", _m);
}
/*подпрограмма открытия файла и считывания массива*/
int openf_and_mass(int _mass[size][size], int _n, int _m)
{
    int i, j;
FILE *fp; /*исходный файл*/
fp = fopen("C://Users//Ekaterina//Desktop//int.txt", "r");
if (fp == NULL)
{
    perror("Error opening file");
    return 0;
}
else
{
    for (i = 0; i<_n; i++)
    {
        for (j = 0; j<_m; j++)
        {
            fscanf(fp, "%d", &_mass[i][j]);
            //printf("%d", mass[i][j]);
        }
    }
    for (i = 0; i < _n; i++)
    {
        printf("\n");
        for (j = 0; j < _m; j++)
            printf("%4d", _mass[i][j]);
        
    }
    printf("\n");
}
return 0;
}
 
void change(int k, int l, int _m, int _mass[size][size])
{
    int i, j,d;
    for (j = 0; j < _m; j++)
    {
        d = _mass[k][j];
        _mass[k][j] = _mass[l][j];
        _mass[l][j] = d;
    }
}
 
void print(int _mass[size][size], int _n, int _m)
{
    int i, j;
    for (i = 0; i < _n; i++)
    {
        for (j = 0; j < _m; j++)
        {
            printf("%4d", _mass[i][j]);
            //printf("\n");
        }
    }
}
Вложения
Тип файла: txt int.txt (302 байт, 124 просмотров)
KariLex вне форума Ответить с цитированием
Старый 03.06.2017, 13:38   #2
KariLex
Пользователь
 
Регистрация: 01.04.2017
Сообщений: 27
По умолчанию

Вот такая программа получилась, подскажите как использовать здесь динамические переменные, динамическое создание массивов

Код:
#include "stdafx.h"
#include <stdio.h>  
#include <conio.h>
#include <locale.h> 
#define size 100                                                                
void inputsize(int *_n, int *_m);
int openf_and_mass(int _mass[size][size], int _n, int _m);
void change(int k, int l, int _m,int _n, int _mass[size][size]);
int printfile(int _mass[size][size], int _n, int _m);
 
int main(void)
{
    setlocale(LC_ALL, "Russian");
 
    int mass[size][size];
    int i,j,k,l;
        int n, m;
 
    inputsize(&n, &m);
    openf_and_mass(mass, n, m);
 
    printf("Введите номера строк, которые нужно поменять\n ");
    printf("i =");
    scanf("%d", &k);
    printf(" j =");
    scanf("%d", &l);
 
   change(k, l, m,n, mass);
   printfile(mass, n, m);
   return 0;
}
 
/*подпрограмма ввода количества элементов матрицы*/
void inputsize(int *_n, int *_m)
{
    printf("Введите количество строк n<=10: ");
    scanf("%d", _n); 
    printf("Введите количество столбцов m<=10: ");
    scanf("%d", _m);
}
 
/*подпрограмма открытия файла и считывания массива*/
int openf_and_mass(int _mass[size][size], int _n, int _m)
{
    int i, j;
    char filename[50];
    FILE *fp; /*исходный файл*/
    //fp = fopen("C://Users//Ekaterina//Desktop//int.txt", "r");
    printf("Введите имя исходного файла/ путь к файлу\n");
    scanf("%s", filename);
    fp = fopen(filename, "r");
 
    if (fp == NULL)
    {
        perror("Error opening file");
        return 0;
    }
    else
    {
        printf("\n");
        printf("Информация, считанная из файла \n");
        for (i = 0; i < _n; i++)
        {
            for (j = 0; j < _m; j++)
            {
                fscanf(fp, "%d", &_mass[i][j]);
                //printf("%d", mass[i][j]);
            }
        }
        for (i = 0; i < _n; i++)
        {
            printf("\n");
            for (j = 0; j < _m; j++)
                printf("%4d", _mass[i][j]);
 
        }
        printf("\n");
    }
    fclose(fp);
    return 0;
}
 
/*подпрограмма для замены строк*/
void change(int k, int l, int _m, int _n, int _mass[size][size])
{
    int i, j, d;
    for (j = 0; j < _m; j++)
    {
        d = _mass[k][j];
        _mass[k][j] = _mass[l][j];
        _mass[l][j] = d;
    }
    return;
}
 
/*подпрограмма для вывода результата в файл*/
int printfile(int _mass[size][size], int _n, int _m)
{
    int i, j;
    char filename[50];
    FILE *fo;
    //fo = fopen("C://Users//Ekaterina//Desktop//rez.txt", "w");
    printf("Введите имя результирующего файла/ путь к файлу\n");
    scanf("%s", filename);
    fo = fopen(filename, "w+");
 
    if (fo == NULL)
    {
        perror("Error opening file");
        return 0;
    }
    else
    {
        printf("\n");
        printf("Новая матрица после замены строк\n");
        for (i = 0; i < _n; i++)
        {
            fprintf(fo, "\n");
            printf("\n");
            for (j = 0; j < _m; j++)
            {
                printf("%4d", _mass[i][j]);
                fprintf(fo, "%4d", _mass[i][j]);
            }
        }
    }
    printf("\n");
    fclose(fo);
}
KariLex вне форума Ответить с цитированием
Старый 03.06.2017, 14:54   #3
KariLex
Пользователь
 
Регистрация: 01.04.2017
Сообщений: 27
По умолчанию

Как-то так получилось..


Код:
#include "stdafx.h"
#include <stdio.h>	
#include <conio.h>
#include <locale.h>	
#include <malloc.h>
#define size 10	

int sinput();
int **getmem_manual(int _n, int _m);
int **change(int k, int l, int _m, int _n, int **_mass);
int **printfile(int **_mass, int _n, int _m);
void freemem(int **_mass, int _m);


int main(void)
{
	setlocale(LC_ALL, "Russian");
	printf("Данная программа позволяет поменять в матрице iю и jю строчки\n");
	int **mass; //указатель на массив
	//int mass[size][size];
	int i,j,k,l;
	int n, m;
	mass = NULL;
	printf("Введите размерность n [1;10] : ");
	n = sinput();
	printf("Введите размерность m [1;10] : ");
	m = sinput();

	mass = getmem_manual(n, m);
	printf("\n");
	printf("\n");
	printf("Введите номера строк, которые нужно поменять\n ");
	printf("i = ");
	scanf("%d", &k);
	printf(" j = ");
	scanf("%d", &l);

   change(k, l, m,n, mass);
   printfile(mass, n, m);
   freemem(mass, m);
   return 0;
}

/*подпрограмма ввода количества элементов матрицы*/
int sinput()
{
	int _n, code;/*n-размер массива,code-переменная для проверки вводимых значений*/
	do
	{
		fflush(stdin);
		code = scanf("%d", &_n);
		if ((code != 1) || (_n <= 0) || (_n>size))
			printf("Введено некорректное значение. Повторите ввод\n");
	} while ((code != 1) & ((getchar()) != '\n') || (_n <= 0) || (_n > size));
	return _n;
}



/*подпрограмма для замены строк*/
int **change(int k, int l, int _m, int _n, int **_mass)
{
	int i, j, d;
	for (j = 0; j < _m; j++)
	{
		d = _mass[k][j];
		_mass[k][j] = _mass[l][j];
		_mass[l][j] = d;
	}
	return _mass;
}

/*подпрограмма для вывода результата в файл и на экран*/
int **printfile(int **_mass, int _n, int _m)
{
	int i, j;
	char filename[50];
	FILE *fo;
	//fo = fopen("C://Users//Ekaterina//Desktop//rez.txt", "w");
	printf("\n");
	printf("Введите имя результирующего файла/ путь к файлу\n");
	scanf("%s", filename);
	fo = fopen(filename, "w");

	if (fo == NULL)
	{
		perror("Error opening file");
		return 0;
	}
	else
	{
		printf("\n");
		printf("Новая матрица после замены строк\n");
		fprintf(fo,"Новая матрица после замены строк\n");
		for (i = 0; i < _n; i++)
		{
			fprintf(fo, "\n");
			printf("\n");
			for (j = 0; j < _m; j++)
			{
				printf("%4d", _mass[i][j]);
				fprintf(fo, "%4d", _mass[i][j]);
			}
		}
	}
	printf("\n");
	fclose(fo);
}

/*Подпрограмма выделения памяти*/
int **getmem_manual(int _n, int _m)
{
	int i, j;
	int **_mass;
	char filename[50];
	FILE *fp; /*исходный файл*/
			  //fp = fopen("C://Users//Ekaterina//Desktop//int.txt", "r");
	printf("Введите имя исходного файла/ путь к файлу\n");
	scanf("%s", filename);
	fp = fopen(filename, "r");

	if (fp == NULL)
	{
		perror("Error opening file");
		return 0;
	}
	else
	{
		printf("\n");
		printf("Информация, считанная из файла \n");
		_mass = NULL;
		_mass = (int**)calloc(_n, sizeof(int*));
		if (_mass == NULL)
		{
			printf("Ошибка при распределении памяти \n");
			return NULL;
		}
		for (i = 0; i <= _n - 1; i++)
		{
			printf("\n");
			_mass[i] = NULL;
			_mass[i] = (int *)calloc(_m, sizeof(int));
			if (_mass[i] == NULL)
			{
				printf("Ошибка при распределении памяти \n");
				return NULL;
			}
			for (j = 0; j <= _m - 1; j++)
			{
				fscanf(fp, "%d", &_mass[i][j]);
				printf("%4d", _mass[i][j]);
			}
		}
		return _mass;
	}
}


/*Подпрограмма освобождения памяти*/
void freemem(int **_mass, int _m)
{
	int i;//счётчик цикла
	for (i = 0; i < _m; i++)
		free(_mass[i]);//осовбождение памяти из под столбцов
	free(_mass);//освобождение памяти из под массива указателей
	return;
}
KariLex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В заданной прямоугольной матрице найти наибольший и наименьший элементы и поменять местами строки, в которых они находятся. igormel Помощь студентам 2 07.05.2017 08:08
Поменять местами строки в матрице Alexey Smirnov Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 14 06.06.2014 19:08
В матрице поменять местами строки с max элементом и min элементом: объясните код, где какие действия выполняются (Паскаль). КонстантинКонстант Помощь студентам 0 08.01.2014 13:38
В целочисленной квадратной матрице наибольший элемент каждой строки поменять местами с элементом главной диагонали DesignGenius C# (си шарп) 0 18.10.2011 20:22
В матрице А поменять местами две строки с заданными номерами dimegusew Помощь студентам 0 11.05.2011 20:02