Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2011, 01:11   #1
vrtp
Пользователь
 
Регистрация: 11.10.2011
Сообщений: 33
По умолчанию Указатели

Привет всем. Возникла тут задача нужно забить массив числа некой функции, ну например y=cos(x). Мое решение такое
Код:
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
int main(void)
{
	int i, j,b[1000], *p;
	double a;
	p=b;
	for(i=-20;i<=20;i+=0.4){
		a=cos(i);//считаем значение a
	for(j=1;j<=1000;++j){
		*(p+j)=(a);//каждый массив забиваем значением a
	printf("b[%2d]=%3d\n",*(p+j)); /* вывод на экран */
return 0;
	}}}
Вроде все компилируется, но не работает, но понять немогу почему, подозреваю что-то с указателями.
vrtp вне форума Ответить с цитированием
Старый 03.11.2011, 08:35   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Первое. *(p+j) то же самое, что p[j], то же самое (в данном случае), что b[j]. Ненужная сложность.
Второе. Попытка прибавить 0.4 к переменной целочисленного типа... ну, это выглядит так: i = (int)(i+0.4), в результате чего значение i не изменится.
Третье. Достаточно было проверить поведение функции в отладчике, чтобы увидеть ляп.
Четвёртое. Отступы и комментарии - великая сила.
Код:
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
int main(void)
{
    int i, j,b[1000], *p;
    double a;
    p=b;
    for(i=-20;i<=20;i+=0.4){
        a=cos(i);//считаем значение a
	//А теперь для каждого j, 
        for(j=1;j<=1000;++j){
            //записываем в b[j] a. Обратите внимание, что на протяжении внутреннего
            //цикла a не меняется.
            *(p+j)=(a);//каждый массив забиваем значением a (округлённым до целого)
            printf("b[%2d]=%3d\n",*(p+j)); /* вывод на экран */
            //Угадайте, сколько раз выполнится цикл при наличии этой инструкции?
            return 0;
        }//Конец внутреннего цикла - увеличить j на 1, сравнить с 1000...
    }//Конец внешнего цикла - увеличить j на 0.4 (т.е. не изменить), сравнить с 20...
}//Конец программы
Abstraction вне форума Ответить с цитированием
Старый 03.11.2011, 18:21   #3
vrtp
Пользователь
 
Регистрация: 11.10.2011
Сообщений: 33
По умолчанию

Ошибки некоторые понял, исправил, счас хоть что-то работает, но все равно не то.
Код:
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
int main(void)
{
    int i, j,b[1000], *p;
    double a,c;
    p=b;
    for(i=0;i<=40;++i){
		c=-20+0.4*i;//считаем переменную, которую подставляем в функцию
        a=cos(c);//считаем значение a 
        for(j=1;j<=1000;++j){//А теперь для каждого j,
            *(p+j)=(a);//каждый массив забиваем значением a
			printf("b[%2d]=%3d\n",*(p+j));//выводим на экран 
		}
	}
  return 0;
}//Конец программы
vrtp вне форума Ответить с цитированием
Старый 03.11.2011, 18:36   #4
optimator
Пользователь
 
Регистрация: 12.11.2010
Сообщений: 92
По умолчанию

Элементу интовского массива присваивается double - нехорошо
Код:
*(p+j)=(a);
Компилятор и округлит это до инта, т.е в данном случае до нуля.
Объяви b и p как double. Ну и спецификаторы в printf() исправь соответствующим образом
optimator вне форума Ответить с цитированием
Старый 08.11.2011, 01:01   #5
vrtp
Пользователь
 
Регистрация: 11.10.2011
Сообщений: 33
По умолчанию

Переделал полностью программу, нашел кучу ошибок. Задача теперь такая: забить массив значениями y=cos(x), где х{-12;12} с шагом 0,4
Код:
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
int main(void )
{
    int i;
    float a,c,b[60];//все нужные переменные типа флоат
    for(i=0;i<=60;++i){//включаем счетчик для подсчета функции
		c=-12+0.4*i;//считаем переменную, которую подставляем в функцию
        a=cos(c);//считаем значение a 
	   b[i]=a;//забиваем массив
	printf("b[%2]=%4f\n",c, b[i]);//выводим значение
	}return 0;//закрываем для i
}//Конец программы
Вот только теперь одна проблема с printf, не понимаю что не так, и еще если я присваюваю b[i]=a либо через указатель работаю есть различие?
vrtp вне форума Ответить с цитированием
Старый 08.11.2011, 01:29   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Что за спецификатор формата %2 в строке?
Abstraction вне форума Ответить с цитированием
Старый 08.11.2011, 01:33   #7
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Код:
printf("b[%2f]=%4f\n",c, b[i]);
An1ka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указатели в С++ kdteam Помощь студентам 2 12.11.2010 20:13
Указатели sid Помощь студентам 2 02.01.2010 23:23
Указатели AquaticSoul Общие вопросы C/C++ 5 22.12.2009 15:13
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39