Работа с массивом на си
Подскажите пожалуйста как в массиве вещественных чисел, например {aij} (i=1,2,....n; j=1,2,...,m) произвести упорядочение по строке элементов в порядке убывания? Буду очень признателен за помощь.
1. изучай алгоритмы сортировки;
2. изучай ман по qsort и компании
[COLOR="Red"]Свои общие советы держи при себе.Никто тут в них не нуждается.Нарушение -15 баллов за повторный флуд.Я тебя предупреждал,так что отдохни немного.[/COLOR]
m_Valery.
#include <string.h>
#include <stdio.h>
#define LINE 4 //кол-во строк
#define ROW 5 //кол-во столбцов
int compare (const void * a, const void * b)
{
return ( (*(int*)a >*(int*)b)? 0:1 ); //сортировка на убывание
//(меняешь "0:1" на "1:0" и сортирует по возростанию
}
void main()
{
int A[LINE][ROW];
int count = 0;
for(int i=0;i<LINE;i++)
for(int j=0;j<ROW;j++)
{
A[j] = count;
count++;
}
for(int i=0;i<LINE;i++) // вывод матрицы до сортировки
{
for(int j=0;j<ROW;j++)
printf("%d ",A[j]);
printf("\n");
}
printf("\n");
for(int i=0;i<LINE;i++)
{
qsort(&A[0],ROW,sizeof(int),compare); //сортировка
}
for(int i=0;i<LINE;i++) // вывод матрицы после сортировки
{
for(int j=0;j<ROW;j++)
printf("%d ",A[j]);
printf("\n");
}
scanf("%d",&count);
}
а это как?
код приведи, иначе никто не сможет помочь.
int A[j] = <значение типа int>; A - матрица i - строка j - столбец
приведи код
1) указатель на элемент с которого нужно начать сортировку
2) кол-во символов которые надо упорядочить
3) размер который занимает 1 элемент массива в байтах
4) функция("правило") по которой будет происходить упорядочивание массива.
Измени в код как написано в комментарии и будет упорядочивать по возрастанию
{
return ( (*(int*)a >*(int*)b)? 0:1 ); //сортировка на убывание
//меняешь "0:1" на "1:0" и сортирует по возрастанию
}
если тебе надо отсортировать только 1 строку (1вую например), то тебе надо убрать цикл
{
qsort(&A[0],ROW,sizeof(int),compare); //сортировка
}
и вместо него написать
//или qsort(&A[0],ROW,sizeof(int),compare); где i-номер строки
//необходимую отсортировать (если 1вую строку i=0 если 2рую i=1 ...)
Элементы матрицы вводятся не по строкам и столбцам, они вводятся по 1 элементу при этом указывается расположение этого объекта в матрице
(A[j])
похоже ясно где у тебя выскакивает ошибка, дело в том что я пишу в Visual Studio 2003 .NET
напиши в начале тела main() {int i,j; ....} и поудаляй везде в циклах for int, должно работать
...
stimpi, автору не нужен qsort.Он только начал изучать язык,он сам же пишет.Ему надо создать массив,ввести элементы массива с клавиатуры или заполнить случайными числами.Ввести номер строки и отсортировать ее.Причем весь смысл этой задачи имхо как раз в том чтоб сделать сортировку самому,обычный пузерек.Все.
const int row = 5;
const int col = 5;
void main()
{
int mass[row][col];
int count = 0;
printf("\tArray\n\n");
for(int i = 0;i < row;++i){
for(int j = 0;j < col;++j)
mass[j] = ++count;
}
for(int i = 0;i < row;++i){
for(int j = 0;j < col;++j)
printf("%d \t",mass[j]);
printf("\n\n");
}
int num;
printf("Input row\n");
scanf("%d",&num);
bool flag = true;//флаг сортировки
int i, j;
int temp;
for (j = 1; ;++j)
{
for(i = 0; i < col - j;++i)
if (mass[num] < mass[num][i + 1])
{
temp = mass[num];
mass[num] = mass[num][i + 1];
mass[num][i + 1] = temp;
flag = false;
}
if(flag)//если строка отсортирована ?
break;//да - выход из цикла
flag = true;//нет - устанавливаем флаг сортировки
}
for(int i = 0;i < row;++i){
for(int j = 0;j < col;++j)
printf("%d \t",mass[j]);
printf("\n\n");
}
}
Создаем массив 5 х 5,заполняем его числами от 1 до 25,вводим номер строки,которую надо отсортировать по убыванию и сортируем.
bool flag = true;
int buf_temp;
while(flag)
{
flag = false;
for (int i=0;i<ROW-1;i++)
{
if(A[STROKA] > A[STROKA][i+1])
{
flag = true;
buf_temp = A[STROKA][i+1];
A[STROKA][i+1] = A[STROKA];
A[STROKA] = buf_temp;
}
}
}
опередили =)
Вот код программы, массив ввел, вывел его на экран и использовал в нем сортировку пузырьком, как Вы писали выше. Если это верный вариант, то как организовать вывод на экран уже упорядоченного массива через printf? Подскажите пожалуйста, буду очень благодарен.
main()
{
const n=4;
bool p;
int i, j, l, ll, jj;
float baf, k, a[n][n], b[n];
char otw;
begin: i=0;
printf ("Vvedite matricu razmernosti %d",n), printf(":\n");
while (i<=n-1)
{
for (j=0; j<=n-1; j++)
{
printf (")(%d", j+1), printf (")=");
scanf ("%f", &a[j]);
};
i++;
};
p=0;
l=0;
ll=0;
jj=0;
for (i=0; i<=n-1; i++)
{
printf ("\n");
{
for (j=0; j<=n-1; j++)
printf ("%f", a[j]), printf (" ");
};
}
int STROKA = 0;
bool flag = true;
float buf_temp, row;
while(flag)
{
flag = false;
for (i=0;i<row-1;i++)
{
if(a[STROKA] > a[STROKA][i+1])
{
flag = true;
buf_temp = a[STROKA][i+1];
a[STROKA][i+1] = a[STROKA];
a[STROKA] = buf_temp;
}
}
}
}
[COLOR="Red"]bool p; [/COLOR] //[COLOR="Red"] что это ?[/COLOR]
int i = 0, j,[COLOR="Red"] l, ll, jj[/COLOR];// [COLOR="Red"]что за переменные ?[/COLOR]
float [COLOR="Red"]baf, k,[/COLOR] a[n][n],[COLOR="Red"] b[n[/COLOR]] ;
[COLOR="Red"]char otw;[/COLOR]
[COLOR="Red"]begin: i=0;[/COLOR]
printf ("Vvedite matricu razmernosti %d",n), printf(":\n");
while (i<=n-1)
{
for (j=0; j<=n-1; j++)
{
printf (")(%d", j+1), printf (")=");
scanf ("%f", &a[j]);
};
i++;
};
[COLOR="Red"] p=0;
l=0;
ll=0;
jj=0;[/COLOR]
for (i=0; i<=n-1; i++)
{
printf ("\n");
{
for (j=0; j<=n-1; j++)
printf ("%f", a[j]), printf (" ");
}[COLOR="Red"];[/COLOR]//[COLOR="Red"] лишняя инструкция[/COLOR]
}
...
Тебе не лень вводить float с клавиатуры ?;) Не проще ли и быстрее использовать cучайные числа ?
Много лишнего,переменные,которые нигде не используются...
Вывести после сортировки так же
{
printf ("\n");
{
for (j=0; j<=n-1; j++)
printf ("%f", a[j]), printf (" ");
}
}
Вот код программы, массив ввел, вывел его на экран и использовал в нем сортировку пузырьком, как Вы писали выше. Если это верный вариант, то как организовать вывод на экран уже упорядоченного массива через printf? Подскажите пожалуйста, буду очень благодарен.
во-первых, ты уже выводишь на экран матрицу перед сортировкой, аналогичным образом выводишь и после сортировки
во-вторых у тебя объявлена переменная row, но ей не присвоено значения поэтому выдает ошибку, следует ей присвоить значение n.
+ в добавок ко всему ты объявил много не использованных переменных и массив ( l, ll, jj, p, baf, k, b[n], otw) зачем они для меня остается загадкой :confused: .
Исправленный код ниже
// bla bla bla
float buf_temp, row=n;
while(flag)
{
flag = false;
for (i=0;i<row-1;i++)
{
if(a[STROKA] > a[STROKA][i+1])
{
flag = true;
buf_temp = a[STROKA][i+1];
a[STROKA][i+1] = a[STROKA];
a[STROKA] = buf_temp;
}
}
}
for (i=0; i<=n-1; i++) // вывод матрицы после упорядочивания
{
printf ("\n");
{
for (j=0; j<=n-1; j++)
printf ("%f", a[j]), printf (" ");
}
}
}
#define N 4
int main()
{
int arr[N][N],i,j,tmp;
printf("Введите матрицк размера %dx%d\n",N,N);
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{
printf("n(%d,%d)=",i,j);
scanf("%d",&(arr[j]));
}
for(i=0;i<N*N;i++)
for(j=0;j<N*N;j++)
{
if(arr[i/N][i-i/N*N]>arr[j/N][j-j/N*N])
{
tmp=arr[i/N][i-i/N*N];
arr[i/N][i-i/N*N]=arr[j/N][j-j/N*N];
arr[j/N][j-j/N*N]=tmp;
}
}
printf("Результат\n:");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
printf("n(%d,%d)=%d\t",i,j,arr[j]);
}
printf("\n");
}
//while(!kbhit());
return 0;
}
Насчет неиспользуемых переменных - для другой функции, не убрал, Сорри.
stimpi, извините, но даже исправленный вами код не выполняет функцию сортировки по убыванию. Банально выводиться тот же массив.
stimpi, извините, но даже исправленный вами код не выполняет функцию сортировки по убыванию. Банально выводиться тот же массив.
у меня все сортирует как надо с твоим кодом и моим дополнением, которое я привел.
Результат: сортирует 1вую строку массива по возрастанию.
Неудачная.Неправильный результат выводит.Я тебе повторяю,что решение есть.2 варианта.У тебя вариант stimpi не работает,потому что ты в код не смотришь(ждешь готовый результат),а он сортирует по возрастанию.Знак поменяй и все.
m_Valery, Простите, какой знак?!
m_Valery, Простите, какой знак?!
Знак > , тебе надо <
Правильно,думаешь,еще одним циклом.Но ты сам писал:
Вот,напримерТ так можешь сделать
const int col = 5;
void main()
{
int mass[row][col];
int count = 0;
printf("\tArray\n\n");
for(int i = 0;i < row;++i){
for(int j = 0;j < col;++j)
mass[j] = ++count;
}
for(int i = 0;i < row;++i){
for(int j = 0;j < col;++j)
printf("%d \t",mass[j]);
printf("\n\n");
}
printf("\n\n");
bool flag = true;//флаг сортировки
int i, j;
int temp;
for (j = 1; ;++j)
{
for(int k = 0;k < row;++k){
for(i = 0; i < col - j;++i)
if (mass[k] < mass[k][i + 1])
{
temp = mass[k];
mass[k] = mass[k][i + 1];
mass[k][i + 1] = temp;
flag = false;
}
}
if(flag)//если строка отсортирована ?
break;//да - выход из цикла
flag = true;//нет - устанавливаем флаг сортировки
}
for(int i = 0;i < row;++i){
for(int j = 0;j < col;++j)
printf("%d \t",mass[j]);
printf("\n\n");
}
}
void main()
{
int a[n][n];
printf("\tArray\n\n");
for(int i = 0;i < n;++i){
for(int j = 0;j < n;++j){
printf (")(%d", j+1), printf (")=");
scanf ("%d", &a[j]);
}
}
for(int i = 0;i < n;++i){
for(int j = 0;j < n;++j)
printf("%d \t",a[j]);
printf("\n\n");
}
printf("\n\n");
bool flag = true;
int i, j;
int temp;
while(flag)
{
flag = false;
for(j = 0;j < n;++j){
for(i = 0; i < n - 1;++i)
if (a[j] < a[j][i + 1])
{
flag = true;
temp = a[j];
a[j] = a[j][i + 1];
a[j][i + 1] = temp;
}
}
}
for(int i = 0;i < n;++i){
for(int j = 0;j < n;++j)
printf("%d \t",a[j]);
printf("\n\n");
}
}
Если возникнут вопросы, буду всегда рад обратиться к вам, на ваш форум имхо с профессионалами общаться всегда приятно.
Еще раз спасибо.