Advertisement
Vanya_Shestakov

Untitled

Oct 4th, 2020 (edited)
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 32.82 KB | None | 0 0
  1. // Реверс (переворот) информации в массиве во введенном интервале [i1 , i2]
  2. // i1, i2 - границы интервала (вводятся с клавиатуры)
  3. #include <stdio.h>
  4. #include <conio.h>
  5. #include <windows.h>
  6. #include <locale.h>
  7. #define kl 10        // размерность массива (глобальная константа)
  8.  
  9. int main()
  10. {
  11.     setlocale(LC_ALL, "Russian");     // русификация вывода информации на экран
  12.     int ms[kl], i, i1, i2, kk;        // объявление локальных данных
  13.     printf("\nВведите массив");       // приглашение на ввод массива
  14.     for (i = 0; i<kl; i++)            // цикл по ввода массива поэлементно
  15.     {
  16.         printf("\nВведите ms[%d] = ", i);
  17.         scanf("%d", &ms[i]);
  18.     }
  19.     do                                 // цикл ввода чисел (границ интервала)  
  20.     {                                  // с проверкой на корректность ввода
  21.         system("CLS");                 // очистка экрана
  22.         printf("введите 2 числа (первое меньшее, второе большее)\n");
  23.         fflush(stdin);                     // чистка буфера ввода
  24.         kk = scanf_s("%d%d", &i1, &i2);    // ввод границ интервала последовательности (массива)
  25.     } while (kk<2 || i1>i2);               // цикл повторяется пока корректно введено меньше 2 чисел
  26.                                            // или индекс начала интервала > индекса конца интервала
  27.     system("CLS");
  28.     printf("\nИсходный масссив : ");     // вывод исходного массива
  29.     for (i = 0; i < kl;  i++)            // цикл по строкам массива
  30.         printf("%4d", ms[i]);
  31.     printf("\n");
  32.     for (; i1 < i2; i1++, i2--)          // цикл пока i1 < i2, т.е. пока границы (левая и правая)
  33.     {                                    // не сойдутся
  34.         kk = ms[i1];                     // запоминаем значение элемента по индексу i1 в kk
  35.         ms[i1] = ms[i2];                 // заносим в элемент с индексом i1 значение элемента с индексом i2
  36.         ms[i2] = kk;                     // переписываем значение из kk в элемент с индексом i2
  37.     }
  38.    
  39.     printf("\nПреобразованный массив : ");  // вывод массива
  40.     for (i = 0; i<kl; i++)               // цикл по строкам массива
  41.         printf("%4d", ms[i]);
  42.     printf("\n");
  43.     return 0;
  44. }
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57. // Транспонировать матрицу относительно главной диагонали
  58. #include <stdio.h>
  59. #include <conio.h>
  60. #include <windows.h>
  61. #include <locale.h>
  62. #define nn 3
  63.  
  64. void main()
  65. {
  66.     setlocale(LC_ALL, "Russian");     // русификация вывода информации на экран
  67.     int mas[nn][nn], i, j, kk;
  68.     printf("\nВведите матрицу");      // ввод массива
  69.     for (i = 0; i<nn; i++)            // цикл по строкам массива
  70.     {
  71.         printf("\nВведите строку %d  ", i);
  72.         for (j = 0; j<nn; j++)        // цикл по столбцам массива
  73.             scanf("%d", &mas[i][j]);
  74.     }
  75.     system("CLS");
  76.     printf("\nИсходная матрица");     // вывод исходного массива
  77.     for (i = 0; i<nn; i++)            // цикл по строкам массива
  78.     {
  79.         printf("\n");
  80.         for (j = 0; j<nn; j++)        // цикл по столбцам массива
  81.             printf("%5d", mas[i][j]);
  82.     }
  83.     /*************
  84.     //       ====    for(){...}
  85.     for(i=0;i<nn;i++)
  86.     for(j=i+1;j<nn;j++)
  87.     { kk=mas[i][j];
  88.       mas[i][j]=mas[j][i];
  89.       mas[j][i]=kk;
  90.     }
  91.     **************
  92.     //       ====    do{...}while()
  93.     i=0;
  94.     do
  95.     { j=i+1;
  96.       do
  97.       {  kk=mas[i][j];
  98.          mas[i][j]=mas[j][i];
  99.          mas[j][i]=kk;
  100.          j++;
  101.       }while(j<nn);
  102.       i++;
  103.     }while(i<nn);
  104.     **************/
  105.     //       ====    while(){...}
  106.     i = 0;
  107.     while (i<nn)
  108.     {
  109.         j = i + 1;
  110.         while (j<nn)
  111.         {
  112.             kk = mas[i][j];
  113.             mas[i][j] = mas[j][i];
  114.             mas[j][i] = kk;
  115.             j++;
  116.         };
  117.         i++;
  118.     };
  119.  
  120.     printf("\nТранспонированная матрица"); /*вывод массива*/
  121.     for (i = 0; i<nn; i++)          /*цикл по строкам массива*/
  122.     {
  123.         printf("\n");
  124.         for (j = 0; j<nn; j++)        /*цикл по столбцам массива*/
  125.             printf("%5d", mas[i][j]);
  126.     }
  127. }
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134. #include <stdio.h>
  135. #include <conio.h>
  136. #include <windows.h>
  137. #include <locale.h>
  138.  
  139. void srt1(int, int *);
  140. void srt2(int, int *);
  141. void srt3(int, int *);
  142. void shaker(int, int *);
  143. void shell(int,int *);
  144.  
  145. int main()
  146. {
  147.     const int n = 7;                  // размерность массива ms
  148.     int ms[n], i, c;
  149.     setlocale(LC_ALL, "Russian");     // русификация вывода информации на экран                                  
  150.     do
  151.     {
  152.         system("CLS");
  153.         for (i = 0; i<n; i++)
  154.         {
  155.             printf("ms[%2d]= ", i);
  156.             scanf("%d", &ms[i]);
  157.         }
  158.         system("CLS");
  159.         printf("\nИсходный масссив : ");  // вывод исходного массива 1
  160.         for (i = 0; i < n; i++)          
  161.             printf("%4d", ms[i]);
  162.         printf("\nвыберите метод сортировки");
  163.         printf("\n1 - через отбор");
  164.         printf("\n2 - сортировка вставками");
  165.         printf("\n3 - методом пузырька");
  166.         printf("\n4 - шейкер сортировка");
  167.         printf("\n5 - сортировка Шелла\n");
  168.         scanf("%d", &i);
  169.         switch (i)
  170.         {
  171.            case 1: srt1(n, ms); break;
  172.            case 2: srt2(n, ms); break;
  173.            case 3: srt3(n, ms); break;
  174.            case 4: shaker(n, ms); break;
  175.            case 5: shell(n, ms); break;
  176.            default: printf("ошибка в выборе метода сортировки");
  177.         }
  178.         printf("\nИсходный масссив : ");  // вывод отсортированного массива 1
  179.         for (i = 0; i<n; i++) printf("%3d ", ms[i]);
  180.         fflush(stdin);
  181.         printf("\n\nвыполнить сортировку еще (y/n).. ");
  182.         c = getch();
  183.     } while (c == 'y' || c == 'Y');
  184.     return 0;
  185. }
  186.  
  187. // сортировка массива  методом "ЧЕРЕЗ ОТБОР"
  188. void srt1(int kl, int *ms)
  189. {
  190.     int i, j, m, kk;
  191.     for (i = 0; i<kl - 1; ++i)
  192.     {
  193.         m = i;                     // индекс элемента для упорядочивания
  194.         kk = ms[i];                // значение элемента
  195.         for (j = i + 1; j<kl; ++j) // перебор последующих эл-тов справа от i-го
  196.         if (ms[j]<kk)              // найден меньший
  197.         {
  198.             m = j;                 // запоминаем его индекс и значение
  199.             kk = ms[j];
  200.         }
  201.         ms[m] = ms[i];             // замена выбранного и меньшего
  202.         ms[i] = kk;
  203.     }
  204. }
  205.  
  206. // сортировка массива  методом " ВСТАВКИ "  
  207. void srt2(int kl, int ms[])
  208. {
  209.     setlocale(LC_ALL, "RUS");  
  210.     int i, j, kk;
  211.     for (i = 1; i<kl; ++i)        // индекс элемента для упорядочивания
  212.     {
  213.         j = i - 1;                // индекс предыдущего элемента
  214.         kk = ms[i];               // значение предыдущего элемента
  215.         while (j >= 0 && kk<ms[j])
  216.             ms[j-- + 1] = ms[j];  // сдвиг всех элементов направо
  217.         ms[j + 1] = kk;           // запись в освободившийся или в тот же элемент
  218.     }
  219. }
  220.  
  221. // сортировка чисел методом "ПУЗЫРЬКА"
  222. void srt3(int kl, int *ms)
  223. {
  224.     int i, j, m;
  225.     for (i = 0; i<kl - 1; ++i)     // цикл выбора элементов до последнего к упорядочиванию
  226.     for (j = kl - 1; j>i; --j)     // цикл перебора эл-тов с конечного до i-го
  227.     {
  228.         if (ms[j - 1]>ms[j])       // если (j-1)-й > j-го элемента, то
  229.         {                          // выполныется их перестановка
  230.             m = ms[j - 1];
  231.             ms[j - 1] = ms[j];
  232.             ms[j] = m;
  233.         }
  234.     }
  235. }
  236.  
  237. //  "Шейкер"  сортировка чисел
  238. void shaker(int kl, int *ms)
  239. {
  240.     register int i, a, b, c, d;
  241.     c = 1;
  242.     b = kl - 1;   //номер элемента на котором остановка
  243.     d = kl - 1;   //номер стартового элемента для сортировки справа налево
  244.     do
  245.     {
  246.         for (i = d; i >= c; --i)    // цикл попарного сравнения элементов
  247.         {                           // справа налево по массиву
  248.             if (ms[i - 1]>ms[i])    // выполняется условие перестановки
  249.             {                       // (i-1)-ого и i-го элемента
  250.                 a = ms[i - 1];
  251.                 ms[i - 1] = ms[i];
  252.                 ms[i] = a;
  253.                 b = i;              // запоминаем крайний слева упорядоченный элемент
  254.             }
  255.         }
  256.         c = b + 1;                  // номер стартового элемента для сортировки слева направо
  257.         for (i = c; i <= d; ++i)    // аналогично предыдущему циклу, но движение
  258.         {                           // слева направо по массиву
  259.             if (ms[i - 1]>ms[i])
  260.             {
  261.                 a = ms[i - 1];
  262.                 ms[i - 1] = ms[i];
  263.                 ms[i] = a;
  264.                 b = i;              // крайний слева упорядоченный элемент
  265.             }
  266.         }
  267.         d = b - 1;
  268.     } while (c <= d);
  269. }
  270.  
  271. // "Шелл" сортировка чисел
  272. void shell(int kl, int ms[])
  273. {
  274.     register int i, j, dp, a;
  275.     for (dp = kl / 2; dp>0; dp /= 2)
  276.     for (i = dp; i<kl; i++)
  277.     for (j = i - dp; j >= 0 && ms[j]>ms[j + dp]; j -= dp)
  278.     {
  279.         a = ms[j];
  280.         ms[j] = ms[j + dp];
  281.         ms[j + dp] = a;
  282.     }
  283. }
  284.  
  285.  
  286.  
  287. #include <stdio.h>
  288. #include <conio.h>
  289. #include <stdlib.h>
  290. #include <locale.h>
  291. #include <windows.h>
  292.  
  293. int str_len(char *);
  294. char *getstr(char *);
  295. int get_str(char *, int);
  296. int atoi(char *s);
  297. void itoa(int , char *);
  298. int str_cmp(char *, char *);
  299. char * strcat(char *, char *, int);
  300.  
  301. int main()
  302. {
  303.     setlocale(LC_ALL, "Russian");
  304.     char *s1, *s2;
  305.     int n, n1, n2;
  306.     double d;
  307.     do
  308.     {
  309.         system("CLS");
  310.         fflush(stdin);
  311.         printf("введите размерность ПЕРВОЙ строки = ");
  312.     } while (!scanf("%d", &n1) || n1 <= 0);
  313.     if (!(s1 = (char *)calloc(n1, sizeof(char))))
  314.     {
  315.         printf("\nНедостаточно свободной памяти \n");
  316.         return 0;
  317.     }
  318.     do
  319.     {
  320.         system("CLS");
  321.         fflush(stdin);
  322.         printf("введите размерность ВТОРОЙ строки = ");
  323.     } while (!scanf("%d", &n2) || n2 <= 0);
  324.     if (!(s2 = (char *)calloc(n2, sizeof(char))))
  325.     {
  326.         printf("\nНедостаточно свободной памяти \n");
  327.         free(s1);
  328.         return 0;
  329.     }
  330.  
  331.     printf("Вводите первую строку  ");
  332.     fflush(stdin);
  333.     printf("\n строка %s", getstr(s1)); //ввод-вывод первой строки
  334.     printf("\nДлина первой строки == %d байт", str_len(s1));
  335.     d = atof(s1);
  336.     printf("\nЗначение числа (double) в строке %s == %lf \n", s1, d);
  337.     printf("\nДлина второй строки == %d байт", get_str(s2, n2));
  338.     printf("\nЗначение числа (int) в строке %s == %d ", s2, atoi(s2));
  339.     printf("\nВводите число для перевода в строку  ");
  340.     scanf("%d", &n);
  341.     itoa(n, s2);
  342.     printf("\n строка %s", s2);
  343.     if (str_cmp(s1, s2)>0) printf("\nСтрока 1 > строки 2");
  344.     else if (str_cmp(s1, s2)<0) printf("\nСтрока 1 < строки 2");
  345.     else printf("\nСтрока 1 = строке 2");
  346.     s1 = strcat(s1, s2, 3);                // РАЗОБРАТЬСЯ (здесь возникает проблема !!!!!!!!!!!!!)
  347.     printf("\nстрока (s1+s2) == %s", s1);
  348.     return 0;
  349. }
  350.  
  351. // ввод строки по адресу переданному в нее
  352. char *getstr(char *st)
  353. {
  354.     if (!st) return nullptr;   // передан указатель на невыделенную под строку память
  355.     int i = 0;
  356.     // в цикле символы заносятся в строку из буфера клавиатуры
  357.     // до тех пор пока не будет нажата клавиша ENTER
  358.     while ((*(st + i++) = (char)getchar()) != '\n');
  359.     st[--i] = '\0';    // добавляем в конец строки символ '\0'
  360.     return st;            // выход из функции
  361. }
  362.  
  363. // ввод строки и подсчет ее длины
  364. // get_str возвращает значение типа int
  365. // в указатель st копируется указатель на строку для ввода
  366. int get_str(char *st, int k)
  367. {
  368.     int c, i = 0;
  369.     printf("\nВводите вторую строку  ");
  370.     // в цикле символы заносятся в строку из буфера клавиатуры
  371.     // до тех пор пока не будет нажата клавиша ENTER или
  372.     // из буфера не будет получен k-1 символ
  373.     while (--k>0 && (c = getchar()) != EOF && c != '\n')
  374.         st[i++] = c;    // ввод строки до заданного кол-ва символов или пока
  375.                         // не нажата клавиша Enter или Ctrl + Z
  376.     st[i] = '\0';
  377.     return i;    // возврат длины строки
  378. }
  379.  
  380. // определение длинны строки
  381. int str_len(char *st)
  382. {
  383.     int n = 0;
  384.     for (; st[n] != '\0'; n++);
  385.     return n;
  386. }
  387.  
  388. // перевод цифровой символьной строки в signed int
  389. int atoi(char *st)
  390. {
  391.     int n, i = 0, znak;
  392.     while (st[i] == ' ') i++;
  393.     if (!st[i]) return 0;              // в строке одни пробелы
  394.     znak = (st[i] == '-') ? -1 : 1;    // запоминаем знак числа
  395.     if (st[i] == '+' || st[i] == '-')  // пропуск знака в строке
  396.         i++;
  397.     for (n = 0; st[i] >= '0' && st[i] <= '9'; i++)  // выбор символа цифры числа из строки
  398.         n = 10 * n + (st[i] - '0');    // формирование числа из цифр строки
  399.     return znak*n;                     // возврат числа со знаком
  400. }
  401.  
  402. // перевод числа типа signed int в символьную строку
  403. void itoa(int n, char *st)
  404. {
  405.     int i = 0, znak;
  406.     if ((znak = n)<0)            // сохраняем знак
  407.         n *= -1;                 // n - положительное число
  408.     do                // (ВАЖНО!!!) цифры заносим в строку в обратном порядке
  409.     {
  410.         st[i++] = n % 10 + '0';  // выделяется последняя справа цифра числа (как символ)
  411.     } while ((n /= 10)>0);       // удаляется эта цифра из числа путем целочисленного деления на 10
  412.  
  413.     if (znak<0) st[i++] = '-';   // добавляем в конец строки знак числа
  414.     st[i] = '\0';
  415.     for (n = 0; n < i/2; n++)    // цикл переворота (реверса) полученной строки
  416.     {
  417.         st[n] += st[i - 1 - n];
  418.         st[i - 1 - n] = st[n] - st[i - 1 - n];
  419.         st[n] -= st[i - 1 - n];
  420.     }
  421. }
  422.  
  423. // функция сравнения двух строк
  424. int str_cmp(char *st1, char *st2)
  425. {
  426.     while (*st1)     // истина пока не достигнут конец ('\0') строки s1
  427.     if (*st1 - *st2) return *st1 - *st2;  // >0 если ASCII-код  *s1 > *s2
  428.                                           // иначе <0
  429.     else                                  // при совпадении символов переход
  430.     {
  431.         st1++;                            // к анализу следующей пары символов
  432.         st2++;
  433.     }
  434.     return *st1 - *st2;  // строки либо полностью совпали либо одна окончилась
  435. }
  436.  
  437. //  -------------------------
  438. //  for (;*s==*t; s++,t++)
  439. //  if(!*s) return 0;
  440. //  return *s-*t;
  441. //  --------------------------
  442.  
  443. // функция вставки (добавления) в строку st1 строки st2
  444. // с позиции k
  445. char * strcat(char *st1, char *st2, int k)
  446. {
  447.     char *ss;
  448.     int i, n;
  449.     if (k>str_len(st1)) k = str_len(st1); // проверка куда вставлять строку st2
  450.                                           // перевыделение памяти для новой строки st1
  451.     st1 = (char*)realloc(st1, str_len(st1) + str_len(st2) + 1);
  452.     for (i = str_len(st1); i >= k; i--)   // сдвиг в строке st1 второй части (до позиции k)
  453.         *(st1 + i + str_len(st2)) = *(st1 + i); // вправо
  454.     for (i = 0; i<str_len(st2); i++)      // перезапись второй строки st2 в строку st1
  455.         *(st1 + k + i) = *(st2 + i);      // с позиции k
  456.     return st1;
  457. }
  458.  
  459.  
  460.  
  461.  
  462. // пример работы с двумерным массивом (матрицей)
  463. // используя УКАЗАТЕЛЬ на УКАЗАТЕЛЬ
  464. #include <stdio.h>
  465. #include <conio.h>
  466. #include <locale.h>
  467. #include <windows.h>
  468. #include <stdlib.h>
  469.  
  470. int Vvod(int **MS, int n_str, int n_stl)
  471. {
  472.     int i, j, fl;
  473.     if (!MS)                           // проверка не нулевой ли указатель
  474.     {
  475.         puts("память для массива (матрицы) не выделена");
  476.         return 1;
  477.     }
  478.     printf("\nВвод массива (матрицы)\n");
  479.     for (i = 0; i < n_str; i++)        // цикл по строкам массива(матрицы)
  480.     for (j = 0; j < n_stl; j++)        // цикл по элементам строки (столбцам) массива(матрицы)
  481.     {
  482.         printf("MS[ %d ][ %d ] = ", i, j);
  483.         fflush(stdin); //rewind(stdin);        // чистка входного буфера
  484.         if (!scanf("%d", *(MS + i) + j)) j--;  // проверка введено ли число
  485.         // if (!scanf("%d", &MS[i][j]));       // можно использовать и MS[i][j]
  486.     }
  487.     return 0;
  488. }
  489.  
  490. void Print(int **MS, int n_str, int n_stl)  
  491. {
  492.     int i, j;
  493.     if (!MS)                              // проверка не нулевой ли указатель
  494.     {
  495.         puts("память для массива (матрицы) не выделена");
  496.         return;
  497.     }
  498.     printf("\n");
  499.     for (i = 0; i < n_str; i++)           // цикл по строкам массива(матрицы)
  500.     {
  501.         for (j = 0; j < n_stl; j++)       // цикл по элементам строки (столбцам) массива(матрицы)
  502.             printf("%4d", *(*(MS + i) + j));      
  503.             // printf("%4d", MS[i][j]);   // можно использовать и MS[i][j]
  504.         printf("\n");
  505.     }
  506. }
  507.  
  508. //--------------------------------------------- пример 1 -----------------------------------
  509. // пример работы с двухмерным массивом через указатель на указатель
  510. // найти выше главной диагонали max ст-ц и ниже min
  511. int main()
  512. {
  513.     setlocale(LC_ALL, "Russian");
  514.     int **p, n, s, i, j, j1, j2, sum1, sum2, sum;
  515.     do
  516.     {
  517.         system("CLS");
  518.         printf("\nвведите размерность квадратной матрицы\n");
  519.         i = scanf("%d", &n);
  520.         if (i<1)
  521.         {
  522.             fflush(stdin);  // чистка буффера клавиатуры при ошибке ввода
  523.             continue;       // повтор цикла
  524.         }
  525.         s = n;             // матрица квадратная (число строк=числу столбцов)
  526.         if (!(p = (int **)malloc(sizeof(int*)*n)))
  527.             printf("\nНедостаточно свободной памяти \nУуменьшите число строк массива");
  528.         for (i = 0; i<n; i++) // цикл выбора указателя на строку матрицы
  529.         if (!(*(p + i) = (int *)malloc(sizeof(int)*s))) // выделение памяти под строку матрицы
  530.         {                                               // с проверкой выделена ли память
  531.             printf("\nНедостаточно свободной памяти \nУуменьшите число ст-цов массива");
  532.             for (j = 0; j<i; j++) free(*(p + j)); free(p); // освобождение памяти при ошибке
  533.             p = nullptr;   // сброс указателя для повтора операции выделения памяти
  534.             break;         // выход из цикла по i (выбора указателя на строку матрицы)
  535.         }
  536.     } while (!p);          
  537.  
  538.     Vvod(p, n, s);
  539.     system("CLS");
  540.     printf("\nВведенный массив");
  541.     Print(p, n, s);
  542.     sum = 0;               // sum - переменная для накопления текущей суммы (выше/ниже) диагон.
  543.                                    // sum1 и sum2 - переменные (контрольные) для анализа сумм                               // в анализир. ст-це с их начальной инициализацией
  544.     sum1 = *(*p + 1);              // для поиска max ст-ца выше диагонали (верхний эл-т второго ст-ца)
  545.     sum2 = *(*(p + n - 1) + s - 2);// для поиска min ст-ца ниже диагонали (нижний эл-т предпосл. ст-ца)
  546.     j1 = 1; j2 = s - 2;            // стартовые номера ст-цов (второй и предпоследний)
  547.     for (j = 0; j<s; j++)          // цикл выбора очередного столбца матрицы к анализу
  548.     {
  549.         for (i = 0; i<n; i++)      // цикл по элементам этого (j-го) ст-ца
  550.         if (i != j) sum += *(*(p + i) + j);// выбран для суммы не элемент диагонали
  551.         else                               // выбран элемент диагонали
  552.         {
  553.             if (sum1<sum)                  // найден ст-ц с большей суммой чем sum1
  554.             {
  555.                 sum1 = sum;  j1 = j;       // запоминаем найденную сумму и номер ст-ца с этой суммой
  556.                 sum = 0;                   // сброс суммы для подсчета суммы под диагональю  
  557.             }
  558.         }
  559.         if (j<s - 1 && sum2>sum)           // найден ст-ц с меньшей суммой чем sum2
  560.         {
  561.             sum2 = sum; j2 = j;            // запоминаем найденную сумму и номер ст-ца с этой суммой
  562.         }
  563.         sum = 0;                           // сброс суммы для аналица следующего ст-ца
  564.        
  565.     }
  566.     for (i = 0; i<n; i++)                 // НАПРИМЕР обнуление найденных ст-цов (или что-либо иное)
  567.     {
  568.         if (i<j1) *(*(p + i) + j1) = 0;
  569.         if (i>j2) *(*(p + i) + j2) = 0;
  570.     }
  571.     printf("\n\nПреобразованный массив");
  572.     Print(p, n, s);
  573.     for (i = 0; i<n; i++)  free(*(p + i));// освобождение памяти на которую указывает p[i]  
  574.     free(p);                              // освобождение памяти на которую указывает p
  575.     //getch();                    
  576.     return 0;
  577. }
  578.  
  579.  
  580.      
  581.  
  582.  
  583.  
  584.  
  585.  
  586.  
  587.  
  588.  
  589.  
  590.  
  591.  
  592.  
  593.  
  594.  
  595.  
  596. //--------------------------------------------- пример 2 -----------------------------------
  597. // пример работы с двухмерным массивом через указатель на указатель// выполнить сортировку элементов квадратной матрицы
  598. // расположенных ниже главной диагонали
  599. // используя указатель на матрицу
  600.  
  601. //int main()
  602. //{
  603. //  setlocale(LC_ALL, "Russian");
  604. //  int *mm;      // указатель для динамического выделения памяти под массив
  605. //  int i, i1, j, j1, n;
  606. //  int k;        //
  607. //  system("CLS");
  608. //  printf("введите размерность массива  = ");
  609. //  scanf("%d", &n);
  610. //  if ((mm = (int *)malloc(n*n*sizeof(int))) == NULL)
  611. //  {
  612. //      puts("нет свободной памяти"); return 0;
  613. //  }
  614. //  system("CLS");
  615. //  Vvod(mm, n, n);            // ввод значений в матрицу ms
  616. //  system("CLS");
  617. //  Print(mm, n, n);           // вывод введенной матрицы на экран
  618. //  for (i = 1; i<n; i++)      // выбор строки
  619. //  for (j = 0; j<i; j++)      // перебор элементов до диагонали в i-ой строке
  620. //  { // k=*(mm+i*n+j);        //
  621. //      for (i1 = n - 1; i1 >= i; i1--)        // просмотр массива с конца (с последней стр.)
  622. //      for (j1 = i1 - 1; j1 >= 0; j1--)       // c последнего элемента i1-ой строки
  623. //      if (mm + i*n + j < mm + i1*n + j1 &&   // выбранный адрес (i1,j1)> исходого адреса (i,j)
  624. //          *(mm + i*n + j)>*(mm + i1*n + j1)) // и новое значение < исходного
  625. //      {
  626. //          k = *(mm + i1*n + j1);             // замена значений   (i,j) <-> (i1,j1)
  627. //          *(mm + i1*n + j1) = *(mm + i*n + j);
  628. //          *(mm + i*n + j) = k;
  629. //      }
  630. //  }
  631. //  printf("\nВведенный массив MS : ");
  632. //  Print(mm, n, n);                           // вывод введенной матрицы на экран
  633. //  free(mm);                                  // освобождение памяти на которую указывает  ms
  634. //  return 0;
  635. //}
  636.  
  637.  
  638.  
  639.  
  640.  
  641. //  примеры некоторых стандартных функций для работы со строками
  642. #include <stdio.h>
  643. #include <conio.h>
  644. #include <stdlib.h>
  645. #include <locale.h>
  646. #include <windows.h>
  647.  
  648. int str_len(char *);
  649. char *getstr(char *);
  650. int get_str(char *, int);
  651. int atoi(char *s);
  652. void itoa(int , char *);
  653. int str_cmp(char *, char *);
  654. char * strcat(char *, char *, int);
  655.  
  656. int main()
  657. {
  658.     setlocale(LC_ALL, "Russian");
  659.     char *s1, *s2;
  660.     int n, n1, n2;
  661.     double d;
  662.     do
  663.     {
  664.         system("CLS");
  665.         fflush(stdin);
  666.         printf("введите размерность ПЕРВОЙ строки = ");
  667.     } while (!scanf("%d", &n1) || n1 <= 0);
  668.     if (!(s1 = (char *)calloc(n1, sizeof(char))))
  669.     {
  670.         printf("\nНедостаточно свободной памяти \n");
  671.         return 0;
  672.     }
  673.     do
  674.     {
  675.         system("CLS");
  676.         fflush(stdin);
  677.         printf("введите размерность ВТОРОЙ строки = ");
  678.     } while (!scanf("%d", &n2) || n2 <= 0);
  679.     if (!(s2 = (char *)calloc(n2, sizeof(char))))
  680.     {
  681.         printf("\nНедостаточно свободной памяти \n");
  682.         free(s1);
  683.         return 0;
  684.     }
  685.  
  686.     printf("Вводите первую строку  ");
  687.     fflush(stdin);
  688.     printf("\n строка %s", getstr(s1)); //ввод-вывод первой строки
  689.     printf("\nДлина первой строки == %d байт", str_len(s1));
  690.     d = atof(s1);
  691.     printf("\nЗначение числа (double) в строке %s == %lf \n", s1, d);
  692.     printf("\nДлина второй строки == %d байт", get_str(s2, n2));
  693.     printf("\nЗначение числа (int) в строке %s == %d ", s2, atoi(s2));
  694.     printf("\nВводите число для перевода в строку  ");
  695.     scanf("%d", &n);
  696.     itoa(n, s2);
  697.     printf("\n строка %s", s2);
  698.     if (str_cmp(s1, s2)>0) printf("\nСтрока 1 > строки 2");
  699.     else if (str_cmp(s1, s2)<0) printf("\nСтрока 1 < строки 2");
  700.     else printf("\nСтрока 1 = строке 2");
  701.     s1 = strcat(s1, s2, 3);                // РАЗОБРАТЬСЯ (здесь возникает проблема !!!!!!!!!!!!!)
  702.     printf("\nстрока (s1+s2) == %s", s1);
  703.     return 0;
  704. }
  705.  
  706. // ввод строки по адресу переданному в нее
  707. char *getstr(char *st)
  708. {
  709.     if (!st) return nullptr;   // передан указатель на невыделенную под строку память
  710.     int i = 0;
  711.     // в цикле символы заносятся в строку из буфера клавиатуры
  712.     // до тех пор пока не будет нажата клавиша ENTER
  713.     while ((*(st + i++) = (char)getchar()) != '\n');
  714.     st[--i] = '\0';    // добавляем в конец строки символ '\0'
  715.     return st;            // выход из функции
  716. }
  717.  
  718. // ввод строки и подсчет ее длины
  719. // get_str возвращает значение типа int
  720. // в указатель st копируется указатель на строку для ввода
  721. int get_str(char *st, int k)
  722. {
  723.     int c, i = 0;
  724.     printf("\nВводите вторую строку  ");
  725.     // в цикле символы заносятся в строку из буфера клавиатуры
  726.     // до тех пор пока не будет нажата клавиша ENTER или
  727.     // из буфера не будет получен k-1 символ
  728.     while (--k>0 && (c = getchar()) != EOF && c != '\n')
  729.         st[i++] = c;    // ввод строки до заданного кол-ва символов или пока
  730.                         // не нажата клавиша Enter или Ctrl + Z
  731.     st[i] = '\0';
  732.     return i;    // возврат длины строки
  733. }
  734.  
  735. // определение длинны строки
  736. int str_len(char *st)
  737. {
  738.     int n = 0;
  739.     for (; st[n] != '\0'; n++);
  740.     return n;
  741. }
  742.  
  743. // перевод цифровой символьной строки в signed int
  744. int atoi(char *st)
  745. {
  746.     int n, i = 0, znak;
  747.     while (st[i] == ' ') i++;
  748.     if (!st[i]) return 0;              // в строке одни пробелы
  749.     znak = (st[i] == '-') ? -1 : 1;    // запоминаем знак числа
  750.     if (st[i] == '+' || st[i] == '-')  // пропуск знака в строке
  751.         i++;
  752.     for (n = 0; st[i] >= '0' && st[i] <= '9'; i++)  // выбор символа цифры числа из строки
  753.         n = 10 * n + (st[i] - '0');    // формирование числа из цифр строки
  754.     return znak*n;                     // возврат числа со знаком
  755. }
  756.  
  757. // перевод числа типа signed int в символьную строку
  758. void itoa(int n, char *st)
  759. {
  760.     int i = 0, znak;
  761.     if ((znak = n)<0)            // сохраняем знак
  762.         n *= -1;                 // n - положительное число
  763.     do                // (ВАЖНО!!!) цифры заносим в строку в обратном порядке
  764.     {
  765.         st[i++] = n % 10 + '0';  // выделяется последняя справа цифра числа (как символ)
  766.     } while ((n /= 10)>0);       // удаляется эта цифра из числа путем целочисленного деления на 10
  767.  
  768.     if (znak<0) st[i++] = '-';   // добавляем в конец строки знак числа
  769.     st[i] = '\0';
  770.     for (n = 0; n < i/2; n++)    // цикл переворота (реверса) полученной строки
  771.     {
  772.         st[n] += st[i - 1 - n];
  773.         st[i - 1 - n] = st[n] - st[i - 1 - n];
  774.         st[n] -= st[i - 1 - n];
  775.     }
  776. }
  777.  
  778. // функция сравнения двух строк
  779. int str_cmp(char *st1, char *st2)
  780. {
  781.     while (*st1)     // истина пока не достигнут конец ('\0') строки s1
  782.     if (*st1 - *st2) return *st1 - *st2;  // >0 если ASCII-код  *s1 > *s2
  783.                                           // иначе <0
  784.     else                                  // при совпадении символов переход
  785.     {
  786.         st1++;                            // к анализу следующей пары символов
  787.         st2++;
  788.     }
  789.     return *st1 - *st2;  // строки либо полностью совпали либо одна окончилась
  790. }
  791.  
  792. //  -------------------------
  793. //  for (;*s==*t; s++,t++)
  794. //  if(!*s) return 0;
  795. //  return *s-*t;
  796. //  --------------------------
  797.  
  798. // функция вставки (добавления) в строку st1 строки st2
  799. // с позиции k
  800. char * strcat(char *st1, char *st2, int k)
  801. {
  802.     char *ss;
  803.     int i, n;
  804.     if (k>str_len(st1)) k = str_len(st1); // проверка куда вставлять строку st2
  805.                                           // перевыделение памяти для новой строки st1
  806.     st1 = (char*)realloc(st1, str_len(st1) + str_len(st2) + 1);
  807.     for (i = str_len(st1); i >= k; i--)   // сдвиг в строке st1 второй части (до позиции k)
  808.         *(st1 + i + str_len(st2)) = *(st1 + i); // вправо
  809.     for (i = 0; i<str_len(st2); i++)      // перезапись второй строки st2 в строку st1
  810.         *(st1 + k + i) = *(st2 + i);      // с позиции k
  811.     return st1;
  812. }
  813.  
  814.  
  815.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement