Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Aurum Flare
2 / 2 / 1
Регистрация: 14.10.2009
Сообщений: 22
#1

программа работающаю с динамической матрицей(память выделяется динамически) трабл с подсчетом строк в файле - C++

14.10.2009, 21:05. Просмотров 1045. Ответов 10
Метки нет (Все метки)

В матрице найти минимальный элемент. Разделить элементы строки, в которой он находится, на найденный минимальный элемент.
обязательно чтение матрицы из внешнего файла, при этом память под нее должна выделяться динамически

помогите кто-нибудь((

Добавлено через 1 минуту
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
#include <iostream.h>
#include <iomanip.h>
#include <fstream.h>
#include <conio.h>
#include <process.h>
#include <math.h>
#include <stdlib.h>
 
float **m;
float min;
int k,i=0,j=0,n,imin,jmin;
ifstream f;
 
 
void main()
{
clrscr();
 
f.open("matrix.txt");
if(!f)
{
cerr<< "oshibka otkrytiya fayla!\n\nNazmite lyubuyu klavishu";
getch();
exit(1);
};
 
 
i=0;
while(f.peek()!=EOF)
{                                                                   //здесь считается количество строк в файле
f.ignore(100,'\n');                                      //и если в конце внеш файла поставить <enter>
k++;                                                            //получаем неправильное представление матрицы
}                                                                  //как этого можно избежать?
 
f.close();f.open("matrix.txt");
while(!f.eof())
{
f >> j;i++;
}
 
n=(i-1)/k;
 
f.close();
cout<<"kolichestvo strok "<<k<<'\n'
<<"kolichestvo elementov v stroke "<<n<<'\n';
 
imin=0; jmin=0; min=0;
 
f.open("matrix.txt");
 
m=new float*[k];
 
 
cout<<'\t'<< "ishodnaya matrica:"<<'\n'<<'\n';
for(i=0;i<k;i++)
{
m[i]=new float[n];
for(j=0;j<n;j++)
{
f >> m[i] [j];
cout<<setw(5)<<m[i] [j];
if((m[i][j])<=m[imin][jmin])
{
imin=i; jmin=j; min=m[i][j];
};
}
cout<<'\n';
}
f.close();
 
for(j=0;j<n;j++)
m[imin][j]=m[imin][j]/min;
 
cout<<'\n'<<'\n'<<'\t'<<"novaya matrica:"<<'\n'<<'\n';
 
for(i=0;i<k;i++)
{
for(j=0;j<n;j++)
       cout<<setw(5)<< m[i][j];
cout<<'\n';
}
for(i=0;i<k;i++)
delete[]m[i];
delete [] m;
getch();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2009, 21:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос программа работающаю с динамической матрицей(память выделяется динамически) трабл с подсчетом строк в файле (C++):

Не выделяется память - C++
Здравствуйте, пытаюсь выделить память, на одном компьютере работает, на другом нет, возвращает 0x00000000, хотя память имеется в наличии. В...

Где выделяется память для возвращаемого значения функций? - C++
Собственно возник вопрос, корректен ли такой код: есть некая функция, которая возвращает объект класса MyClass: MyClass someFunction();...

Не выделяется память в динамической памяти - C++
Подскажите пожалуйста , почему при выполнении operator + (вызов 114 строка) не выделяется память в динамической области ? Получаю...

Если память для объекта выделяется динамически (строка 33), сортировка sort не работает - C++
Если память для объекта выделяется динамически (строка 33), сортировка sort не работает, если память не выделять, все работает. Как...

Узнать количество структур в файле и динамически выделить память под них - C (СИ)
Доброго времени суток. Начал писать некую программу, работающую со структурами. Появились такие вопросы: 1) Как можно узнать количество...

Программа для динамической слежки за изменениями в файле: Недопустимая операция в нескольких потоках - C#
Здравствуйте уважаемые форумчане, делаю программу для динамической слежки за изменениями в файле и записи этих изменений в лог. Запись в...

10
TanT
эволюционирую потихоньку
466 / 464 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
14.10.2009, 21:14 #2
вопрос в чём?
поправить ошибки в коде или написать правильный вариант?
0
Aurum Flare
2 / 2 / 1
Регистрация: 14.10.2009
Сообщений: 22
14.10.2009, 21:23  [ТС] #3
надо поправить конструкцию в строках 29-33 таак чтобы она не увеличивала счетчик, если считаная строка пустая
0
Aurum Flare
2 / 2 / 1
Регистрация: 14.10.2009
Сообщений: 22
14.10.2009, 21:43  [ТС] #4
есть какие мысли?
0
TanT
эволюционирую потихоньку
466 / 464 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
14.10.2009, 21:43 #5
как-то так
А организовать считывание файла построчно (считая, что строка заканчивается символом перехода на новую строку) так:
string S;
while ( getline(in,S))
{
}

или так

C++
1
2
3
4
5
6
string text;
while(!f.eof())
{                                                                 
getline(f,text,'\n'); //считывает до буквы первода строки
k++;                                                           
}
0
Aurum Flare
2 / 2 / 1
Регистрация: 14.10.2009
Сообщений: 22
14.10.2009, 21:53  [ТС] #6
Цитата Сообщение от TanT Посмотреть сообщение
как-то так


C++
1
2
3
4
5
6
string text;
while(!f.eof())
{                                                                 
getline(f,text,'\n'); //считывает до буквы первода строки
k++;                                                           
}
я пишу в Borland C++ а он не хочет такое пропускать, ругается....
0
TanT
эволюционирую потихоньку
466 / 464 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
14.10.2009, 21:54 #7
на чего ругается?
getline не знает чтоли? вся идея использовть эту функцию
0
Aurum Flare
2 / 2 / 1
Регистрация: 14.10.2009
Сообщений: 22
14.10.2009, 21:57  [ТС] #8
и на getline и на string
0
TanT
эволюционирую потихоньку
466 / 464 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
15.10.2009, 05:50 #9
посмотри сей пример
на стринг у тебя ругался компилятор из-за отсутсвия библиотеки
попробуй скомпилить пример целиком, идея его работы надеюсь понятна
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
#include <iostream>
#include <fstream>
#include <string>
 
 
using namespace std;
 
// считает количество строк не нулевой длины (игнорирует пустые строки)
int main()
{
    char *File="text.txt";
    string str;
    int k=0;
 
    ifstream f(File);
    if (!(f.is_open()))  // проверка наличия файла с тестом
        cout<<"ERROR: not file "<<File;
    else
    {
        while(!f.eof()) // чтении из файла
        {   
            getline(f, str);
            if (!(str.empty()))         ++k;
        }
    }
 
    cout<<"number strings: "<<k<<endl;
    f.close();
    cout << endl;
    system("PAUSE");
    return 0;
}
0
Aurum Flare
2 / 2 / 1
Регистрация: 14.10.2009
Сообщений: 22
16.10.2009, 22:39  [ТС] #10
попробовал, не комяпилится
0
-=ЮрА=-
Заблокирован
Автор FAQ
23.10.2009, 12:13 #11
Вот мои соображения:
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
#include <windows.h>
#include <stdio.h>
 
char * sData = (char *)malloc(sizeof(char));
char * GetFileData(char * fName, char * sData);
int GetNumSymbls(char * sData, char Smbl);
float * GetRow(char * sRow, char Smbl, float * fRow);
 
float ** mass = (float **)malloc(sizeof(float));
 
void main()
{
    sData = GetFileData("matrix.txt", sData);
    //Подсчёт числа строк
    //\n - окончание строки
    int m = GetNumSymbls(sData, '\n') + 1;
    //между элементами матрицы - пробел
    //Подсчёт числа элементов
    int num = GetNumSymbls(sData, ' ') + m;
    int n = 0;
    mass = (float **)realloc((void *)mass,sizeof(float)*m);
    char * chBuf = strrchr(sData,'\n');
    while(chBuf)
    {
        //Этим условием избегаем ситуации когда
        //вконце файла пользователей несколько лишних
        //раз Enter нажал
        if(chBuf + 1)
        {
            n++;
            mass[num/m - n] = (float *)malloc(sizeof(float));
            mass[num/m - n] = GetRow(chBuf + 1,' ', mass[num/m - n]);
        }
        sData[strlen(sData) - strlen(chBuf) - 1] = '\0';
        chBuf = strrchr(sData,'\n');
    }
    n++;
    mass[num/m - n] = (float *)malloc(sizeof(float));
    mass[num/m - n] = GetRow(sData,' ', mass[num/m - n]);
    printf("\tInput matrix :\r\n");
    for(int i = 0,j; i < m; i++)
    {
        for(j = 0; j < n; j++)
            printf("%.2f ",mass[i][j]);
        printf("\r\n");
    }
    printf("Press NUM1 to read new matrix\r\n");
    scanf("%d",&num);
    if(num == 1)
        main();
}
 
char * GetFileData(char * fName, char * sData)
{
    FILE *f = fopen(fName,"rb+");
    if(f)
    {
        fseek(f,0,SEEK_END);
        int sLen = ftell(f);
        fseek(f,0,SEEK_SET);
        sData = (char *)realloc(sData,sizeof(char)*sLen);
        fread(sData,1,sLen,f);
        fclose(f);
        sData[sLen] = '\0';
    }
    return sData;
}
 
int GetNumSymbls(char * sData, char Smbl)
{
    int RetVal = 0;
    char * chBuf = strchr(sData,Smbl);
    while(chBuf)
    {
        RetVal++;
        chBuf = strchr(chBuf + 1,Smbl);
    }
    return RetVal;
}
 
float * GetRow(char * sRow, char Smbl, float * fRow)
{
    int i = 0, n = GetNumSymbls(sRow, ' ') + 1;
    fRow = (float *)realloc((void *)fRow,sizeof(float)*n);
    char * chBuf = strrchr(sRow,Smbl);
    while(chBuf)
    {
        i++;
        fRow[n - i] = atof(chBuf);
        sRow[strlen(sRow) - strlen(chBuf)] = '\0';
        chBuf = strrchr(sRow,Smbl);
    }
    fRow[n - i - 1] = atof(sRow);
    return fRow;
}
1
Изображения
 
Вложения
Тип файла: txt matrix.txt (72 байт, 17 просмотров)
23.10.2009, 12:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2009, 12:13
Привет! Вот еще темы с ответами:

Выделяется ли память? - C++
Доброе время суток! У меня есть BYTE *pOutData = NULL; Объясните пожалуйста что происходит в следующем: strcpy(cToken, &quot;Задан...

Не выделяется память - C++
#include&lt;iostream&gt; #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; using namespace std; class DynArray { public: int size, end; int...

Выделяется ли память для ссылки? - C++
Добрый день есть код: char a = 'd'; char *ptr = &amp;a; char &amp;link = a; Вопрос в том, что такое link? Отдельный объект или просто...

Не выделяется память под массив - C (СИ)
void FloodFill_3(HDC hdc, RECT rect, COLORREF color, COLORREF border) //Растровая развертка многоугольников { //flags - состояние...


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

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

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