Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с массивом на си

11K
10 сентября 2007 года
mitrof4nov
68 / / 10.09.2007
Только начал изучать этот язык, так что не ругайте строго :)
Подскажите пожалуйста как в массиве вещественных чисел, например {aij} (i=1,2,....n; j=1,2,...,m) произвести упорядочение по строке элементов в порядке убывания? Буду очень признателен за помощь.
2.0K
10 сентября 2007 года
WidowMaker
212 / / 05.04.2005
Пути два:
1. изучай алгоритмы сортировки;
2. изучай ман по qsort и компании
[COLOR="Red"]Свои общие советы держи при себе.Никто тут в них не нуждается.Нарушение -15 баллов за повторный флуд.Я тебя предупреждал,так что отдохни немного.[/COLOR]
m_Valery.
14K
10 сентября 2007 года
stimpi
100 / / 04.09.2007
ну вот решение твоей проблемы
Код:
#include <stdlib.h>
#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);
}
11K
11 сентября 2007 года
mitrof4nov
68 / / 10.09.2007
Подскажите пожалуйста как правильно вводятся элементы массива по строкам и столбцам, что бы запоминался индекс элемента. Ибо в результате должна выходить строка уже упорядоченных элементов со старыми индексами. Буду очень признателен. Спасибо. +никак не могу справиться с ошибкой, возникающей с i. Связана с инициализацией. Подскажите, будьте добры как ее можно исправить.
242
11 сентября 2007 года
Оlga
2.2K / / 04.02.2006
mitrof4nov, объясни нормально, что тебе надо. Преведи пример исходной матрицы(изначальной) и то, что должны получить.

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


а это как?

Цитата:
Буду очень признателен. Спасибо. +никак не могу справиться с ошибкой, возникающей с i. Связана с инициализацией.

код приведи, иначе никто не сможет помочь.

14K
11 сентября 2007 года
stimpi
100 / / 04.09.2007
Цитата: mitrof4nov
Подскажите пожалуйста как правильно вводятся элементы массива по строкам и столбцам, что бы запоминался индекс элемента. Ибо в результате должна выходить строка уже упорядоченных элементов со старыми индексами. Буду очень признателен. Спасибо.



int A[j] = <значение типа int>; A - матрица i - строка j - столбец

Цитата: mitrof4nov
+никак не могу справиться с ошибкой, возникающей с i. Связана с инициализацией. Подскажите, будьте добры как ее можно исправить.


приведи код

11K
11 сентября 2007 года
mitrof4nov
68 / / 10.09.2007
Код ваш же. Просто упорядочиваем по возрастанию первую строку массива.
14K
11 сентября 2007 года
stimpi
100 / / 04.09.2007
Смотри, qsort принимает 4 параметра:
1) указатель на элемент с которого нужно начать сортировку
2) кол-во символов которые надо упорядочить
3) размер который занимает 1 элемент массива в байтах
4) функция("правило") по которой будет происходить упорядочивание массива.

Измени в код как написано в комментарии и будет упорядочивать по возрастанию
 
Код:
int compare (const void * a, const void * b)
{
    return ( (*(int*)a >*(int*)b)? 0:1 ); //сортировка на убывание
    //меняешь "0:1" на "1:0" и сортирует по возрастанию
}


если тебе надо отсортировать только 1 строку (1вую например), то тебе надо убрать цикл
 
Код:
for(int i=0;i<LINE;i++)
    {
        qsort(&A[0],ROW,sizeof(int),compare); //сортировка
    }

и вместо него написать
 
Код:
qsort(A,ROW,sizeof(int),compare);
//или qsort(&A[0],ROW,sizeof(int),compare); где i-номер строки
//необходимую отсортировать (если 1вую строку i=0 если 2рую i=1 ...)


Элементы матрицы вводятся не по строкам и столбцам, они вводятся по 1 элементу при этом указывается расположение этого объекта в матрице
(A[j])

Цитата:
+никак не могу справиться с ошибкой, возникающей с i. Связана с инициализацией.


похоже ясно где у тебя выскакивает ошибка, дело в том что я пишу в Visual Studio 2003 .NET
напиши в начале тела main() {int i,j; ....} и поудаляй везде в циклах for int, должно работать

320
11 сентября 2007 года
m_Valery
1.0K / / 08.01.2007
Цитата: stimpi
Смотри, qsort принимает 4 параметра:
...


stimpi, автору не нужен qsort.Он только начал изучать язык,он сам же пишет.Ему надо создать массив,ввести элементы массива с клавиатуры или заполнить случайными числами.Ввести номер строки и отсортировать ее.Причем весь смысл этой задачи имхо как раз в том чтоб сделать сортировку самому,обычный пузерек.Все.

320
11 сентября 2007 года
m_Valery
1.0K / / 08.01.2007
Вот самый простой варимант с пузырьковой сортировкой.
Код:
#include "stdafx.h"
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,вводим номер строки,которую надо отсортировать по убыванию и сортируем.
14K
11 сентября 2007 года
stimpi
100 / / 04.09.2007
сортировка пузырьком
Код:
int STROKA = 0; // строка необходимую отсортировать
        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;
                }
            }
        }


опередили =)
11K
13 сентября 2007 года
mitrof4nov
68 / / 10.09.2007
Я немного не допонял, поправте пожалуйста, ибо язык изучать начал только только.
Вот код программы, массив ввел, вывел его на экран и использовал в нем сортировку пузырьком, как Вы писали выше. Если это верный вариант, то как организовать вывод на экран уже упорядоченного массива через printf? Подскажите пожалуйста, буду очень благодарен.

Код:
#include <stdio.h>
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;
                }
            }
        }


}
320
13 сентября 2007 года
m_Valery
1.0K / / 08.01.2007
Я ж дал решение.Чем оно тебе не подходит ?
Код:
const [COLOR="Red"]int [/COLOR]n=4;

        [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учайные числа ?
Много лишнего,переменные,которые нигде не используются...
Вывести после сортировки так же
 
Код:
for (i=0; i<=n-1; i++)
       {
           printf ("\n");
           {
               for (j=0; j<=n-1; j++)
                   printf ("%f", a[j]), printf (" ");
           }       
                }
14K
13 сентября 2007 года
stimpi
100 / / 04.09.2007
Цитата: mitrof4nov
Я немного не допонял, поправте пожалуйста, ибо язык изучать начал только только.
Вот код программы, массив ввел, вывел его на экран и использовал в нем сортировку пузырьком, как Вы писали выше. Если это верный вариант, то как организовать вывод на экран уже упорядоченного массива через printf? Подскажите пожалуйста, буду очень благодарен.



во-первых, ты уже выводишь на экран матрицу перед сортировкой, аналогичным образом выводишь и после сортировки
во-вторых у тебя объявлена переменная row, но ей не присвоено значения поэтому выдает ошибку, следует ей присвоить значение n.
+ в добавок ко всему ты объявил много не использованных переменных и массив ( l, ll, jj, p, baf, k, b[n], otw) зачем они для меня остается загадкой :confused: .
Исправленный код ниже

Код:
const n=4;

                // 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 (" ");
        }
    }
}
11K
13 сентября 2007 года
mitrof4nov
68 / / 10.09.2007
Подсказали другую реализацию, удачная?
Код:
#include <stdio.h>

#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, извините, но даже исправленный вами код не выполняет функцию сортировки по убыванию. Банально выводиться тот же массив.
14K
13 сентября 2007 года
stimpi
100 / / 04.09.2007
Цитата: mitrof4nov
Подсказали другую реализацию, удачная?
stimpi, извините, но даже исправленный вами код не выполняет функцию сортировки по убыванию. Банально выводиться тот же массив.



у меня все сортирует как надо с твоим кодом и моим дополнением, которое я привел.
Результат: сортирует 1вую строку массива по возрастанию.

320
13 сентября 2007 года
m_Valery
1.0K / / 08.01.2007
Цитата:
Подсказали другую реализацию, удачная?

Неудачная.Неправильный результат выводит.Я тебе повторяю,что решение есть.2 варианта.У тебя вариант stimpi не работает,потому что ты в код не смотришь(ждешь готовый результат),а он сортирует по возрастанию.Знак поменяй и все.

11K
14 сентября 2007 года
mitrof4nov
68 / / 10.09.2007
Строки необходимо отсортировать все, а не только первую. умаю это решается еще одним циклом.


m_Valery, Простите, какой знак?!
320
14 сентября 2007 года
m_Valery
1.0K / / 08.01.2007
Цитата: mitrof4nov
Строки необходимо отсортировать все, а не только первую. умаю это решается еще одним циклом.


m_Valery, Простите, какой знак?!


Знак > , тебе надо <
Правильно,думаешь,еще одним циклом.Но ты сам писал:

Цитата: mitrof4nov
Код ваш же. Просто упорядочиваем по возрастанию первую строку массива.


Вот,напримерТ так можешь сделать

Код:
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");
   }
   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");
   }
}
11K
14 сентября 2007 года
mitrof4nov
68 / / 10.09.2007
Спасибо, но не могли бы бы показать, пожалуйста, на примере кода Stimpi (последнего) вывод уже упорядоченных строк массива
11K
14 сентября 2007 года
mitrof4nov
68 / / 10.09.2007
Спасибо, но не могли бы бы показать, пожалуйста, на примере кода Stimpi (последнего) вывод уже упорядоченных строк массива.
320
14 сентября 2007 года
m_Valery
1.0K / / 08.01.2007
Код:
const int n = 4;
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");
   }
}
11K
14 сентября 2007 года
mitrof4nov
68 / / 10.09.2007
Спасибо большое. Пошел дальше доделывать остальные функции.
Если возникнут вопросы, буду всегда рад обратиться к вам, на ваш форум имхо с профессионалами общаться всегда приятно.
Еще раз спасибо.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог