Четверг, 28.03.2024, 17:58 | RSS | Приветствую Вас Гость
Главная | Регистрация | Вход
Меню сайта
Категории раздела
Разное [10]
Решения задач (студентам) [9]
PC Игры - кодинг [2]
Python [1]
PHP, Mysql [1]
HTML, CSS, Javascript [1]
Scilab [1]
Поиск
Опрос
Какую социальную сеть Вы предпочитаете?
Всего ответов: 43
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Главная » Статьи » Решения задач (студентам)

Решение задачи на массивы с использованием адресов (язык C#)
Условие задачи.

Даны натуральное число n, действительные числа a1,...,an. Если последовательность a1,...,an упорядочена по убыванию, то оставить её без изменения. Иначе получить последовательность an,...,a1.

Сама по себе задача не сложная. Обычная работа с массивом чисел. Но для тех кто только начинает писать на C работа с адресами, обращение к массиву и его элементам через адреса может показаться немного раздражительным.

Код программы.

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

void changeElem(int *u, int *v)
{
  int temp;
  temp=*u;
  *u=*v;
  *v=temp;
}

void main()
{
  int A[1000]={0}, n, i, *ptA, res=1;
  ptA= A;
  printf("Enter count of numbers (n): ");
  scanf("%d", &n);
  // заполнение массива
  printf("Row of numbers: ");
  for (i=0; i<n; i++)
  {
    scanf("%d", (ptA+i));
  }
  // проверка на условия
  for (i=1; i<n; i++)
  {
    if (*(ptA+i-1) > *(ptA+i)) res= 0;
  }
  // Если элементы не расположены по возрастанию
  // Переворачиваем элементы и выводим полученный массив
  // Иначе сообщение
  if (res == 0)
  {
    printf("Inverted row of numbers: ");
    for (i=0; i<(n/2); i++)
    {
      changeElem(ptA+i, ptA+n-1-i);
    }
    for (i=0; i<n; i++)
    {
      printf("%d ", *(ptA+i));
    }
  }
  else printf("Elements are arranged  in  ascending order.");
  getch();
}

На первый взгляд выглядит немного непривычно. Здесь мы объявили переменную-указатель на тип integer *ptA. Звездочка указывает на то, что переменная должна содержать адрес. Далее в этот указатель передается адрес на первый элемент массива A.

ptA= A;

То есть имя массива является указателем. Далее обращение к определенному элементу массива осуществляется путем увеличения адреса.

scanf("%d", (ptA+i));

В этой строке осуществляется обращение к i-тому элементу массива. В данном случае сдвиг значения адреса на подразумевает физический сдвиг на 4 байта (так как использован тип целых чисел integer). Но не в этом суть. Главное, что обращение по адресу не сильно отличается от привычного обращения по индексу элемента.

Следует отметить ценность применения адресов. Как Вы можете видеть, в программе объявлена функция changeElem(). Назначение этой функции - менять значения местами. В качестве аргументов в функцию передаются адреса 2-х переменных (но не значения самих переменных!), а далее с помощью локальной буферной переменной производится обмен. Ценность этого метода заключается в том, что если в функцию передать значения переменных, то создавались бы еще 2 локальные переменные, в которые записывались бы значения, которые надо обменять. В данной реализации используется только одна локальная переменная - буферная.

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

for (i=0; i<(n/2); i++)
  {
    changeElem(ptA+i, ptA+n-1-i);
  }

Пояснение к данному участку кода, так как это, пожалуй, единственное над чем пришлось хоть чуть-чуть подумать при решении задачи. Здесь берутся первый и последний элементы массива и меняются. Затем берутся элементы на один ближе к середине и так далее до середины.

Вот, собственно, и все. Но следует помнить, что неправильное обращение с адресами приводит к непредвиденным последствиям. Именно поэтому в более новых языках возможность работы с адресами устранена.
Поделиться ссылкой в соц. сетях:

Категория: Решения задач (студентам) | Добавил: =Sanek= (19.05.2011)
Просмотров: 2427 | Теги: решение задач, программирование, C# | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

© 2024 raznocoding.do.am