Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - заполнение массива

Ответить
Настройки темы
C/C++ - заполнение массива

Новый участник


Сообщения: 33
Благодарности: 12

Профиль | Отправить 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
Благодарности: 12

Профиль | Отправить PM | Цитировать


появилась идея - можно запрашивать кол-во столбцов в самом начале.
примерно то, что родилось в голове:

Код: Выделить весь код
#include<stdio.h>
#include <conio.h>

void main() 
{
#define NR 7;
#define  NC = a;
FILE *f;
int a;

printf("Какое кол-во измерений в день было произведено?(1 2 4 и т.д.)\n");
scanf("%i", &a);

     float weather[NR][NC];
     If ((f = fopen("weather.txt", "rt")) == NULL)
     {
     printf ("не удалось открыть файл \n"
     getch();
     return;
}

int r,c;  // номер строки и столбца

for (r=0; r < NR; r++)
{
     for(c = 0; c  < NC; c++)
     {
            fscanf(f, "%f", wether[r][c]);
     }
}

fclose (f);

}
1. Можно ли так использовать "#define NC = a"? или нужно " = *a" ?
2. Возможно ли обойтись без этой переменной "а"? Чтобы прежде чем заполнять массив, допустим посчитать кол-во элементов первой строки, содержащейся в файле?
3. Каким образом в данной ситуации использовать средства ввода/вывода с++ (cin/cout)
4. Будет ли правильно заполнен массив, если данные в файле выглядят примерно так:

65.4 -98.7 63.5 -46.5 12.3
38.7 38.7 30.8 65.7 74.8
44.5 75.0 -87.0 28.7 34.7
65.4 98.7 -63.5 -46.5 -12.3
38.7 387 30.8 65.7 74.8
-44.5 -75.0 -87.0 28.7 34.7
24.3 70.8 73.2 24.2 09.8

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

Последний раз редактировалось Lisiy_egik, 14-11-2009 в 23:34. Причина: Слишком коряво в первый раз написал


Отправлено: 19:09, 14-11-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


Lisiy_egik, можно задать структуру файла Бинарные файлы
Единственное что по данной структуре должен быть и заполнен файл, так что если в блокноте где-то пробел был добавлен, программа может с ошибкой считать файл.
В идеале нужно что-б в самой проге и была произведена запись в файл.

Отправлено: 19:30, 14-11-2009 | #3


Новый участник


Сообщения: 33
Благодарности: 12

Профиль | Отправить PM | Цитировать


решил посмотреть как заполняется массив и вот что вышло:

Код: Выделить весь код
#include "stdio.h"
#include "conio.h"
#include "rus8.h"

void main() {

rus();
	
#define NR 7
#define NC 3

	FILE *f;

	float weather[NR][NC];
	int r = 0, c = 0;

	//printf("Введите кол-во измерени	в сутки:");
	//scanf("%i", &a);

	if ((f=fopen("weather.txt", "rt"))==NULL)
	{
		printf("Файл с исходными данными не найден");
		getch();
		return;
	}
	for (r=0; r < NR; r++)
	{
		for(c = 0; c  < NC; c++)
		{
			fscanf(f, "%f", weather[r][c]);
		}
	}

	fclose (f);

	printf("Данные, загруженные из файла в массив:\n");

	for(r = 0; r < NR; r++)
	{
		for(c = 0; c < NC; c++)
		{
			printf("%5.1f", weather[r][c]);
		}
	}

	printf("\n \n я завершения нажминие Ввод");
	getch();
}
или если поменять for на while

Код: Выделить весь код
#include "stdio.h"
#include "conio.h"
#include "rus8.h"

void main() {

rus();
	
#define NR 7
#define NC 3

	FILE *f;

	float weather[NR][NC];
	int r = 0, c = 0;

	//printf("Введите кол-во измерени	в сутки:");
	//scanf("%i", &a);

	if ((f=fopen("weather.txt", "rt"))==NULL)
	{
		printf("Файл с исходными данными не найден");
		getch();
		return;
	}
		while(r < NR)
{
	while(c<NC)
	{
		fscanf(f, "%f", weather[r][c]);
	}
	c++;
}
r++;

	fclose (f);

	printf("Данные, загруженные из файла в массив:\n");

	for(r = 0; r < NR; r++)
	{
		for(c = 0; c < NC; c++)
		{
			printf("%5.1f", weather[r][c]);
		}
	}

	printf("\n \n я завершения нажминие Ввод");
	getch();
}
в файле weather.txt содержится:
23.4 55.2 34.5
54.4 35.6 79.8
45.9 65.8 76.7
23.1 45.2 56.3
34.4 98.5 56.6
12.3 23.2 34.1
98.4 87.3 76.2

При компиляции ошибок нет, а вот при запуске выдает:

Необработанное исключение в "0x691c936c (msvcr90d.dll)" в "p2e1.exe": 0xC0000005: Нарушение прав доступа при записи "0x80000000".

В чем моя ошибка?

Последний раз редактировалось Lisiy_egik, 15-11-2009 в 00:54. Причина: небольшая описка


Отправлено: 00:53, 15-11-2009 | #4


Ветеран


Сообщения: 514
Благодарности: 18

Профиль | Отправить PM | Цитировать


Цитата Lisiy_egik:
нужно заполнить массив double [7][]
в итоге массив содержит измерения погоды (строки - дни недели. столбцы - измерения)
Вопрос: как заполнить такой массив? Как узнать длину каждой строки массива? »
Я бы работал с переменной строки и при заполнии анализировал каждый символ (при анализе символов видно точки, пробелы и цыфры)... Потом есть операторы конца строки и конца фала, поэтому можно, не запрашивать количество измерений.
У меня есть прога похожего плана. Описание программы. Из файла заполненного разными символами выбрать все восеьмеричные комбинации цифр (например "hfdhfhdj45777789rerer jjjj 75 uhh78900987" выбираем 45777789 и 78900987).
Могу текст проги выложить, только там нет комментриев.

Отправлено: 12:48, 15-11-2009 | #5


Ветеран


Сообщения: 514
Благодарности: 18

Профиль | Отправить PM | Цитировать


так наверное проще всего
for(r = 0; r < NR; r++)
fscanf(f,"%f %f %f\n", weather[r][0], weather[r][1], weather[r][2]);

если данные всегда вида:
23.4 55.2 34.5
54.4 35.6 79.8
45.9 65.8 76.7
23.1 45.2 56.3
34.4 98.5 56.6
12.3 23.2 34.1
98.4 87.3 76.2

Отправлено: 13:04, 15-11-2009 | #6


Новый участник


Сообщения: 33
Благодарности: 12

Профиль | Отправить PM | Цитировать


Цитата Ferum01:
так наверное проще всего
for(r = 0; r < NR; r++)
fscanf(f,"%f %f %f\n", weather[r][0], weather[r][1], weather[r][2]);
если данные всегда вида:
23.4 55.2 34.5
54.4 35.6 79.8
45.9 65.8 76.7
23.1 45.2 56.3
34.4 98.5 56.6
12.3 23.2 34.1
98.4 87.3 76.2 »
в том то и дело, что кол-во элементов в различных строках одинаково, их может быть как 3 так и 5 так 100 в общем N(

Отправлено: 13:11, 15-11-2009 | #7


Ветеран


Сообщения: 514
Благодарности: 18

Профиль | Отправить PM | Цитировать


Тогда примерно так:

Код: Выделить весь код
while(!feof(f))
{
do
{
fscanf(fp1, "%c", &sim[eatt]);
if (sim[eatt]=='\n') break;

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]=='.')
      { eatt++; fscanf(f, "%c", &sim[eatt]); } else break;
} while (true);
weather[r][]=sim;  r++; 
// изначально так было strcpy(number1[num1],sim); можно ли символьную переменную целой присваивать не помню... 
eatt=0; 
} while (!feof(f));
fscanf(f, "\n");
}
  fclose(f);

Последний раз редактировалось Drongo, 15-11-2009 в 14:50. Причина: тег - #

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:53, 15-11-2009 | #8


Новый участник


Сообщения: 33
Благодарности: 12

Профиль | Отправить PM | Цитировать


Цитата Ferum01:
weather[r][]=sim; r++; »
спасиб, ток вопрос - что обозначает эта строка? как я понимаю присваиваем значение sim массиву затем переходим на новую строку, а каким образом присваивается элемент строки? (weather[r][-вот этот-])? и как узнать, коке кол-во элементов в итоге получилось? (эта цифра прост для дальнейшей работы нужна)) )

Отправлено: 14:00, 15-11-2009 | #9


Ветеран


Сообщения: 514
Благодарности: 18

Профиль | Отправить PM | Цитировать


Цитата Lisiy_egik:
спасиб, ток вопрос - что обозначает эта строка? как я понимаю присваиваем значение sim массиву затем переходим на новую строку, а каким образом присваивается элемент строки? (weather[r][-вот этот-])? и как узнать, коке кол-во элементов в итоге получилось? (эта цифра прост для дальнейшей работы нужна)) ) »
Все правильно, только не могу сказать точно будет ли так работать присваивание, но всеравно как должно работать.

Количество элементов в строке определяет "eatt" ее наверное надо записать в дополнительный массив массива weather.

Отправлено: 14:10, 15-11-2009 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - заполнение массива

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Заполнение 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




 
Переход