|
|
|
Сортировка строк массива.
|
|||
|---|---|---|---|
|
#18+
Дан массив целых чисел, где n- количество строк, m - столбцов. Строки - это детали , столбцы - это этапы обработки. Нужно чтобы сортировался исходный массив чисел по признаку (сортировались строки) : чем ближе по модулю среднее время детали tcp[i] (строки) к среднему времени второго этапа TcpII (среднее значение 2-го столбца). Программа считает среднее время строк, среднее значение 2-го столбца. Проблема в том, что я не могу придумать как написать сортировку. То есть я придумал, но она не работает((. #include <stdio.h> #include <stdlib.h> #include <math.h> #define n 10 //строки #define m 3 //столбцы int main() { int i,j, temp, k; int a[n][m]; int t[n]; float tcp[n], TcpII, q[n], p; //FILE *in=fopen("C:\\Users\\Sergey\\Desktop\\filedata1.txt", "rt"); FILE *in=fopen("C:\\Users\\Sergey\\Desktop\\prog1\\data1.txt", "rt"); //FILE *in=fopen("C:\\Users\\Sergey\\Desktop\\prog1\\data1.txt", "rt"); //FILE *in = stdin; //FILE *out=fopen("C:\Users\Sergey\Desktop\filedata2.txt", "wt"); //FILE *in; //in = fopen("C:\Users\Sergey\Desktop\filedata1.txt","rt"); //memset(q,0,sizeof(q)); for (i=0;i < n;i++) { for (j=0;j < m;j++){ fscanf (in,"%d ",&a[i][j]); printf ("%d", a[i][j]); printf (" "); } printf("\n"); } for(i=0;i < n;i++) //считает среднее время второго этапа { // fscanf(in,"%d",&a[i][1]); // printf("a[i][1]= %d", a[i][1]); // printf(" ;"); if (i>0){ t[i]=a[i][1]+t[i-1];; } else { t[i]=a[i][1]; } // printf(" \n"); // printf("t[i]= %d\n", t[i]); p=t[i]; } TcpII=p/i; printf("TcpII: %f\n", TcpII); //выводит среднее время второго этапа for(i=0;i<n;i++) //считает среднее время каждой детали { for(j=0;j<m;j++) { fscanf(in,"%d",&a[i][j]); if (j>0) { t[j]=a[i][j]+t[j-1]; } else { t[j]=a[i][j]; } p=t[j]; } // printf("p= %d\n", p); tcp[i]=p/j; printf("tcp: %f\n", tcp[i]); //выводит значение среднего времени детали } for (i=0; i<n; i++) { q[i]=abs(TcpII - tcp[i]); //проверка на близость к значению среднего времени второго этапа printf("%f\n", q[i]); } for(i=0;i<n;i++) //СОРТИРОВКА { k=0; for(k=i;k<n;k++) { if(q[i]>q[k]) { for(j=0;j<m;j++) { temp = a[i][j]; a[i][j] = a[k][j]; a[k][j] = temp; //printf("a[i][j]= %d", a[i][j]); } } } } for(i=0;i<n;i++) { for(j=0;j<m;j++) { printf("a[i][j]= %d", a[i][j]); //printf("q= %f \n ", q[i]); } printf("\n"); } //тут будет проверка на непересечение //тут будет подсчет всего времени на каждом этапе и во return(0); } на скрине видно что она неправильно сортирует ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2015, 18:12 |
|
||
|
Сортировка строк массива.
|
|||
|---|---|---|---|
|
#18+
vincent111, Не пиши сортировку сам, использую готовую. qsort() или std::sort() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2015, 18:15 |
|
||
|
Сортировка строк массива.
|
|||
|---|---|---|---|
|
#18+
а как эту готовую использовать? я не очень силен в C, поэтому пользуюсь простыми циклами. Если не трудно - напиши как должна выглядеть сортировка с qsort ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2015, 18:18 |
|
||
|
Сортировка строк массива.
|
|||
|---|---|---|---|
|
#18+
Возьми любую сортировку с callback-функцией сравнения. А эту функцию (ранжирующую по отклонению) напиши сам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2015, 18:33 |
|
||
|
Сортировка строк массива.
|
|||
|---|---|---|---|
|
#18+
т.е. нужно записать цикл ( от 1 до n для строк) с qsort. А в самой qsort в конце указать функцию сортировки? qsort(vector, 6, sizeof(int), compare); compare - это та функция сортировки, которую нужно придумать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2015, 19:11 |
|
||
|
Сортировка строк массива.
|
|||
|---|---|---|---|
|
#18+
int compare(const void *a, const void *b) { return *(int*)a - *(int*)b; } qsort(a, n, sizeof(int), compare); не могу понять как изменить функцию compare для моего примера ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2015, 01:05 |
|
||
|
Сортировка строк массива.
|
|||
|---|---|---|---|
|
#18+
vincent111, в твоем случае функция сравнения должна сравнивать между собой не элементы массива, а их отклонения от предварительно вычисленной константы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2015, 10:54 |
|
||
|
Сортировка строк массива.
|
|||
|---|---|---|---|
|
#18+
vincent111int compare(const void *a, const void *b) { return *(int*)a - *(int*)b; } qsort(a, n, sizeof(int), compare); не могу понять как изменить функцию compare для моего примера ну, тогда в школу, учиться... Найди любой учебник, почитай... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2015, 08:43 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=38967171&tid=1341018]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
177ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 238ms |
| total: | 489ms |

| 0 / 0 |
