Здесь больше нет рекламы. Но могла бы быть, могла.

Автор Тема: Программирование на си/си++  (Прочитано 6079 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Амирель

  • Старожил
  • ****
  • Пол: Мужской
  • Охотник
    • Просмотр профиля
Решил создать эту тему в связи с тем что мне на данный момент это интересно(да и людям будет полезно познакомиться с языками).
Предлагаю исходник:
#include <stdio.h>
#include <conio.h>
#include<math.h>
const int N = 100;
int i,r, A[N];
void sin(int r, int A[N])
{
  printf("%d:%1.7f  ", A[N], sin(A[i]*3.141592/180) );
  }
main()
{
int i,r, A[i];
printf("vvedite kol-vo chisel\n");
scanf("%d",&r);
printf("vvedi chislo\n" , &i );
for ( i = 0; i < r; i ++ )
 {
scanf ("%d", &A[i]);
}

for ( i = 0; i < r; i ++ )

sin(r,&A[i]) ;

getch();
}
где ошибка не могу понять. Нужно,чтобы программа  вывела синусы вводимых чисел (использование процедуры обязательно)
« Последнее редактирование: 09/12/2010, 12:08:32 от Corwin Celebdil »
"Историю пишет победитель."(с)

Оффлайн Corwin

  • Ветеран
  • *****
  • Пол: Мужской
    • Просмотр профиля
Нет пробела?

#include<math.h>
Немає сенсу.

Оффлайн Амирель

  • Старожил
  • ****
  • Пол: Мужской
  • Охотник
    • Просмотр профиля
Корвин нет не то.))
Он синусы выводит но получается:
введите кол-во эл-тов
3(пример)
введите числа
0
90
180
"772: 0,00000    16: 1.00000  4: 0.0000000"
почему 772 16 и 4 он должен вывести 1 2 3 (тк три числа)
при попытке их убрать программа выдает полную галиматью
"Историю пишет победитель."(с)

Оффлайн Corwin

  • Ветеран
  • *****
  • Пол: Мужской
    • Просмотр профиля
Мне сложно, конечно, потому что я Си не знаю. Не понимаю, например, почему в printf("%d:%1.7f  ", A[N], sin(A*3.141592/180) ); сначала A[N], а потом просто А.
Немає сенсу.

Оффлайн Амирель

  • Старожил
  • ****
  • Пол: Мужской
  • Охотник
    • Просмотр профиля
ой здесь почему-то не печатает, но там идет не просто А , а А в квадратных скобочках и англ
« Последнее редактирование: 08/12/2010, 22:48:43 от Амирель »
"Историю пишет победитель."(с)

Оффлайн Амирель

  • Старожил
  • ****
  • Пол: Мужской
  • Охотник
    • Просмотр профиля
Ошибку не нашел, но результата добился)
"Историю пишет победитель."(с)

Оффлайн Mrrl

  • Волшебник-Прогрессор
  • Ветеран
  • *****
  • Пол: Мужской
  • Древние тайны всех мирозданий мне под силу...
    • Просмотр профиля
Если по исходной программе:
Сначала процедура. Принимает, вроде бы, массив, судя по описанию, из 100 элементов (потом станет понятно, что это не так, но это потом), дальше печатает 100-й элемент массива A[N] - но в этом массиве нет 100-го элемента - в нем есть элементы с индексами от 0 до 99 - и что дальше? Вероятно, после A идет [ i ] (которое съелось форумом)?
  В этом случае передача i идет не через параметр, как следовало бы, а через статическую переменную. Что не есть хороший стиль, который, к тому же, приводит к еще одной ошибке: переменная i, описанная в main, перекрывает область действия переменной i, описанной снаружи, и последняя не меняется. Так что странно, что печатались разные вещественные числа.
  Теперь main. В ней сначала все нормально, но потом в цикле вводятся числа, которые кладутся в одну и ту же переменную A. Вероятно, предполагалось, что это будет массив, но идея осталась не реализованной. Адрес A передается в процедуру, где он воспринимается, как начало массива. В результате, A[N] - это ячейка памяти, находящаяся где-то далеко от переменных программы. Хорошо, что в нее ничего не пишется.
  Более правильным был бы такой код (авторский стиль постараюсь сохранить):
#include <stdio.h>
#include <conio.h>
#include<math.h>
const int N = 100;
void sin(int r, int A[N])
{
 printf("%d:%1.7f ",r+1, sin(A[r]*3.141592/180) );
 }
main()
{
int i,r, A[N];
printf("vvedite kol-vo chisel\n");
scanf("%d",&r);
printf("vvedi chislo\n" );
for ( i = 0; i < r; i ++ )
 {
scanf ("%d", &A[i]);
}

for ( i = 0; i < r; i ++ )

sin(i,A) ;

getch();
}
Конечно, массив A следовало описать, как double, но это уже не так важно.
« Последнее редактирование: 09/12/2010, 00:25:51 от Mrrl »
When I see a troll up in the mountains with a necklace of human skulls, I say good luck to him. (c)

Насколько я помню, я был всегда!

Оффлайн Амирель

  • Старожил
  • ****
  • Пол: Мужской
  • Охотник
    • Просмотр профиля
вот исходник который надо было сделать, так как тот , который я выложил у меня не приняли пришлось на ходу перестраиваться.
#include <stdio.h>
#include <conio.h>
#include<math.h>
const int N = 100;
int i,r, A[N];
void sin(int r, int A[0])
{
  for ( i = 0; i < r; i ++ )
  printf("%d:%1.7f  ", A[i], sin(A[i]*3.141592/180) );
  }
main()
{
int i,r, A[i];
printf("vvedite kol-vo chisel\n");
scanf("%d",& r);
printf("vvedi chislo\n" , &A[i] );
for ( i = 0; i < r; i ++ )
 {
scanf ("%d", &A[i]);
}
sin(r,&A[0]) ;

getch();
}
« Последнее редактирование: 09/12/2010, 12:09:55 от Corwin Celebdil »
"Историю пишет победитель."(с)

Оффлайн Амирель

  • Старожил
  • ****
  • Пол: Мужской
  • Охотник
    • Просмотр профиля
Mrrl

У вас в программе идет передача всего массива в процедур.
Легче передать указатель на первый эл-т массива.
Цитировать
Вероятно, предполагалось, что это будет массив, но идея осталась не реализованной.
Как это не реализованной? Я спрашиваю кол-во эл-тов нужных нам, потом запускаю цикл в котором и создаю массив из нужного кол-ва эл-тов. Сами элементы запрашиваются у пользователя.
То что я поставил N=100  я просто подстраховался (небудет же пользователь вводить 100 элементов, если надо можно сделать его нужного на размера).

« Последнее редактирование: 09/12/2010, 11:55:07 от Амирель »
"Историю пишет победитель."(с)

Оффлайн Mrrl

  • Волшебник-Прогрессор
  • Ветеран
  • *****
  • Пол: Мужской
  • Древние тайны всех мирозданий мне под силу...
    • Просмотр профиля
У вас в программе идет передача всего массива в процедур.
Легче передать указатель на первый эл-т массива.
В C и в С++ "передача массива" и "передача указателя на первый элемент массива" это в точности одно и то же. Вообще, любое использование имени массива в программе интерпретируется как указатель на его нулевой элемент.


Цитировать
Вероятно, предполагалось, что это будет массив, но идея осталась не реализованной.
Как это не реализованной?
Проблема была в том, что форум плохо показывает программу. Теперь я вижу, что там в самом деле массив, но:
  неужели компилятор в самом деле нормально воспринимает запись
int A[i];?
  Вообще то, при определении массива длина обязана быть константой (как это сделано в первом описании, перед sin). Кстати, зачем описывать массив дважды - снаружи и внутри main? Если он описан снаружи, то его видно ото всюду - его даже не надо передавать в фунцию sin.
   В последней версии я бы убрал строчку "int i,r, A[N];" перед sin, описал int i; внутри sin, исправил int A[ i ] на int A[N] в main и убрал &A[ i ] из printf после "vvedi chislo\n" - он там совсем не по делу. А так все еще остаются сомнения - в какой именно массив читаются вводимые числа. Не исключено, что в массив нулевой длины, описанный в main...




When I see a troll up in the mountains with a necklace of human skulls, I say good luck to him. (c)

Насколько я помню, я был всегда!

Оффлайн Амирель

  • Старожил
  • ****
  • Пол: Мужской
  • Охотник
    • Просмотр профиля
Цитировать
В C и в С++ "передача массива" и "передача указателя на первый элемент массива" это в точности одно и то же.
да, да, да, совсем одно и тоже. Откройте учебник по программирванию и посмотрите, чем указатель отличается от массива. К сожалению я свой конспект отдал так бы привел цитаты.
Но по памяти указатель-это переменная, которая содержит адрес некоторой области памяти.
Цитировать
Кстати, зачем описывать массив дважды - снаружи и внутри main?
Да, теперь вижу, признаю прокол.
Цитировать
описал int i; внутри sin,
зачем? Это же у нас переменная, которая используется не только в процедуре, но и в
основной программе?
Цитировать
убрал &A[ i ] из printf после "vvedi chislo\n" - он там совсем не по делу
Угу тут вы правы.
"Историю пишет победитель."(с)

Оффлайн Mrrl

  • Волшебник-Прогрессор
  • Ветеран
  • *****
  • Пол: Мужской
  • Древние тайны всех мирозданий мне под силу...
    • Просмотр профиля
Злостный оффтопик
Откройте учебник по программированию...
Что тут полагается - обижаться или смеяться?  ;D

Цитировать
Цитировать
В C и в С++ "передача массива" и "передача указателя на первый элемент массива" это в точности одно и то же.
да, да, да, совсем одно и тоже. Откройте учебник по программирванию и посмотрите, чем указатель отличается от массива. К сожалению я свой конспект отдал так бы привел цитаты.
Но по памяти указатель-это переменная, которая содержит адрес некоторой области памяти.
Указатель отличается от массива в трех местах:
- они по-разному описываются
- имени массива нельзя ничего присвоить (и нельзя написать, например, A++), т.е. он ведет себя не как lvalue, а как константа.
- sizeof для них выдает разные значения.
Может быть, есть что-нибудь еще, но навскидку не вспомню.
Но если имя массива встречается в каком-то выражении (или присваивается указателю, или передается параметром), то оно воспринимается как указатель на первый элемент.
Вас же не смущает фрагмент:
int A[100],*b,*c;
b=A;
c=b+10;
*A=*(A+1)=*c=c[-1]+A[4];

Цитировать
зачем? Это же у нас переменная, которая используется не только в процедуре, но и в
основной программе?
Прежде всего - чтобы не вспоминать о том, что функция может испортить эту переменную. А то в какой-то момент у Вас появится код
for(i=0;i<16;i+=4) sin(4,A+i);
и придется долго разбираться, почему это программа вдруг стала бесконечно печатать одну и ту же строку.
Ну и вообще, простые переменные (не массивы) лучше описывать прямо там, где они используются. Всем будет проще - и программисту, и компилятору. Да и работать оно будет эффективнее.
« Последнее редактирование: 10/12/2010, 12:09:55 от Mrrl »
When I see a troll up in the mountains with a necklace of human skulls, I say good luck to him. (c)

Насколько я помню, я был всегда!

Оффлайн Амирель

  • Старожил
  • ****
  • Пол: Мужской
  • Охотник
    • Просмотр профиля
Собственно, когда я писал ответ на ваше приведущее сообщение, ко-мне подошел друг с шестого курса и указал мне те же ошибки, что и вы(еще некоторые другие у меня нашел) и объяснил их. Так что виноват, каюсь, был неправ.
"Историю пишет победитель."(с)

Оффлайн Амирель

  • Старожил
  • ****
  • Пол: Мужской
  • Охотник
    • Просмотр профиля
Еще один вопрос возник как можно "прочитать" протокол Http?
"Историю пишет победитель."(с)

Оффлайн Corwin

  • Ветеран
  • *****
  • Пол: Мужской
    • Просмотр профиля
Слушать 80-й порт.

А дальше:
http://ru.wikipedia.org/wiki/Заголовки_HTTP
RFC 2068, RFC 822 и т.д.
Немає сенсу.

Оффлайн Амирель

  • Старожил
  • ****
  • Пол: Мужской
  • Охотник
    • Просмотр профиля
Цитировать
Слушать 80-й порт.
Угу, щас ухо к системнику приложу послушаю)
Ты мне подробно напиши так, как я в этом разбираюсь лишь слегка.
На этой ссылки я чей-т не нашел ответа.
"Историю пишет победитель."(с)

Оффлайн Corwin

  • Ветеран
  • *****
  • Пол: Мужской
    • Просмотр профиля
Ты хочешь чтобы я тебя так просто научил написать свой браузер или даунлоадер О_о
Немає сенсу.

Оффлайн Амирель

  • Старожил
  • ****
  • Пол: Мужской
  • Охотник
    • Просмотр профиля
Зачем мне писать свой браузер или даунлоадер?
Если я правильно понял, то прослушать 80 порт- это значит настроить свой браузер на прием инфы только с этого порта. Причем это оказалось довольно легко. :)
Что дальше?
"Историю пишет победитель."(с)

Оффлайн Corwin

  • Ветеран
  • *****
  • Пол: Мужской
    • Просмотр профиля
Слушать 80-й порт должен веб-сервер (Apache, IIS, nginx etc.), а браузер — отсылать на 80-й порт.
Немає сенсу.