Отправляет email-рассылки с помощью сервиса Sendsay

[prg] программа на си, печатающая массив из 9 элементов в пряммом и обратном порядке.

всем привет.
помогите написать программу, указанную в теме.
Если можно, с пояснениями.
Заранее спасибо за ответ.

Ответить   Wed, 14 Mar 2012 23:03:36 +0700 (#2400266)

 

Ответы:

Приветствую всех.

Для определённости ы ещё должны указать тип элементов массива (язык C не поддерживает
обобщенное программирование).
И предложите сначала своё решение, чтобы действительно была возможность помочь
вам, а не писать весь код за вас.

Успехов. Анатолий.

Ответить   "i_chay" Thu, 15 Mar 2012 07:09:02 +0400 (#2400606)

 

привет.
Извиняюсь за задержку.
15.03.2012 10:09, i_chay пишет:

#include<stdio.h>
void array(int *a)
{

}
int main(void)
{
int i =0;

int x[10];
while(i <=9)
{
x[i] =i;
i++;

}

перед main должна быть функция, которой подаётся массив.

заранее спасибо за ответ.

return 0;
}

Ответить   Wed, 21 Mar 2012 02:07:00 +0700 (#2407483)

 

Если писать сразу по правилам, то у этой функции нужно поменять имя, чтобы оно
соответствовало тому действию, которое эта функция выполняет.
Обычно в качестве имени функции (или части этого имени) используют глагол.
Второй момент: несмотря на то, что у вас жестко задан размер массива (10 элементов),
функцию можно сделать более универсальной, то есть выводящей на экран массив
любого размера, для чего передавать ей в качестве параметра этот самый размер.
Вот что из этого может получиться (код на "чистом" C):

#include <stdio.h>

void print_array(int* a, int length)
{
/* счетчик циклов */
int i;
/* в прямом порядке */
for(i=0; i<length; ++i)
{
printf("[%d] = %d\n", i, *(a+i));
}

/* в обратном порядке */
for(i=length-1; i>=0; --i)
{
printf("[%d] = %d\n", i, *(a+i));
}
} /* end of print_array */

Для простоты понимания здесь для счетчика циклов использовался тип int, а не
ptrdiff_t (что на большинстве платформ одно и то же).
Вызвать эту функцию можно так:

int main(void)
{
int i =0;
int x[10];
while(i <10)
{
x[i] =i++;
}

print_array(x,10);
return 0;
}

Успехов. Анатолий.

Ответить   "i_chay" Fri, 23 Mar 2012 09:13:21 +0400 (#2410356)

 

Vande omentaina, i_chay!

А есть ли в данном случае разница между преддекрементом и постдекрементом?
правильно ли я думаю, что напиши я
for(i=0; i<length; i++)
ничего бы не изменилось?
Спасибо.

Ответить   Fri, 23 Mar 2012 11:43:14 +0200 (#2410731)

 

Приветствую всех.

Это инкремент (увеличение).
Если предыдущее значение не используется, то всегда нужно применять префиксную
форму, так как она явно передает семантику выражения (особенно в C++).
Постфиксная форма имеет другую семантику и на реализацию этой семантики будут
потрачены усилия компилятора и ресурсы во время выполнения.
Конкретно в вышеприведенной строке, когда переменная цикла имеет простой тип
(т. е. явно проецируемый на регистры процессора), эти затраты могут отсутствовать
(особенно если включена оптимизация).
В языке C++ для более сложных типов эти затраты могут быть существенными, так
как постфиксная форма подразумевает сохранение (скорее всего, это будет память)
предыдущего значения перед выполнением операции .

По большому счету, неправильно. Хотя в частном случае и для конкретного компилятора
по вышеназванным причинам это, вероятнее всего, будет верно.

Успехов. Анатолий.

Ответить   "i_chay" Fri, 23 Mar 2012 14:36:16 +0400 (#2410821)

 

Vande omentaina, i_chay!

Прошу прощения, зарапортовался :-(.
То есть, иными словами генерализируем: при использовании цикла for в си-подобных
языках с точки зрения семантики и быстродействия корректнее применять префиксную
форму инкремента или декремента. Я прав или всё же есть нюансы?
Спасибо.

Ответить   Fri, 23 Mar 2012 13:05:00 +0200 (#2410862)

 

Приветствую всех.

Да, правы. Нюансы тоже есть, но обычно они указываются в документации к реализации
языка или в его стандарте.
Конкретно для языка C, поскольку постфиксная форма в цикле for весьма распространена,
то компиляторы, как правило, оптимизируют ее по умолчанию.
Для других языков, где нет реальных простых типов (например, скриптовые языки)
или где в качестве итератора может выступать более сложный объект (в C++), очевидность
такой оптимизации сомнительна (по крайней мере, на нее не стоит уповать).

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

Если креативная энергия бьёт через край, то для всяческих tricks есть соответствующие
конкурсы среди программистов. Там ограничений нет.

Успехов. Анатолий.

Ответить   "i_chay" Fri, 23 Mar 2012 22:26:12 +0400 (#2411427)