Форум программистов, компьютерный форум CyberForum.ru

Не работает scanf в цикле - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Значение пустых ячеек целочисленной матрицы в C++ http://www.cyberforum.ru/cpp-beginners/thread415241.html
Когда я задаю матрицу в типа int в C# все ячейки по умолчанию заполняются нулями,а что в этом случае в С++?
C++ Описание простой структуры! Описать структуру, содержащую следующие поля: • фамилия, имя; • номер телефона; • дата рождения (массив из трёх чисел). Написать программу, выполняющую следующие действия: • ввод с клавиатуры данных в массив, состоящий из восьми элементов типа NOTE; записи должны быть упорядочены по датам рождения; • вывод на экран информации о человеке, номер телефона которого введён с клавиатуры; • если... http://www.cyberforum.ru/cpp-beginners/thread415233.html
C++ Односвязный список
Дан список целых чисел , удалить все положительные. struct my_list{ int num; struct my_list*Next; } int x; my_list l; void main(){ my_list *Head(int num);
В Универе задали С++, немогу понять что да как... !!! C++
ПОДСОБИТЕ в написании программ в С++ 1) Дано вещественное число A (> 1). Вывести наименьшее из целых чисел N, для которых сумма 1 + 1/2 + ... + 1/N будет больше A, и саму эту сумму. 2) Дано целое число K и набор ненулевых целых чисел; признак его завершения — число 0. Вывести номер первого числа в наборе, большего K. Если таких чисел в наборе нет, то вывести 0. 3) Minmax Найти номер...
C++ Строки кто знает? http://www.cyberforum.ru/cpp-beginners/thread415216.html
Всем привет! нужно написать вот такую прогу : но нужен код как можно проще! я на первом курсе, так что если прога будет написана слишком заумно препод не поверит! Во введённом тексте заменить цифры от 0 до 9 на слова «ноль, «один», …, «девять». заранее спасибо!
C++ Создать сумму массива X[n] Всем доброй ночи! помогите пожалуйста с задачей: Создать сумму массива X. Если она четная массив обнулить, иначе добавить в конец элемент равный сумме. задачу надо реализовать при помощи функций если можно с комментария, хотелось бы разобратся заранее спасибо)) подробнее

Показать сообщение отдельно
alkagolik
Заблокирован
23.12.2011, 05:15     Не работает scanf в цикле
читайте, пробуйте
код
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
 
struct ShortComplex
{
     //для имитации комплексного числа (спектр)
     double re, im;
};
 
void dpf2(float **x, ShortComplex **X, int L1,int L2)
{//вычисление прямого дискретного преобразования Фурье
 //прямым методом. Число операций порядка N*N
    double t;
 
    for ( int k1 = 0; k1 < L1; ++k1 )
        for ( int k2 = 0; k2 < L2; ++k2 ) {
 
            X[ k1 ][ k2 ].re = 0;
            X[ k1 ][ k2 ].im = 0;
 
            for ( int i = 0; i < L1; ++i )
                for (int j = 0; j < L2; ++j) {
                    t = 2. * M_PI * i * k1 / L1+2. * M_PI * j * k2 / L2;
                    X[ k1 ][ k2 ].re += x[ i ][ j ] * cos( t );
                    X[ k1 ][ k2 ].im += x[ i ][ j ] * sin( t );
                }
        }
}
 
void testDPF()
{//формирует тестовый временной сигнал x[i][j]=i если i>L1/2,j>L2/2 для ДПФ
//и выполняет ДПФ, результат в массиве X
    int L1, L2; //кол-во точек дискретизации по X и по Y
 
    printf( "L1=?, L2=?\n" );
    scanf( "%i%i", &L1, &L2 );
 
    float **x;
    ShortComplex **X;
    /***тут вы неверно выделяли память***/
    x = new float* [ L1 ]; 
    X = new ShortComplex* [ L1 ];
    
    /***тут были пропущены скобки***/
    for ( int i = 0; i < L1; ++i ) {
        x[ i ] = new float[ L2 ];
        X[ i ] = new ShortComplex[ L2 ];
    }
    printf("x=\n");
 
    for ( int i = 0; i < L1; ++i ) {
        for ( int j = 0; j < L2; ++j ) {
            if ( i >= L1/2. && j >= L2/2. )
                x[ i ][ j ] = 1.;
            else
                x[ i ][ j ] = 0;
            printf("%6.3f ",x[i][j]);
        }
        printf("\n");
    }
 
    dpf2( x, X, L1, L2 );
    printf( "\nSpectr X\n" );
 
    for ( int i = 0; i < L1; ++i ) {
        for ( int j = 0; j < L2; ++j )
            printf( "(%7.4f %7.4f) ", X[ i ][ j ].re, X[ i ][ j ].im);
        printf("\n");
    }
 
    for ( int i = 0; i< L1; ++i ) {
        delete x[ i ];
        delete X[ i ];
    }
    delete [] x;
    delete [] X;
}
 
void fileDPF()
{//читает тестовый временной сигнал x[i][j] из файла
 //и выполняет ДПФ, результат в массиве X
    int L1, L2;
    FILE * f = fopen( "dan.txt","r" );
    if ( f == NULL ) {
        printf( "faila dan.txt net\n" );
        return;
    }
 
    fscanf( f,"%i%i", &L1, &L2 );
 
    if ( ( L1 < 2 )|| ( L2 < 2 ) ) {
        printf("neverno L1 ili L2\n");
        return;
    }
 
    float **x;
    ShortComplex **X;
    /***тут вы неверно выделяли память***/
    x = new float* [ L1 ];
    X = new ShortComplex* [ L1 ];
 
    for ( int i = 0; i < L1; ++i ) {
        x[ i ] = new float[ L2 ];
        X[ i ] = new ShortComplex[ L2 ];
    }
 
    for (int i = 0; i < L1; ++i ) {
        for ( int j=0; j < L2; ++j ) {
            if ( ( i >= L1/2. ) && ( j >= L2/2. ) )
                x[ i ][ j ] = i;
            else
                x[ i ][ j ] = 0;
            printf("%6.3f ",x[i][j]);
        }
        printf("\n");
    }
    dpf2( x, X, L1, L2 );
    printf( "\nSpectr X\n" );
 
    for ( int i = 0; i < L1; ++i )  {
        for (int j = 0; j < L2; ++j )
            printf( "Re=%7.4f Im=%7.4f\n", X[ i ][ j ].re, X[ i ][ j ].im);
        printf("\n");
    }
    for ( int i = 0; i < L1; ++i ) {
        delete x[ i ];
        delete X[ i ];
    }
    delete[]x;
    delete []X;
}
int main()
{//главная программа -вызывает по выбору пользователя прямое или обратное преобразование
 //прямое для сигнала x[i]=i; //обратное для
    int ip;
    printf("2-mernoe DPF\n");
    do {
        printf( "\n 1-iz faila,  2-test,   0- Vixod\n" );
        scanf( "%d", &ip );
        if ( ip == 1 )
            fileDPF();
        else if ( ip == 2 )
            testDPF();
    } while ( ip != 0 );
 
  return 0;
}
результат
Код
2-mernoe DPF

 1-iz faila,  2-test,   0- Vixod
2
L1=?, L2=?
5
2
x=
 0.000  0.000 
 0.000  0.000 
 0.000  0.000 
 0.000  1.000 
 0.000  1.000 

Spectr X
( 2.0000  0.0000) (-2.0000  0.0000) 
(-0.5000 -1.5388) ( 0.5000  1.5388) 
(-0.5000  0.3633) ( 0.5000 -0.3633) 
(-0.5000 -0.3633) ( 0.5000  0.3633) 
(-0.5000  1.5388) ( 0.5000 -1.5388) 

 1-iz faila,  2-test,   0- Vixod
0

Process returned 0 (0x0)   execution time : 17.293 s
Press ENTER to continue.
тест памяти
==21943== Memcheck, a memory error detector
==21943== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==21943== Using Valgrind-3.6.1-Debian and LibVEX; rerun with -h for copyright info
==21943== Command: ./plus
==21943==
2-mernoe DPF

1-iz faila, 2-test, 0- Vixod
2
L1=?, L2=?
3
5
x=
0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 1.000 1.000

Spectr X
( 2.0000 0.0000) (-0.5000 -1.5388) (-0.5000 0.3633) (-0.5000 -0.3633) (-0.5000 1.5388)
(-1.0000 -1.7321) (-1.0827 1.2024) ( 0.5646 0.2514) (-0.0646 0.6146) ( 1.5827 -0.3364)
(-1.0000 1.7321) ( 1.5827 0.3364) (-0.0646 -0.6146) ( 0.5646 -0.2514) (-1.0827 -1.2024)
==21943== Mismatched free() / delete / delete []
==21943== at 0x4027919: operator delete(void*) (vg_replace_malloc.c:387)
==21943== by 0x8048A61: testDPF() (main.cpp:72)
==21943== by 0x8048DE7: main (main.cpp:143)
==21943== Address 0x42f90a8 is 0 bytes inside a block of size 20 alloc'd
==21943== at 0x4027F65: operator new[](unsigned int) (vg_replace_malloc.c:299)
==21943== by 0x8048873: testDPF() (main.cpp:46)
==21943== by 0x8048DE7: main (main.cpp:143)
==21943==
==21943== Mismatched free() / delete / delete []
==21943== at 0x4027919: operator delete(void*) (vg_replace_malloc.c:387)
==21943== by 0x8048A74: testDPF() (main.cpp:73)
==21943== by 0x8048DE7: main (main.cpp:143)
==21943== Address 0x42f90f0 is 0 bytes inside a block of size 80 alloc'd
==21943== at 0x4027F65: operator new[](unsigned int) (vg_replace_malloc.c:299)
==21943== by 0x804888E: testDPF() (main.cpp:47)
==21943== by 0x8048DE7: main (main.cpp:143)
==21943==

1-iz faila, 2-test, 0- Vixod
0
==21943==
==21943== HEAP SUMMARY:
==21943== in use at exit: 0 bytes in 0 blocks
==21943== total heap usage: 8 allocs, 8 frees, 324 bytes allocated
==21943==
==21943== All heap blocks were freed -- no leaks are possible
==21943==
==21943== For counts of detected and suppressed errors, rerun with: -v
==21943== ERROR SUMMARY: 6 errors from 2 contexts (suppressed: 17 from 6)

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

Добавлено через 6 минут
Цитата Сообщение от eugrita Посмотреть сообщение
Хоть и стиль C, scanf у меня единственный в главной проге
а scanf и fscanf в функциях не в счет? вроде как stdin один на все задачи
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru