У меня вопрос к С. Я только начал его изучать, так что терпите меня.
Я хочу написать простую программу, чтобы:
- Handle errors
- 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





Вы можете попробовать это
#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;
}
Используйте его как основу для ваших собственных программ.
- 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. Это короткое замыкание, что означает, что левая сторона оценивается первой, а если это правда, правая сторона вообще не проверяется.
- 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*/
}
Вам нужен новый источник изучения C, ваш текущий очень устарел.