|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - заполнение массива |
|
C/C++ - заполнение массива
|
Новый участник Сообщения: 33 |
Профиль | Отправить PM | Цитировать Столкнулся с проблемой:
неком исходном файле содержатся данные в виде: пн 23.3 55.8 32.5 вт 54.3 23.4 сб 45.7.78.1 или просто: 65.3 74.4 85.2 23.4 54.3 и т.д. нужно заполнить массив double [7][] в итоге массив содержит измерения погоды (строки - дни недели. столбцы - измерения) Вопрос: как заполнить такой массив? Как узнать длину каждой строки массива? |
|
Отправлено: 17:08, 14-11-2009 |
Новый участник Сообщения: 33
|
Профиль | Отправить PM | Цитировать я додумался, как определить кол-во элементов в строке. Столкнулся с такой проблемой:
при объявлении массива weather[NR][NC] компилятор сообщает об ошибке, т.к. не может разместить в памяти массив с нулевой размерностью. вот код, подскажите пожалуйста, если это возможно, как мне все таки создать массив, а только после какого-то момента задать ему размерность #include <iostream> #include <fstream> #include "rus8.h" #include "conio.h" using namespace std; int main() { rus(); #define NR 7 #define NC *c char str[100], ch; int i=0,n=0, r, c; float weather[NR][NC]; ifstream in("weather"); if(!in) { cout << "Не удалось открыть файл"; getch(); return 1; } in.get(str, 99); cout << str <<'\n'; in.close(); for(n=0;str[n];n++) { if(str[n] == ' ') { i++; cout << "Найден пробельный символ\n"; } cout << "Символ не является пробелом \n"; } c=i+1; cout << "\n Всего символов " << n << " Из них пробельных " << i; cout << "\n для завершения нажминие Ввод"; getch(); return 0; } main.cpp(15) : error C2057: требуется константное выражение main.cpp(15) : error C2466: невозможно выделить память для массива постоянного нулевого размера main.cpp(15) : error C2087: weather: отсутствует индекс |
Последний раз редактировалось Lisiy_egik, 15-11-2009 в 23:31. Причина: опечатка Отправлено: 23:24, 15-11-2009 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 514
|
Профиль | Отправить PM | Цитировать я думаю на #define NC *c ругается, константа не должна меняться, это же не перменная.
|
Отправлено: 09:59, 16-11-2009 | #12 |
Новый участник Сообщения: 33
|
Профиль | Отправить PM | Цитировать все то. что я делал не верно, нужно было через структуру делать, потом читать не символы, а то. что мне точно известно - это значения типа дабл, в общем пойду читать книжки умные и форумы рыть ((
|
Отправлено: 16:37, 16-11-2009 | #13 |
Ветеран Сообщения: 514
|
Профиль | Отправить PM | Цитировать Если будет время сделаю заполнение массива по вашему случаю... Структура нужна для удобства, но в ней то всеравно надо алгоритм реализовывать...
|
Отправлено: 11:45, 17-11-2009 | #14 |
Ветеран Сообщения: 514
|
Профиль | Отправить PM | Цитировать Сделал, пользуйте...
//--------------------------------------------------------------------------- #include <stdio.h> #include <string.h> #include <dos.h> #include <vcl.h> #pragma hdrstop #pragma argsused int main(int argc, char* argv[]) { char sim[63]; // максимально возможная длина числа int a, b, eatt=0, numa=0,numb=0, numstr[1000]; // количество чисел в каждой строке double number[1000][100]; // массив всех чисел, построчно FILE*fp1; if ((fp1=fopen("1397000.txt", "r"))==NULL) // считывание чисел из файла 1397000.txt { printf ("not file"); return 0; } do { //******* fscanf(fp1, "%c", &sim[eatt]); do //* if ( sim[eatt]=='0' || sim[eatt]=='1' || sim[eatt]=='2' || sim[eatt]=='3' || sim[eatt]=='4' || sim[eatt]=='5' || sim[eatt]=='6' || sim[eatt]=='7' || sim[eatt]=='8' || sim[eatt]=='9' || sim[eatt]=='.' || sim[eatt]=='-') {eatt++; fscanf(fp1, "%c", &sim[eatt]); } else break; while (true); //* if (sim[eatt]==' ') {number[numa][numb]=atof(sim); numstr[numa]=numb; numb++; eatt=0;} if (sim[eatt]=='\n') {number[numa][numb]=atof(sim); numstr[numa]=numb; numb++; eatt=0; numa++; numb=0;} } //******* while (!feof(fp1)); //******* fclose(fp1); // ввод всех преобразованных чисел (в double) в файл 1397001.txt FILE*fp; fp=fopen("1397001.txt", "w"); for (a=0; a<=numa-1; a++) { for (b=0; b<=numstr[a]; b++) fprintf (fp,"%f ",number[a][b]); fprintf (fp,"\n"); } fclose(fp); return 0; } //--------------------------------------------------------------------------- |
Отправлено: 17:52, 19-11-2009 | #15 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Не совсем по теме конечно, вот как ещё можно сделать. здесь не хранится в виде *double[7]
#include <iostream> #include <vector> #include <map> #include <string> #include <iterator> #include <sstream> #include <iomanip> using namespace std; int main(int argc, char* argv[]) { string str1; map<string,vector<double> > weather_by_wday; while(getline(cin, str1)) // перебираем строчки { istringstream line_stm(str1); if ((line_stm >> str1)) // день недели { typedef istream_iterator<double,char> istream_iter; // копируем в него данные из потока copy(istream_iter(line_stm), istream_iter(), back_inserter(weather_by_wday[str1])); } } // теперь всё упорядочено по дням недели // weather_by_wday["день недели"] - это вектор данных // можно пользоваться им так: weather_by_wday["ВТ"][3] - это будет 3-й вторник // допустим надо вывести на экран typedef map<string,vector<double> >::iterator map_iter_t; unsigned max_data_size = 0; // т.к. длины векторов могут быть разные, найдём самый длинный string order[7] = {"mon", "tue", "wed", "thr", "fri", "sat", "sun"}; for(unsigned wday=0; wday<7; ++wday) { cout << setw(10) << order[wday]; unsigned size1 = weather_by_wday[order[wday]].size(); if (max_data_size<size1) max_data_size=size1; } for(unsigned n=0; n<max_data_size; ++n) { cout << "\n"; for(unsigned wday=0; wday<7; ++wday) { cout << setw(10); vector<double> &weather(weather_by_wday[order[wday]]); if (n<weather.size()) cout << weather[n]; else cout << "?"; } } return 0; } |
Отправлено: 21:40, 19-11-2009 | #16 |
Новый участник Сообщения: 33
|
Профиль | Отправить PM | Цитировать Ferum01, pva, спасибо большое, это действительно очень помогло
|
Отправлено: 12:52, 20-11-2009 | #17 |
Новый участник Сообщения: 33
|
Профиль | Отправить PM | Цитировать Цитата Ferum01:
|
|
Отправлено: 13:46, 20-11-2009 | #18 |
Ветеран Сообщения: 514
|
Профиль | Отправить PM | Цитировать Цитата Lisiy_egik:
Вероятно эту библиотеку можно не использовать. |
|
Отправлено: 14:58, 20-11-2009 | #19 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
[решено] Заполнение FORM в IE | HORRIBLE | AutoIt | 5 | 10-09-2009 23:46 | |
Интерфейс - [решено] Не показывается заполнение HDD | JJKey | Microsoft Windows Vista | 2 | 20-06-2009 21:04 | |
Ошибка - Быстрое заполнение диска С: | baltiec | Microsoft Windows 2000/XP | 1 | 17-01-2009 13:04 | |
Заполнение базы из браузера | Qwe1 | Вебмастеру | 6 | 19-02-2008 18:49 | |
Delphi - Заполнение БД в Delphi. SOS!!! | Voprosik | Программирование и базы данных | 4 | 13-11-2005 21:26 |
|