JacksonSteel Ответов: 4

Что происходит с этим кодом?


Я хочу построить график увеличения оси y слева направо, x-xis-сверху вниз.

Также попробуйте построить график этого уравнения

a * pow(x, 5) + b * pow(x, 4) + c * pow(x, 3) + d * pow(x, 2) + e * x + f;

учитывая диапазон от x1 до x2

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

/*
input:
10 -5 2 8 1 4
1 20
5
*/

int main() {
	int a, b, c, d, e, f;
	int x = 0;
	int y;
	printf("please input six coefficients\n");
	scanf_s("%d%d%d%d%d%d", &a, &b, &c, &d, &e, &f);

	int x1, x2;
	printf("please input range of x1-x2\n");
	scanf_s("%d%d", &x1, &x2);

	//xt won't be used for now
	int xt;
	printf("please input x value 0f tangent point\n");
	scanf_s("%d", &xt);

	int arr[1000][8000];
	int i, j;
	for (i = 0; i < x2 - x1 + 1; i++) {
		for (j = 0; j < 80; j++) {
			arr[i][j] = 0;
		}
	}

	for (i = 0; i < x2 - x1 + 1; i++) {
		x = i + x1;
		
		y = a * pow(x, 5) + b * pow(x, 4) + c * pow(x, 3) + d * pow(x, 2) + e * x + f;
		j = y - (-39);
		arr[i][j] = 1;
	}

	for (i = 0; i < x2 - x1 + 1; i++) {
		for (j = 0; j < 80; j++) {
			if (arr[i][j]) {
				printf("*");
			}
			else {
				printf(" ");
			}
		}
		printf("\n");
	}

	return 0;
}


Что я уже пробовал:

Я хочу построить график увеличения оси y слева направо, x-xis-сверху вниз.

Rick York

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

Вы можете использовать sscanf для извлечения значений из строки, которую Вы читаете из файла с помощью fgets.

4 Ответов

Рейтинг:
2

Gerry Schmitz

Если вы собираетесь "распечатать" диаграмму, "внешний цикл for" должен быть размером "y", а не "x"; x-это внутренний цикл (когда речь заходит о печати массива).

Распечатайте каждую колонку ... по одному ряду за раз. Нисходящий.


JacksonSteel

черт возьми нет,
ось y горизонтальна

Рейтинг:
1

Patrice T

Цитата:
Что происходит с этим кодом?

Давайте предположим, что точки находятся не там, где вы думаете, что они должны быть, используйте отладчик и то, что выполняет ваш код.
Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


CPallini

Мой 5.

Patrice T

Спасибо

Рейтинг:
1

KarstenK

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

Ваш большой массив странный, и вы не можете установить его нулевым с помощью

int arr[1000][8000] = {0};


CPallini

Мой 5.

Рейтинг:
0

CPallini

Похоже, вы намеревались использовать его arr как экранный буфер, но в конце концов код обрабатывает его неправильно (он должен найти диапазоны для обоих x и y а затем соответствующим образом масштабируйте их в буфер экрана)
Попробуй

#include <float.h>
#include <stdio.h>

#define scanf_s scanf

#define SCREEN_BUFFER_ROWS  100
#define SCREEN_BUFFER_COLS   80

void show_screen_buffer(char * screen_buffer, size_t rows, size_t cols );

int main()
{
  int a, b, c, d, e, f;

  printf("please input six coefficients\n");
  scanf_s("%d%d%d%d%d%d", &a, &b, &c, &d, &e, &f);
  printf("%d %d %d %d %d %d\n", a,b,c,d,e,f);
  int x1, x2;
  printf("please input range of x1-x2\n");
  scanf_s("%d%d", &x1, &x2);
  printf("%d %d\n", x1, x2);

  int xt;
  printf("please input x value 0f tangent point\n");
  scanf_s("%d\n", &xt);
  printf("%d\n", xt);

  double ymax, ymin;
  double xmax, xmin;
  ymax = DBL_MIN;
  ymin = DBL_MAX;

  xmax = x2;
  xmin = x1;

  int row, col;

  int i;
  for ( i = 0; i < (x2-x1); ++i)
  {
    double x = i + x1;
    double y = f + e * x + d * (x*x) + c * (x*x*x) + b * (x*x*x*x) + a * (x*x*x*x*x);
    if ( ymin > y) ymin = y;
    if ( ymax < y) ymax = y;
  }

  int screen_buffer[SCREEN_BUFFER_ROWS] [SCREEN_BUFFER_COLS] = {0};

  for ( i = 0; i < (x2-x1); ++i)
  {
    double x = i + x1;
    double y = f + e * x + d * (x*x) + c * (x*x*x) + b * (x*x*x*x) + a * (x*x*x*x*x);
    row = (SCREEN_BUFFER_ROWS -1) * (x -xmin) / (xmax-xmin);
    col = (SCREEN_BUFFER_COLS -1) * (y -ymin) / (ymax-ymin);
    screen_buffer[row][col] = 1;
  }

  for (row= 0; row < SCREEN_BUFFER_ROWS; ++row)
  {
    for (col=0; col < SCREEN_BUFFER_COLS; ++col)
      putchar( screen_buffer[row][col] ? '*': ' ');
    putchar('\n');
  }

  return 0;
}


С вашими предложенными входными данными он производит в моей системе:
*




*




*




*




*





*




*




 *




 *




   *





     *




       *




           *




                 *




                        *





                                 *




                                             *




                                                            *




                                                                               *


Patrice T

+5

JacksonSteel

в конце концов код обрабатывает его неправильно (он должен найти диапазоны как для x, так и для y, а затем соответствующим образом масштабировать их в буфер экрана)

О чем ты говоришь?
и зачем добавлять эти мин-макс?

CPallini

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