Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
2 / 2 / 0
Регистрация: 02.05.2017
Сообщений: 87
1

Некорректно работает программа на С

12.10.2017, 09:29. Просмотров 816. Ответов 8
Метки нет (Все метки)

Все примеры из учебника используют переменные типа int но мне приходится использовать переменные типа double поскольку иначе получается белеберда показанная на скриншоте. Подскажите как это исправить?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
#include <locale.h>
void main(void)
{
    setlocale(LC_CTYPE, "Russian");
int n, Sum = 0, i;
printf("Введи n\n");
scanf("%d", &n);
for (i = 0;; i++)
{
    Sum += i;
    printf("Sum = %d\n", &n);
        if (Sum > n)
            break;
}
    system("pause");
}
0
Миниатюры
Некорректно работает программа на С  
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.10.2017, 09:29
Ответы с готовыми решениями:

Некорректно работает программа
Программа в зависимости от значения X считает L по формуле. Некорректно работает, если ввожу не...

Некорректно работает программа на С/С++
Программа написанная на С++ должна вычислять факториал числа а в итоге не делает ничего кроме как...

Некорректно работает программа на С/С++
Запускается программа вот её код #define _CRT_SECURE_NO_WARNINGS #include &lt;windows.h&gt; #include...

Программа, удаляющая повторяющиеся пробелы и табуляции (работает некорректно)
Прошу помощи и детального ( по возможности разбора полетов ) Программа выводит строки где больше...

8
2512 / 1557 / 335
Регистрация: 09.09.2017
Сообщений: 6,265
12.10.2017, 10:02 2
$ gcc main.c -Wall
main.c:4:6: warning: return type of ‘main’ is not ‘int’ [-Wmain]
void main(void)
^~~~
main.c: In function ‘main’:
main.c:12:20: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
printf("Sum = %d\n", &n);

Перед компиляцией поубирал всякий мусор вроде #include <windows.h>, system("pause");
Так вот, компилятор пытается подсказать что printf принимает параметры по значению а не по ссылке. То есть нужно написать printf("%d\n", n); Непонятно, правда, зачем в цикле выводить одно и то же число, которое в программе не меняется.
Кроме того, main() возвращает целочисленное значение, а не void: int main(int argc, char *argv[]) и только так
0
2 / 2 / 0
Регистрация: 02.05.2017
Сообщений: 87
12.10.2017, 10:15  [ТС] 3
COKPOWEHEU, Ничего не понял
Как мне тогда сделать так чтобы программа не сворачивалась если не по средством <windows.h>?
Как мне вводить значение через printf("%d\n",n), если для этого нужен scanf?
И вроде как Sum+=i не должен выводить одно и тоже значение в этом вся суть он приплюсовывает к значению Sum значение i которое в цикле увеличивается.
0
2512 / 1557 / 335
Регистрация: 09.09.2017
Сообщений: 6,265
12.10.2017, 10:44 4
Так программа сама по себе и не сворачивается. Вы ее не из консоли что ли запускаете?
printf нужен для вывода он принимает переменные по значению, scanf - для ввода, он принимает по указателю
Значение Sum+=i меняется, но выводите-то вы не Sum а n.
0
2 / 2 / 0
Регистрация: 02.05.2017
Сообщений: 87
12.10.2017, 10:58  [ТС] 5
[COKPOWEHEU,
Я отключил <windows.h> запустил программу нажав F5 и она свернулась... Это пустой проект на С++ в visual studio
Да с переменной Sum накосячил исправил только значение не изменилось. Может у себя запустите на visual studio? Просто я правду говорю)
Программа теперь выглядит вот так она запустилась но результат тот же с повторяющимися значениями будто буфер переполнен в переменной
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
#include <locale.h>
int main(int argc, char *argv[])
//void main(void)
{
    setlocale(LC_CTYPE, "Russian");
int n, Sum = 0, i;
printf("Введи n\n");
scanf_s("%d", &n);
for (i = 0;; i++)
{
    Sum += i;
    printf("Sum = %d\n", &Sum);
        if (Sum > n)
            break;
}
    system("pause");
}
0
Миниатюры
Некорректно работает программа на С  
2512 / 1557 / 335
Регистрация: 09.09.2017
Сообщений: 6,265
12.10.2017, 11:18 6
Лучший ответ Сообщение было отмечено viral как решение

Решение

Цитата Сообщение от viral Посмотреть сообщение
Может у себя запустите на visual studio?
Где ж я его возьму?! А главное - зачем?
Собственно, я уже проверял ваш код, еще во 2-м посте.
Цитата Сообщение от viral Посмотреть сообщение
printf("Sum = %d\n", &Sum);
По значению передавайте а не по указателю!
printf("Sum = %d\n", Sum); без амперсанда
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main(int argc, char *argv[]){
  int n, sum = 0, i;
  printf("Input n >");
  scanf("%d", &n);
  for (i = 0; sum<=n; i++){
    sum += i;
    printf("Sum = %d\n", sum);
  }
  return 0;
}
Компилирую $ gcc main.c -Wall -lm
Запускаю
$ ./a.out
Input n >3
Sum = 0
Sum = 1
Sum = 3
Sum = 6
1
2 / 2 / 0
Регистрация: 02.05.2017
Сообщений: 87
12.10.2017, 11:22  [ТС] 7
COKPOWEHEU, Ого & это указатель каждый день узнаю что то новое. Спасибо помогло.
0
2512 / 1557 / 335
Регистрация: 09.09.2017
Сообщений: 6,265
12.10.2017, 12:13 8
Цитата Сообщение от viral Посмотреть сообщение
Ого & это указатель
Не совсем так. Это ссылка - константный указатель.
Полноценный указатель объявляется и используется через звездочку
C
1
2
3
4
int x; //объявление переменной
int *y;//объявление указателя
y = &x; //присвоение указателю ссылки на х, то есть ее адреса.
*y = 1; //запись туда, куда указывает у, числа 1. Поскольку у указывает на х, значение х тоже изменится
Впрочем, на счет терминологии не уверен, не всем нравится когда &x называют ссылкой.
0
93 / 40 / 23
Регистрация: 18.09.2016
Сообщений: 373
12.10.2017, 12:15 9
Цитата Сообщение от viral Посмотреть сообщение
Ого & это указатель
Нет это амперсанд, позволяющий получить адрес, по которому располагается значение.
Переменная - указатель - это, к примеру int *ptr;
Значение указателя - адрес.
Поэтому ptr = &val;
ptr стало указывать на адрес, перменной val.
С помощью операции разыменования можно изменить значение переменной val
Например если val был равен 5, после инициализации указателя адресом перменной val, с помощью операции разыменования *ptr = 4, вы изменили значение, хранящаяся по адресу, куда указываеть ptr. А так ptr имеет значение &val, то изменится и само значение переменной val, то есть val = 4
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.10.2017, 12:15

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Программа работает некорректно
Помогите исправить ошибку. плиззз... Программа в гостевом каталоге не выдает ошибки.... Это как то...

Некорректно работает программа
При создании c1 все еще правильно. При выполнении операторов уже нет. Почему? #include &lt;iostream&gt;...

Некорректно работает программа
Программа вызывает права администратора повторяет цикл 5 раз нужно сделать если админ права...

Некорректно работает программа
Написал программу, при работе проскакивает через три цикла for сразу на writeln. В чём может быть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.