6 / 8 / 8
Регистрация: 06.10.2017
Сообщений: 269
1

что скажите про данную прогу нормально написано?

15.10.2017, 16:22. Показов 519. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дан ряд чисел x (x1,x2...,xn) выбрать из этой совокупности целые числа и для них подсчитать M по формуле M=sqrt(\sum_{k=1}^{n} x^2_k
завтра мне её сдавать,нужно что нибудь доработать посмотрите есть ли утечки памяти итд?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <locale.h>
#include <malloc.h>
 
int main()
{
    int n; //количество чисел
    float *x; //массив этих чисел
 
    setlocale(LC_CTYPE, "Rus"); //Русский язык в консоле
 
    printf("Введите количество чисел в последовательности: ");
    scanf("%d", &n);
 
 
    //Выделение памяти под массив
    x = (float*)malloc(n * sizeof(float));
 
 
    //Считывание массива
    printf("Введите по одному %d чисел:\n", n);
    for(int i = 0; i < n; i++){
        scanf("%f", &x[i]);
    }
 
 
    //Cчитаем M
    float sum2 = 0;
    for(int i = 0; i < n; i++){
        if(x[i] == roundf(x[i])) //Вначале суммируем квадраты всех целых чисел
            sum2 += x[i]*x[i];
    }
 
    //Досчитываем и выводим M
    float M = sqrt(sum2)/n;
    printf("Число M для данной последовательности: %f", M);
 
    //Освобождаем память
    free(x);
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.10.2017, 16:22
Ответы с готовыми решениями:

Что скажите про данную сборку?
Всем привет! Вот сборка : http://www.citilink.ru/order/

Что скажите про леново
Читал в нете что леново не плохие ноуты, цена качество соблюдено отлично что вы скажите??

Не работает мышь,в диспетчере устройств написано что работает нормально
При удалении мыши из &quot;ДИСПЕТЧЕР УСТРОЙСТВ&quot;и после перезагрузки комп находит мышь и опять...

что скажите про GeForce 9600 GТ?
у меня она стоит... меня устраивает) но хотелось бы услышать ваше мнение о ней) её плюсы/минусы)

11
1993 / 1109 / 697
Регистрация: 25.04.2016
Сообщений: 3,167
15.10.2017, 17:00 2
float *x; //массив этих чисел

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

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <locale.h>
 
int main()
{
    int n; //количество чисел
 
    setlocale(LC_CTYPE, "Rus"); //Русский язык в консоле
 
    do{
        printf("Введите количество чисел в последовательности: ");
        scanf("%d", &n);
    }while(n <= 0);
 
    //Выделение памяти под массив этих чисел
    float x[n];
 
 
    //Считывание массива
    printf("Введите по одному %d чисел:\n", n);
    for(int i = 0; i < n; i++){
        scanf("%f", &x[i]);
    }
 
 
    //Cчитаем M
    float sum2 = 0;
    for(int i = 0; i < n; i++){
        if(x[i] == roundf(x[i])) //Вначале суммируем квадраты всех целых чисел
            sum2 += x[i]*x[i];
    }
 
    //Досчитываем и выводим M
    float M = sqrt(sum2)/n;
    printf("Число M для данной последовательности: %f", M);
 
    return 0;
}
Добавлено через 19 минут
Что еще можно изменить/улучшить?

У вас несколько циклов использует одну и ту же переменную i, проще 1 раз объявить ее в начале программы, чем выделять под нее память при каждом вызове каждого нового цикла.

В объявлении
float sum2 = 0;

лучше явно указать, что число с точкой:
float sum2 = 0.0;

В остальном никаких нареканий.
0
94 / 41 / 23
Регистрация: 18.09.2016
Сообщений: 379
15.10.2017, 17:15 3
stake-k26,
Цитата Сообщение от stake-k26 Посмотреть сообщение
o{
* * * * printf("Введите количество чисел в последовательности: ");
* * * * scanf("%d", &n);
* * }while(n <= 0);
Может зациклиться, используйте while(getchar() != '\n'); для очистки потока.
0
1993 / 1109 / 697
Регистрация: 25.04.2016
Сообщений: 3,167
15.10.2017, 17:17 4
В линуксе может, однако тут явно винда. К тому же зацикливание происходит потому, что в потоке ввода остается код клавиши Enter, так что проще после scanf пустой getchar() добавить.

т.е.

C
1
2
3
4
5
do{
        printf("Введите количество чисел в последовательности: ");
        scanf("%d", &n);
        //getch();   //раскомментировать при необходимости
    }while(n <= 0);
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12237 / 7404 / 1736
Регистрация: 25.07.2009
Сообщений: 13,585
15.10.2017, 17:24 5
Цитата Сообщение от Michail97 Посмотреть сообщение
Может зациклиться
С какого перепуга? Спецификатор "%d" пробельные символы пропускает.
Другое дело, вот этот фортель
Цитата Сообщение от stake-k26 Посмотреть сообщение
float x[n];
только компилятор, поддерживающий VLA, пропустит. Мелкостудия упрётся в то, что размер массива должен быть константой.
0
94 / 41 / 23
Регистрация: 18.09.2016
Сообщений: 379
15.10.2017, 17:31 6
easybudda, введите какую-нибудь строчную фигню, тогда посмотрим, что произойдёт.

Добавлено через 1 минуту
Марина1211, лучше не сравнивайте вещественный числа на знак равенства. Лучше сравнивайте модуль разности вещественного(округлённого) и фактического с каким-то очень малым числом.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12237 / 7404 / 1736
Регистрация: 25.07.2009
Сообщений: 13,585
15.10.2017, 17:36 7
Цитата Сообщение от Michail97 Посмотреть сообщение
введите какую-нибудь строчную фигню
если речь о проверке ввода, то прежде всего нужно значение, возвращённое scanf, проверять.
C
1
2
if ( scanf("%d", &n) != 1 )
  // какая-то умница вместо числа буквы вводит...
0
94 / 41 / 23
Регистрация: 18.09.2016
Сообщений: 379
15.10.2017, 17:45 8
Марина1211,
Проверять на равенство вещественные числа неправильно. Лучше сравнивайте их разницу с каким-то очень малым числом
И добавьте проверки ввода на примере этой. Тогда будет сок
C
1
2
3
4
5
6
int d;
    do{
        printf("Введите количество чисел в последовательности: ");
        d = scanf("%d", &n);
        if( !d || n <= 0 ) while( getchar() != '\n' );
    }while(!d || n <= 0);
C
1
2
3
4
5
float sum2 = 0;
    for(int i = 0; i < n; i++){
        if( fabs( x[i] - roundf(x[i])) < 1e-7) //Вначале суммируем квадраты всех целых чисел
            sum2 += x[i]*x[i];
    }
Добавлено через 2 минуты
easybudda, проверка проверкой, но scanf продолжает читать поток все равно. Надо его очищать
0
Неэпический
17850 / 10618 / 2049
Регистрация: 27.09.2012
Сообщений: 26,689
Записей в блоге: 1
15.10.2017, 18:39 9
только компилятор, поддерживающий VLA, пропустит. Мелкостудия упрётся в то, что размер массива должен быть константой.
В языке C такая возможность есть,
а она(студия) и C99 не поддерживает.
Что ж теперь, не пользовать C99?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12237 / 7404 / 1736
Регистрация: 25.07.2009
Сообщений: 13,585
15.10.2017, 19:28 10
Цитата Сообщение от Michail97 Посмотреть сообщение
проверка проверкой, но scanf продолжает читать поток все равно. Надо его очищать
Очищать надо, кто бы спорил, но и проверку надо правильно делать.
RETURN VALUES
These functions return the number of input items assigned, which can be
fewer than provided for, or even zero, in the event of a matching fail-
ure. Zero indicates that, while there was input available, no conver-
sions were assigned; typically this is due to an invalid input character,
such as an alphabetic character for a `%d' conversion. The value EOF is
returned if an input failure occurs before any conversion such as an end-
of-file occurs.
If an error or end-of-file occurs after conversion has
begun, the number of conversions which were successfully completed is
returned.
То есть, если не будет ни букв, ни цифр, а будет признак окончания ввода (Ctrl+D в *NIX, Ctrl+Z в Win), такая вот проверка
C
1
if ( !d ...
ни к чему хорошему не приведёт.
0
Неэпический
17850 / 10618 / 2049
Регистрация: 27.09.2012
Сообщений: 26,689
Записей в блоге: 1
15.10.2017, 19:43 11
easybudda, как по мне, то ввод от пользователя лучше
сначала всегда читать в строку, а потом уже анализировать.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12237 / 7404 / 1736
Регистрация: 25.07.2009
Сообщений: 13,585
15.10.2017, 21:34 12
Цитата Сообщение от Croessmah Посмотреть сообщение
как по мне, то ввод от пользователя лучше
сначала всегда читать в строку, а потом уже анализировать.
Если есть варианты, что там во вводе может быть (строка, целое число, вещественное...), то да, однозначно. А когда просто числа одного типа из ввода читаются - лишние хлопоты по-моему...
Цитата Сообщение от Croessmah Посмотреть сообщение
Что ж теперь, не пользовать C99?
Использовать, конечно, но здесь на форуме, где далеко не все подобные "тонкости" знают, лучше этот момент обозначать как-то, чтобы вопросов не возникало... И кстати, в С11 VLA - вещь не обязательная, могут поддерживаться, но есть варианты:
Variable length
arrays are a conditional feature that implementations need not support
Committee Draft — April 12, 2011, 6.7.6.2.4
2
15.10.2017, 21:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2017, 21:34
Помогаю со студенческими работами здесь

Ребят что скажите про этот ноутбук?
https://www.eldorado.ru/cat/detail/71360679/?show=properties#customTabAncho Нужен для кода для...

Скажите все что думаете про данный ноутбук
Говорите все что думаете, ну или может кто то посоветует что то лучше то буду благодарен ...

delphi(скажите пожалуйста про эти компоненты хоть что -нибудь))
1) переключатели с фиксированной и не фиксированной фиксацией(компоненты TRadiobuflon и...

Что можете сказать про данную модель ноутбука 17.3" Ноутбук DEXP Atlas H153?
Что можете сказать про данную модель ноутбука 17.3&quot; Ноутбук DEXP Atlas H153? Про бренд DEXP вообще...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru