Nano Hash - криптовалюты, майнинг, программирование

Как сделать гистограмму в C?

Я написал программу, которая выводит целые числа в том же порядке, что и ввод, с 5 числами в строке. То есть первые 5 целых чисел будут напечатаны в первой строке; следующие 5 целых чисел в следующей строке; и так далее. Я также пытался распечатать числа в формате гистограммы, например,

81-105 ( 1) x
56-80 ( 5) xxxxx
6-11(5) xxxxx
-1-5 (3) xxx

Моя программа:

cntr=0;
 while (fscanf(in, "%d", &a[i]) != EOF)
   {i++;

 fprintf(out, "%d-%d (%d) %s\n", A, B, k, x, cntr);
 fprintf(out, "%d\n", k, cntr);

    fprintf(out, "x", a[i]);
    i++;
   }

   fprintf(out, "1864-2336 (%d)%s\n", k, x);
   fprintf(out, "1391-1863 (%d)%s\n", k, x);
   fprintf(out, "918-1390 (%d)%s\n", k, x);
   fprintf(out, "445-917 (%d)%s\n", k, x);
   fprintf(out,"-28-444 (%d)%s\n", k, x);
    fclose(in);
    fclose(out);
return 0;
}
31.03.2010

  • Ваш вопрос будет легче читать, если вы не будете стилизовать все это как код, используйте это строго для фактического кода. 31.03.2010
  • все заданные вами вопросы помечены как домашнее задание, и вы не приняли ни один из них. хммм stackoverflow.com/users/292489/user292489 31.03.2010

Ответы:


1

Вам не нужно использовать цикл, чтобы распечатать ваши крестики. Вы можете объявить одну строку x такой длины, которая вам потребуется, а затем использовать спецификацию размера в вызове printf, чтобы контролировать, сколько печатается. Вот простой пример, чтобы проиллюстрировать, что я имею в виду:

#include <stdio.h>
#include <string.h>

int main(void)
{
  char maxBar[] = "xxxxxxxxxx";
  size_t i;

  for (i = 0; i < strlen(maxBar); i++)
  {
    printf("%lu: %-*.*s\n", (unsigned long) i, strlen(maxBar), i, maxBar); 
  }
  return 0;
}

Вывод должен выглядеть следующим образом:

0: __________          
1: x_________
2: xx________
3: xxx_______
4: xxxx______
5: xxxxx_____

и т. д., где _ представляет пробел.

* в спецификаторе преобразования printf указывает, что ширина поля или спецификация точности передаются в качестве аргумента printf. Письмо

printf("%-*.*s\n", 10, 2, "test");

это то же самое, что написать

printf("%-10.2s\n", "test");

что при чтении слева направо означает

  1. -: Выровнять вывод по левому краю
  2. 10: Минимальная ширина поля – 10 символов.
  3. .2: Точность (максимальное количество печатаемых символов) равна 2.

Итак, вывод выглядит так

te________

где _ представляет пробел.

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

for (i = 0; i < k; i++)
{
  printf("%d-%d (%d) %*.*s\n", lo[k], hi[k], ct[k], strlen(maxBar), ct[k], maxBar);
}
31.03.2010

2

просто выполните цикл, чтобы напечатать количество x, которое вам нужно

   fprintf(out, "1864-2336 (%d)%s\n", k, x);
   for(x=k;x>0;x--)
      fprint(out,"%s","x");
   fprintf(out,"\n");

Ваше здоровье!

/B2S

31.03.2010
  • Я попытался с помощью цикла напечатать числа x, которые я хочу напечатать. однако он продолжал выдавать мне ошибку о том, что ядро ​​сброшено. может ли кто-нибудь помочь мне понять, как печатать целые числа в формате гистограммы: у меня есть входные числа в моем входном файле, и я хочу напечатать их в пяти диапазонах (интервалах), и в этом диапазоне я хочу иметь счетчики для подсчета количества целых чисел, попадающих в этот диапазон, путем присвоения K, где k — количество целых чисел, попадающих в этот диапазон; а также я хочу напечатать x для K в каждом интервале. 31.03.2010
  • иначе: A-B(K)xxx , A и B - диапазон , а k - количество интегралов, попадающих в этот диапазон. моя программа: fprintf(out,\n); fprintf(out, %d, cntr); // fprintf(out, 1864-2336 (%d)%s\n, k, x); // А=1864; //В=2336; //к=5; for(x=k;x›0;x--) for(A = 2336; i ‹= 1864; i--) fprintf(out,%d-%d (%d)%s, A, B, k , Икс); } 31.03.2010
  • Если вы отредактируете свой вопрос, когда вы добавите исходный код, его будет легче читать... В коде в вашем комментарии вы не инициализировали i, поэтому цикл пойдет не так. Также вы поставили условие i‹=число, что плохо при обратном отсчете. Если вы считаете в обратном порядке, вы хотите, чтобы i›=число. В противном случае вы должны подсчитать (i++). 11.04.2010

  • 3

    Есть много способов сделать это

    Кажется, вы уже где-то объявили массив значений, которые вводит пользователь. а[]

    Чтобы рассчитать гистограмму, вы можете после того, как пользователь ввел все значения, отсортировать этот массив (например, с помощью qsort()), а затем пройтись по массиву, проверяя количество одинаковых значений, которые встречаются в массиве - это будет число '* ' распечатать

    Я думаю, вы должны сначала позволить пользователю вводить значения, а затем делать вывод.

    Код, который вы показываете, выглядит неправильно, например. вы дважды увеличиваете 'i' в цикле while. Вы используете a[i] после приращения, поэтому оно не будет иметь прочитанное значение.

    Также полезно использовать fgets/atoi вместо этого при чтении чисел, чтобы неверные числа не могли привести к сбою вашей программы.

    31.03.2010
  • Однако я написал свой код, используя массив для моего диапазона интервалов; я не получаю интервалы, он сам дает мне массив: fprintf(out, \n); г = ((А)-(В))/С; предыдущий = А; слева[5]= В; for(i=0; i‹5; i++){ право[i]= предыдущий; if(i!=5) левый[i]= предыдущий-d; предыдущий= слева[i]-1; } 02.04.2010
  • Новые материалы

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

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..