Архив метки: листинг

Листинг обработки одномерных массивов

Тема: Обработка одномерных массивов

Задание

Заполнить два массива, размером 20 и 30 элементов, соответственно, случайными целыми числами в диапазоне от –50 до 50. Из полученных двух массивов создайте два массива отдельно отрицательных и положительных чисел. Проведите сортировку полученных массивов по возрастанию. Для контроля результата сделайте распечатку массивов, в том числе исходного.
Сортировки проведите тремя методами. При использовании каждого из методов желательно использовать свой массив. Если количество массивов меньше трех, то один из массивов перед сортировкой надо скопировать в дополнительный массив и провести его сортировку.

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <time.h>
#define   Nx 20
#define   Ny 30
#define   Nres 50

inline void rus()  // Русификация вывода в консольное окно
{
    setlocale( LC_CTYPE, ".1251" );
    setlocale( LC_MONETARY, ".1251" );
}
void randomize()
{
    srand(time(0));
}

unsigned int random(int range)
{
    return (rand() % range);
}

int main()
{

    int  i, j, range;
    rus();
    randomize();
    int x[Nx];
    int y[Ny];
    int pol[Nres];
    int otr[Nres];
    int pol2[Nres];
    range=100;
   for (i=0;i<Nx;i++)  {        /* i - is a namber of row       */
      *(x+i) = -50+random(range);
                       }
  // Вывод одномерного массива
  printf("Распечатка массива \n");
  for (i=0; i<Nx; i++)  //заметьте еще раз, проверяется условие i<N
    printf("%d ",(*(x+i)));

   for (i=0;i<Ny;i++)  {        /* i - is a namber of row       */
      *(y+i) = -50+random(range);
                       }

  // Вывод одномерного массива
  printf("\n Распечатка массива \n");
  for (i=0; i<Ny; i++)  //заметьте еще раз, проверяется условие i<N
    printf("%d ",(*(y+i)));

   for (i=0;i<Nres;i++)  {        /* i - is a namber of row       */
      *(pol+i) = 1000;
      *(otr+i) = -1000;
                         }
// раскидываем массив х
int jpol=0, jotr=0;
for (i=0;i<Nx;i++)  {        /* i - is a namber of row       */
      if (*(x+i)>0) {*(pol+jpol)=*(x+i);jpol++;}
      if (*(x+i)<0) {*(otr+jotr)=*(x+i);jotr++;}
                    }

// раскидываем массив y

for (i=0;i<Ny;i++)  {        /* i - is a namber of row       */
      if (*(y+i)>0) {*(pol+jpol)=*(y+i);jpol++;}
      if (*(y+i)<0) {*(otr+jotr)=*(y+i);jotr++;}
                    }

 // Создаем доп массив для сортировки (по заданию)

  for (i=0; i<jpol; i++)  //
   *(pol2+i+1)=*(pol+i);

//сортировка массива pol
if (jpol>=1) {
    for (int j=0; j<jpol-1;j++)
{

    for (int i=0; i<jpol-1;i++)
    {
        if (*(pol+i)>*(pol+i+1))
       {
           int temp = *(pol+i);
           *(pol+i) = *(pol+i+1);
           *(pol+i+1)=temp;
       }
    }
}
           }

//сортировка массива otr
if (jotr>=1) {
  int m,min;
/* Сортировка методом прямого поиска */
  for (i=0;i<jotr-1;i++) /* в переменной i - индекс первого элемента
   массива, то есть массив от d[i] до d[N] */
    {  /* Найти минимум в массиве от i-того до N-ного */
      m=i; min=(*otr+i); /* m-индекс минимума, min-значение минимума */
      for (j=i+1;j<jotr; j++) /* Поиск в оставшейся части массива */
 {
    if (*(otr+j)<min)  /* Найдено новое значение минимума? */
      { min=*(otr+j); m=j; } /* Запомнить минимум и его индекс */
 }
      /* Обменять первый (i-ый) и минимум (m-ый) местами */
      *(otr+m)=*(otr+i); *(otr+i)=min;
    }
}

//сортировка массива pol2
if (jpol>=1) {
           int m=0;
/* Сортировка методом прямого включения */
  for (i=2; i<=jpol; i++) /* в переменной i - индекс включаемого элемента */
    {       /* включение i-того элемента */
      m=i; // Начальное значение индекса цикла включения
      *pol2=*(pol2+i); // Установка барьера
      while (*(pol2+m)<*(pol2+m-1)) // включение
  { //  Обмен с предыдущим элементом местами
      int tmp = *(pol2+m); *(pol2+m) = *(pol2+m-1); *(pol2+m-1)= tmp;
      m--; // включение идет к началу массива
 };
    }; }

  // Вывод одномерного массива
  printf("\n Распечатка массива otr \n");
  for (i=0; i<jotr; i++)  //
    printf("%d ",(*(otr+i)));
    printf("\n Распечатка массива pol \n");
  for (i=0; i<jpol; i++)  //
    printf("%d ",(*(pol+i)));
  printf("\n Распечатка массива pol2 \n");
  for (i=1; i<=jpol; i++)  //
    printf("%d ",(*(pol2+i)));

 return 0;
}

Листинг 2 обработка массивов через функции здесь.

Циклы в С++

Циклы в С++Циклы в С++

В С++ существует несколько способов представления циклов.

В языке существует 3 типа циклов.

1 тип — цикл for

Общий вид:

for (команда-инициализации; условие; выражение ) выполняемая команда

//бесконечный цикл с выходом из него по определенному условию
for ( ; ; ) {
        if ( some_condition )
            break; //выход из цикла если выполняется условия
        // выполняемые команды
    }

Листинг примера с циклом for

//выводим в столбец значения от 0 до 9
for (int i=0; i<10;i++) cout<<i<<"\n";

 2 тип — цикл while

Общий вид:

while (условие == истина) выполняемые команды

Если вычисление условия дает false, цикл останавливается

Листинг примера с циклом while

//выводим в столбец значения от 0 до 9
int i=0;
while (i<10) cout<<i++<<"\n";

 3 тип — цикл do

Общий вид:

do выполняемые команды while (условие==истина)

Если вычисление условия дает false, цикл останавливается

Листинг примера с циклом while

//выводим в столбец значения от 1 до 10
int i=0;
do {cout<<i++<<"\n";} while (i<11);

Пример программы с циклами здесь

Пример задачи для условных операторов в С++

С++Общее задание:

Используя операторы ветвления (if и if … else), составить программу для вычисления составной (сложной) функции, имеющей различный вид на разных участках аргумента. С помощью переключателя (switch) указать на каком отрезке находится введенное с клавиатуры значение аргумента, и вывести значение функции в данной точке.
Все исходные данные, необходимые для проведения вычислений, вводить
с клавиатуры.
Функция и отрезки:

y=pow(x,2);           -2.0<=x<1.0
y=sqrt(x);             1.0<=x<2.0
y=sqrt(x-2)+sqrt(2);   2.0<=x<3.0
y=1+sqrt(x-1);         3.0<=x<=4.0

Пример решения задачи (листинг)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
void main()
{
/* номер отрезка, def – выбор по умолчанию */
 enum {def,o1,o2,o3,o4} otr;
 float x,y; 

  clrscr();
  printf("Тема: Ветвление программы \n");
  printf(" Задание: Используя оператор if, составить программу \n");
  printf("для вычисления составной функции вида: \n");
  printf("1> sqr(x)              при x от -2.0 до 1.0\n");
  printf("2> sqrt(x)             при x от  1.0 до 2.0\n");
  printf("3> y=sqrt(x-2)+sqrt(2) при x от  2.0 до 3.0\n");
  printf("4> y=1+sqrt(x-1)       при x от  3.0 до 4.0\n");
  printf("указать отрезок, где находится введенный с клавиатуры \n");
  printf("аргумент и вывести значение функции в данной точке. \n"); 

  printf("Введите x=");
  scanf("%f",&x);   printf("\n"); 

  /* Выбор отрезка */
   otr=def;
  if ((x>=-2.0) && (x<1.0))         otr=o1;
    else if ((x>=1.0) && (x<2.0))   otr=o2;
  if ((x>=2.0) && (x<3.0))          otr=o3;
  if ((x>=3.0) && (x<=4.0))         otr=o4; 

  /* Вычисление значения функции */
  switch (otr)
  {
    case o1: y=pow(x,2);           break;
    case o2: y=sqrt(x);            break;
    case o3: y=sqrt(x-2)+sqrt(2);  break;
    case o4: y=1+sqrt(x-1);        break;
    default:  printf("Число вне диапазона."); getch(); exit(1);
  }
  printf ("Промежуток %d: y= %3.2f; ",otr,y);
  getch();
}