Нужен совет с простой программой кода C

У меня вопрос к С. Я только начал его изучать, так что терпите меня.

Я хочу написать простую программу, чтобы:

  1. Handle errors
  2. Do a simple print task

Это просто сделано в консоли.

#include <stdio.h>
main()
{
   int x, y, z, loop_one, loop_two;
   printf("Give a number \n");
   scanf("%d",&x);
   for(loop_one = 1; loop_one <= x; loop_one += 1)
   {
      for(loop_two = 1; loop_two <= x; loop_two += 1)
      {
         y = y + 1;
         printf("1/%d = ", y);
      }
   }
}

Это мой код, но теперь я немного потерял логику. Я даже не добавил обработку ошибок.

Ошибки должны быть всякий раз, когда пользователь вводит отрицательное число. Он должен напечатать «retype» и продолжать делать это до тех пор, пока пользователь не выдаст положительное число.

Вторая задача заключается в том, что программе нужно вычислить из 1/1 + 1/2 .... 1 / x = сумма и распечатать его вот так.

Например, если пользователь дает 5, вывод должен быть:

1/1 + 1/2 + 1/3 + 1/4 + 1/5 = 2.28

Вам нужен новый источник изучения C, ваш текущий очень устарел.

Lundin 28.10.2018 12:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
72
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете попробовать это

#include <stdio.h>
int main()
{
int x,y,z,loop_one,loop_two;
printf("Give a number: ");
scanf("%d",&x);
float ans=0;
for(loop_one=1;loop_one<x;loop_one+=1)
{
    ans+=1/(float)loop_one;
    printf("1/%d + ",loop_one);

}
ans+=1/(float)x;
printf("1/%d = %f\n",x,ans);
}

На самом деле вам не нужны два цикла для вычисления окончательного значения.

Я завершил цикл непосредственно перед x, иначе он напечатал бы лишний "+" подписать сразу после 1 / x.

Если вы не знаете о приведении типов (например, (float) x), вы можете погуглить. В C деление на целые числа всегда возвращает целое число, следовательно, 1/2 +1/3 +1/4 равно 0 в C!

Поэтому целые числа были преобразованы в числа с плавающей запятой.

Теперь для обработки целых чисел -ve

Вы можете взглянуть на это:

#include <stdio.h>
int main()
{
int x,y,z,loop_one,loop_two;
printf("Give a number: ");
scanf("%d",&x);
while(x<=0)
{
    printf("Error !, Enter a valid number: ");
    scanf("%d",&x);
}
float ans=0;
for(loop_one=1;loop_one<x;loop_one+=1)
{
    ans+=1/(float)loop_one;
    printf("1/%d + ",loop_one);

}
ans+=1/(float)x;
printf("1/%d = %f\n",x,ans);
}

Ваша основная функция всегда должна быть либо int main(void), либо int main(int argc, char *argv[]), в зависимости от того, интересуетесь ли вы аргументами командной строки или нет. Всегда #include <stdlib>, поэтому вы можете вернуться из основной функции, используя return EXIT_SUCCESS; или return EXIT_FAILURE;, или выйти из программы где угодно, используя exit(EXIT_SUCCESS); или exit(EXIT_FAILURE);.

Рекомендуемый простейший "Hello, world!" программа

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

int main(void)
{
    printf("Hello, world!\n");
    return EXIT_SUCCESS;
}

Используйте его как основу для ваших собственных программ.

  1. Handle errors

Семейство функций scanf() возвращает количество успешных преобразований. Итак, у вас действительно должно быть что-то вроде

    if (scanf("%d", &x) < 1) {
        printf("That's not a number. Goodbye, you sneaky human.\n");
        return EXIT_FAILURE;
    }

чтобы проверить, было ли введенное число целым или нет.

Подсказка: попробуйте

    printf("Please input a positive integer:\n");
    while ( (scanf("%d", &x) < 1) || (x < 1) ) {
        printf("No, a positive integer, please.\n");
    }

и посмотрите, как он себя ведет. || - это логический оператор ИЛИ в C. Это короткое замыкание, что означает, что левая сторона оценивается первой, а если это правда, правая сторона вообще не проверяется.

  1. Do a simple print task

Сначала научитесь рисовать логику на бумаге. Скоро вы научитесь делать это в уме, хотя рисование полезно для многих из-за того, как зрительно-моторная координация влияет на задействованную модель мышления. Некоторые вместо этого используют метод резиновой утки, то есть говорят об этом вслух, как будто описывая это какому-то другому человеку (но вместо этого разговаривают, например, с резиновой уткой); выражение мыслей словами и линейная речь также помогает организовать ваши мысли.

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

Let  n  be some integer
Prompt user to input a positive integer
Scan n from input
While scan failed, or n is less than 1:
    Prompt user to input a positive integer
End While

Часть распечатки мы могли бы написать как

Let  sum  be some double-precision floating-point number
Let  i  be some integer

Let  sum = 1.0
Print "1/1"
For i from 2 to n, inclusive:
    Print " + 1 / %d", i
    Let  sum = sum + 1.0 / i
End For

Print " = %.3f\n", sum

При добавлении каждой дроби к сумме мы используем 1.0 / i, потому что хотим оценить ее как деление с плавающей запятой. (Вместо этого мы могли бы использовать 1/(double)i или 1.0 / (double)i; но пока единица (либо делимое, либо делитель) является числом с плавающей запятой, компилятор будет выполнять деление с плавающей запятой.) Если мы используем только 1/i, компилятор сделает это. целочисленное деление, что дает 0 для всех i больше единицы. Это не то, что мы хотим.

При распечатке результата %f - это шаблон для использования с числом с плавающей запятой. Форма %.3f сообщает библиотеке C использовать три десятичных знака после запятой, поэтому, например, printf("%.3f\n", 1.0) печатает 1.000. \n, как вы уже хорошо знаете, является новой строкой: любой следующий вывод будет переходить в новую строку.

Теперь у вас есть достаточная помощь, чтобы выполнить задание. Не будь противным человеком и попытайся откуда-нибудь ответить copy + paste; приложите усилия, чтобы изучить этот материал, и вы обнаружите, что у вас под рукой есть мощный набор инструментов для решения множества различных типов проблем, и вы получите от этого удовольствие. Удачи!

Ответ принят как подходящий
#include <stdio.h>

int main() /*main is a function that returns int*/
{

float x,y,loop_one;/*use float instead of int so you don't lose data */

x = -1;/*set x to be a neg number */

y = 0; /*if not init y = garbage */

while(x < 0)

{

    printf("Give a number \n");

    scanf("%f",&x); /*must advise not to use scanf as it is an unsafe function */
}
for(loop_one=1;loop_one<=x;loop_one+=1) /*you only need one for loop*/
{
    y += (1/loop_one);/*which is the same as y = y+(1/loop_one)*/

    if (loop_one != x)

    {

        printf("1/%.0f + ",loop_one);/*%.0f asks to print none after dec point */

    }

    else

    {

        printf("1/%.0f  ",loop_one); 

    }

}

printf(" = %.2f\n", y);/*%.2f asks to print 2 values after dec point */

return 0;  /*on success returns 0*/
}

Другие вопросы по теме