Среди элементов массива Z (m) найти k (k « m) крупнейших - C (СИ)

  1. Среди элементов массива Z (m) найти k (k « m) крупнейших. Поиск осуществить за один проход (просмотр) массива Z


textual

Код к задаче: «Среди элементов массива Z (m) найти k (k « m) крупнейших - C (СИ)»

#include <u.h>
#include <libc.h>
 
#define MAXUINT ((uint)-1)
#define MAXINT  (MAXUINT>>1)
#define MININT  (MAXINT+1)
 
#define M 10
#define K 5
 
void
printv(int v[], int n)
{
    int i;
    for (i = 0; i < n; i++)
        print("%d ", v[i]);
    print("\n");
}
 
void
main(void)
{
    int i, j, k, v[M], vmax[K];
 
    srand(nsec());
    for (i = 0; i < M; i++)
        v[i] = nrand(M);
 
    for (i = 0; i < K; i++)
        vmax[i] = MININT;
 
    for (i = 0; i < M; i++) {
        k = -1;
        for (j = 0; j < K; j++)
            if (v[i] > vmax[j]) {
                k = j;
                break;
            }
        if (k < 0)
            continue;
        for (j = K - 1; j > k; j--)
            vmax[j] = vmax[j-1];
        vmax[k] = v[i];
    }
 
    printv(v, M);
    printv(vmax, K);
 
    exits(0);
}

СДЕЛАЙТЕ РЕПОСТ

12   голосов, оценка 3.833 из 5



Похожие ответы
  1. Задана последовательность из N вещественных чисел. Определить сколько чисел меньше K, равно K и больше K. (массив random )

  1. Добрый вечер! Дан массив M*N. Необходимо отсортировать ее по строкам так, чтобы вначале шли все положительные элементы, отсортированные по убыванию, а затем все остальные, отсортированные по возрастанию (если в строке имеются нули - переставить их в конец строки). Вывести получившуюся матрицу. У меня проблема с перестановкой нулей. C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 #include     int main()     {   int N, M,t, i,j,k, mas[10][10]={0}, q;         printf("VVEDITE N,M \n");     scanf("%d%d", &N,&M);     printf("VVEDITE MASSIV \n");       for (i=0; i < N; i++)        for (j=0; j < M; j++)            scanf ("%d", &mas[i][j]);       for(k = 0; k < N; k++){     for(i = 0 ; i < M; i++){         for(j = i + 1; j < M; j++){               if((mas[k][i] < mas[k][j]) && (mas[k][i]!=0)){                       t = mas[k][i];                     mas[k][i] = mas[k][j];                     mas[k][j] = t;               }         }     } }   if (mas[i][j]<0) {     } {   for(k = 0; k < N; k++){         for(i = 0 ; i < M; i++){             for(j = i + 1; j < M; j++){                   if(mas[k][i] < mas[k][j]) {                       t = mas[k][i];                     mas[k][i] = mas[k][j];                     mas[k][j] = t;               }         }     } } } for(i = 0 ; i < M; i++)     {         for(j = 0; j < M; j++)             if (mas[i][j]==0)         {                 for ( q = j; q < N-1 ; q++)                 {                     mas[i][q] = mas[i][q + 1];                 }                 mas[N-1][M-1] = 0;           }     }   for (i=0; i < N; i++)        {for (j=0; j < M; j++)               printf ("%d\t", mas[i][j]);        printf (" \n");}   getch();}

  1. C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 void save_birnar(){ int i; FILE *fp; fp = fopen( "output.bin", "ab+" ); int N=100; for ( i = 0; i < N; i ++ )     fp = fopen( "output.bin", "ab+" ); // открыть двоичный файл на запись fwrite ( contacts[i].name, sizeof(contact), fp ); fwrite ( contacts[i].last_name, sizeof(contacts), N, fp ); // записать весь массив fwrite ( contacts[i].number, sizeof(contact), N, fp ); fwrite ( contacts[i].viber, sizeof(contact), N, fp ); fclose ( fp ); // закрыть файл   }Столкнулась с проблемой не могу сохранить структуруC1 2 3 4 5 6 7 8 struct contact { char name[30]; char last_name[30]; char number[30]; char viber[10]; int del; } *contacts;в двоичный фаил, не могу пользоваться нормально функцией fwrite. Вопрос, как записать массив структур в фаил и как прочитать потом данный фаил для дальнейшей работы с ним?

  1. Сформировать массив из элементов исходных массивов, больших второго элемента первого массива и положительных элементов второго массива. Требуется сформировать новый массив по заданию. В программе реализовать: 1) генерацию случайным образом элементов исходных массивов; 2) выполнение действия в соответствии с условием задачи; 3) порядок вывода: • исходные массивы, • сформированный массив, если он был сформирован. В противном случае – соответствующее сообщение. Помогите, а то не могу сделать

  1. C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 #include   double sum2d(int a, int b, const double  mass[a][b]);   int main(void) {     const int YEARS = 5;     const int MONTHS = 12;     const float rain[YEARS][MONTHS] =     {         { 4.3, 4.3, 4.3, 3.0, 2.0, 1.2, 0.2, 0.2, 0.4, 2.4, 3.5, 6.6 },         { 8.5, 8.2, 1.2, 1.6, 2.4, 0.5, 2.0, 9.0, 3.0, 9.1, 4.7, 3.0 },         { 9.1, 8.5, 6.7, 4.3, 2.1, 0.8, 0.2, 0.2, 1.1, 2.3, 6.1, 8.4 },         { 7.2, 9.9, 8.4, 3.3, 1.2, 0.8, 0.4, 0.0, 0.6, 1.7, 4.3, 6.2 },         { 7.6, 5.6, 3.8, 2.8, 3.8, 0.2, 0.0, 0.0, 0.0, 1.3, 2.6, 5.2 },     };       printf("Среднегодовое количество осадков за 5 лет = %f",sum2d(YEARS, MONTHS, rain[YEARS][MONTHS])/YEARS); return 0; }   double sum2d(int a, int b, const double  mass[a][b]) {     int i, j;     int total;     double **pt;     **pt = mass[0][0];       for (i = 0; i < a; ++i)     {         for(j = 0; j < b; ++j)         {             total+=**pt;             ++pt;         }     } return total; }При компиляции помимо куци предупреждений выдается следующие ошибки: rain.c:20:2: error: incompatible type for argument 3 of ‘sum2d’ printf("Среднегодовое количество осадков за 5 лет = %f",sum2d(YEARS, MONTHS, rain[YEARS][MONTHS])/YEARS); ^ rain.c:3:8: note: expected ‘const double (*)[(sizetype)(b)]’ but argument is of type ‘float’ double sum2d(int a, int b, const double mass[a][b]);Добавлено через 23 секунды по заданию считать нужно с применением указателей.

  1. Найти максимальный элемент и поменять его местами с последним элементом массива. В программе предусмотреть и реализовать: 1) генерацию элементов исходного массива с помощью датчика случайных чисел; 2) выполнение в соответствии с условием задачи; 3) порядок вывода: • исходный массив, • максимальный или минимальный элемент массива и его номер, • массив, полученный в результате выполнения задания.

  1. Заполнить одномерный массив случайными числами. Вывести на экран все элементы массива, являющимся двухзначными числами. Буду благодарен)))

  1. Приветствую всех. Долго мучался, как же сформулировать вопрос, и все таки... Есть массив строк(аля char**) в цикле он заполняется(в функцию, где это происходит просто кидают большую строку со '\n'-ами, а в функции в цикле она разбивается на несколько строк). Так вот, в самом цикле все нормально происходит, а вот при выходе на месте первого элемента массива строк красуются несколько(всегда 3) кракозябер, в то время, как с остальными строчками все нормально. Не можете подсказать что либо по этому поводу?? Собственно код функции C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 unsigned int menu(unsigned int mask, char* str){     FILE* flog = fopen("menu.log", "w+");     char **txt = (char**)malloc(sizeof(char*));     int i = 0;     int j = 0;     do{         txt[i] = (char*)malloc(32*sizeof(char));         int k = 0;         k = snprintf(txt[i], 32, "%d. ", i + 1);         txt[i] = (char*)realloc(txt[i], (k + 2)*sizeof(char));         do{             txt[i][k] = str[j]; fprintf(flog, "  j=%i, k=%i, txt[%i][%i]=%c.\n", j, k, i, k, txt[i][k]);             txt[i] = (char*)realloc(txt[i], (k + 2)*sizeof(char));             j++; k++;         }while(str[j - 1] != '\n');         txt[i][k] = '\0';         i++;     }while(str[j] != '\0');       if(mask < 1 || mask >= (1 << i + 1))         return 0;       for (int h = 0; h < i; h++)         fprintf(flog, "txt[%i]=%s\n", h, txt[h]);         int b = 0;     unsigned int l = 0;     for(int l = 1; l < (2 << i); l *= 2, b++){         fprintf(flog, "i=%i, l=%i, (2 << i)=%i, b=%i.\n",i ,l, 2 << i, b);         if(l & mask){             printf("%s", txt[b]);         }     }     fclose(flog);     do{         printf("Выберите действие(Введите число): ");         scanf("%i", &l);     }while(!((mask >> (l - 1)) & 1));         for(int c = 0; c < i; c++)         free(txt[c]);     free(txt);     return l; } p. s. string.h низзя.

  1. Заполнить одномерный массив вводом с клавиатуры. Выяснить верно ли что сумма элементов массива есть чётное число.

  1. Я написала программу с двумя элементами ввода массивов, но результат выводит не неверный и после выбора ручного ввода программа вылетает. Помогите пожалуйстаC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 #include #include #include #include #include #include #define N 500 #define MIN 80 int main(void) { setlocale (0, "rus"); int a[N],n,i, min=a[0], nummin=0, sum=0, nol=0, k; srand((unsigned)time(NULL)); printf ( " Определите характер заполнения: 1- автоматическое, 2- вручную"); printf("\n"); scanf("%d",&k);   switch(k) { case 1: { printf("vvedite n - "); scanf("%d",&n); for (i=0; ia[i])           {               printf("\n");               min=a[i];              nummin=i;}         for (i=nummin+1; i