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

Программное определение количества ядер на языке C/С++

Для программного определения количества ядер (процессоров)  в языке С++ в операционной системе Windows.

1 Способ

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main(void) {
    SYSTEM_INFO sysinfo;
    GetSystemInfo(&sysinfo);
    int CountProc=sysinfo.dwNumberOfProcessors);

    return 0;
}

2 Способ

#include <iostream> 
using namespace std; 
int main() 
{ 
    int CountProc = sysconf(_SC_NPROCESSORS_ONLN); 
}

Массив разных случайных чисел

С++Задача:

Заполнения массива случайными неповторяющимися элементами числами (язык Си)

Решение:

Алгоритм решения заполнения массива содержит три цикла: в первом цикле выбираем номер заполняемого элемента (переменная i); внутри первого цикла выполняется второй цикл (do…while), который будет выполняться еще раз, если потребуется повтор; внутри цикла (do…while) выполняются еще три действия: вычисляется значение нового элемента, переменной x задается значение «не повторять» и запускается третий цикл – сравнения вычисленного значения со всеми предыдущими (цикл for по переменной j).

Листинг решения:

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <time.h>
#define N 20 //количество элементов в массиве
#define Povtor 1 //есть ли повторения

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()
{
char c[N];
int i, j, x,range;

rus();
randomize();
printf("Заполнение одномерного массива символами \n");
printf("в случайном порядке. Символы не должны повторяться. \n");
printf("Коды символов расположены в диапазоне от 33 до 90.\n");

range = 90-33+1;
*c=random(range) + 33; // Первый элемент

for (i=1;i<N; i++) // Цикл заполнения элементов,
{ // i – номер очередного элемента
do
{
*(c+i)=random(range) + 33; // Новое значение
x = !Povtor; // Считаем, что повтор поиска не нужен
for(j=0; j<i; j++) // Цикл сравнения со всеми предыдущими
if (*(c+i)==*(c+j))
{
x = Povtor; // Элементы совпали, надо повторить поиск
break;
}
}
while (x==Povtor);
}
// Вывод одномерного массива символов
printf("Распечатка массива \n");
for (i=1; i<N; i++) //заметьте еще раз, проверяется условие i<N
printf("%c",(*(c+i)));
return 0;
}

Можно также реализовать функцию, проверяющая повторился ли элемент y в массиве x или нет, к примеру может иметь следующий вид (считаем, что количество элементов в массиве x равно n).

Листинг примера функции для поиска повторяющегося элемента

int povtor(int *x, int n, int y)
{ int Povtor, i;
Povtor = 0;
for (i=0;i<n;i++) {if (x[i]==y) Povtor=1;}
return Povtor;
}

Строки в С++ Листинг программы

Тема: Строки

Задание: :  В 2-х предложениях найти и распечатать совпадающие слова.

Листинг

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <windows.h>

#define N 20

  //  ПРЕДВАРИТЕЛЬНОЕ ОБЪЯВЛЕНИЕ ФУНКЦИЙ
  // Заголовок программы
      void Title();
  // Ввод предложения
      void InpPredl (char predl[]);
  // Ввод предложения
    void InpPredl(char predl[]);
      // Ввод предложения
    void InpPredl2(char predl[]);
  // Выделение из предложения
     void Select(const char *predl, char m[][N],char *sel, int *n);
  // Поиск повторов слов
     void FindDuplicate(char slova[][N], char slova2[][N], int sl, int rz);
  // Вывод результата
     void OutPredl(char *s1, char *s2);

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

// ОСНОВНАЯ ФУНКЦИЯ
int main()
{
     // ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ
  char predl[80];    // Введенное предложение
  char predl2[80];    // Введенное предложение
  char *res;            // Результирующее предложение
  char slova[N][N]; // Массив слов в предложении
  char slova2 [N][N]; // Массив 2 слов в предложении
  int  sl=-1, rz=-1;  // Счетчики слов
  char buk[80]; // все буквы алфавита
  char *bs="йцукенгшщзхъфывапролджэячсмитьбю";// Буквы строчные
  char *bz ="ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ";/*  заглавные */
  char *r="`!;:,.?- _";         // Разделительные знаки
//ВЫЗОВ ФУНКЦИЙ НА ИСПОЛНЕНИЕ
    rus();
// Заголовок программы
       Title ();
  // Ввод предложения
       InpPredl(predl);
       InpPredl2(predl2);
  // Выделение из предложения слов
      Select (predl, slova, r, &sl);
      Select (predl2, slova2, r, &rz);

       FindDuplicate(slova, slova2, sl, rz);

    return 0;
}

// ОПИСАНИЕ ИСПЛЬЗУЕМЫХ ФУНКЦИЙ
// Заголовок программы
void Title()
{
  char s[1000];
  AnsiToOem(" Задание\n",s);
  puts (s);

}
// Ввод предложения
void InpPredl(char *s)
{
    char s2[50];
    AnsiToOem("Введите предложение \n",s2);
    puts(s2);
  strcpy (s,"Верите ли вы, что задача решена?");
  // gets (s);
}
void InpPredl2(char *s)
{
    char s2[50];
    AnsiToOem("Введите предложение \n",s2);
    puts(s2);
  strcpy (s,"Верите ли вы, во что нибудь?");
 // gets (s);

}

// Выделение из предложения
void Select(const char *predl, char m[][N], char *sel, int *n)
{
  char *p, *s;

  s=strdup (predl); // Сделать копию исходного предложения
	// так как передается константа, strtok требует
	// внесения изменений при своей работе
  p = strtok (s, sel);
  while (p)
    {
     (*n)++;
     strcpy (m[*n],p);
     p = strtok (NULL, sel);
    }
  free (s);
}
/ Сравнение слов
void FindDuplicate(char slova[][N], char slova2[][N], int sl, int rz)
{
  int i, j;
  char buk[80];
   i = sl; //кол во слов в 1 массиве слов
AnsiToOem("Повторы ",buk);
            puts (buk);



  while (i>=0)
    {
     for(j=0;j< =rz;j++)
      if (!strcmp(slova[i],slova2[j])) {
            AnsiToOem(slova[i],buk);
            puts (buk);
                                } // Печать слова
      i--;
    }

}

Листинг примера функций в языке Си.

Функции в языке Си.

Задание

Написать программу при помощи операторов цикла (без применения массивов и прямой адресации курсора) для распечатки на экране монитора указанного набора символов с использованием функций.

Набор символов

A D G J M
M D G J M
M J G J M
M J G J M
M J G D M
M J G D A

Листинг программы

#include <conio.h>
#include <stdio.h>

#include <windows.h>
//функция печати первой части строки 
void PartFirst(int countLine, char First)
{
   int i=1;
    do
	{
	  if (First< 'A') First='M';
	  printf ("%2c",First);
	  First--; First--; First--;
	  i++;
	} while (i<6-countLine+1);
}
//функция печати второй части строки 
void PartSecond(int countLine, char First)
{
   char newFirst=First;
   int i=1;
    do
	{
	  if (First>'M') First=newFirst;
	  printf ("%2c",First);
	  First++; First++; First++;
	  j++;
	} while (i< =countLine-1);
}
int main()
{
  int i,j,i1,j1;
  char c,c1,c2;
  char s[1000];
AnsiToOem("Задание: Написать программу, которая выводит на экран заданный набор" ,s);
puts(s);
c='A';
c1='A';
i1=6;
do
    {
c2='M';
if (i1<6)
   PartFirst(i1,c2);
j=1;
if (i1!=1)
  PartSecond(i1,cl);
c1+=3;
      printf ("\n");
i1--;
    }while (i1>=1);
  getch();
 return 0;
}

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

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

Задание

Заполнить два массива, размером 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 обработка массивов через функции здесь.