Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2010, 18:03   #1
rubakKa
Пользователь
 
Регистрация: 30.11.2010
Сообщений: 29
По умолчанию Считывание чисел из файла в массив

Всем добрый вечер.. Собственно сабж. Как это сделать на си? Имеется текстовый документ. В первой строке задано число N<=106 - количество чисел второй строки.. Во второй строке через пробел записаны целые значения не превосходящие 100 по абсолютной величине. Нужно создать массив типа
int d[N]={..}; для дальнейшей сортировки чисел.
Или как сортировать числа в файле без массива?
rubakKa вне форума Ответить с цитированием
Старый 30.11.2010, 21:09   #2
Ledom
Пользователь
 
Регистрация: 20.11.2010
Сообщений: 66
По умолчанию

собственно как считать из файла данные:
Код:
}
int d[106];
unsigned char i,N;
FILE *ft;
ft=fopen("адрес файла","rt");
fscanf(ft,"%d",&N]);
for(i=0;i<N;i++)
fscanf(ft,"%d",&d[i]);
fclose(ft);
}
Ledom вне форума Ответить с цитированием
Старый 30.11.2010, 22:28   #3
rubakKa
Пользователь
 
Регистрация: 30.11.2010
Сообщений: 29
По умолчанию

Вы не совсем поняли.. N<=106 это условие. Т.е. если в первой строке будет написано 107 или больше, программа должна выдавать NULL. Но не это главное.. Вот недописанная мною программа. Для наглядного примера я специально добавил массив из 10 чисел (N=10). Требуется, чтобы программа сама считывала число N из первой строки, и N чисел со второй строки файла. И добавляла это в массив dig[N]
Код:
#include <stdio.h>
main(){
int dig[10]={12,7,92,5,18,4,32,48,11,74};
int i,j,N,mm,tmp;
FILE *in, *out;
in=fopen("input.txt","r");
out=fopen("output.txt","w");
for(i=N-1;i>=1;i--){
N=10;
mm=0;
for(j=1;j<=i;j++)
if(dig[j] > dig[mm])
mm=j;
tmp=dig[i];
dig[i]=dig[mm];
dig[mm]=tmp;
}
for(i=0;i<N;i++)
fprintf(out, "%d ",dig[i]);
 
 
 fclose(in);
 fclose(out);
 
  return 0;
}
Попробовал добавить
Код:
int dig[N];
fscanf(in,"%d",&dig[N]);
Но заместо отсортированного списка получается 2 числа, не зависимо от того, что записано во входном файле..
rubakKa вне форума Ответить с цитированием
Старый 01.12.2010, 17:06   #4
Ledom
Пользователь
 
Регистрация: 20.11.2010
Сообщений: 66
По умолчанию

Код:
Вы не совсем поняли.. N<=106 это условие.
да нет, походу кто-то другой не до понимает)))

вот так у меня все работает
Код:
#include <stdio.h>
void main()
{
int dig[25];//выделяю память под 25 элементов, хотя рациональней будет
int i,j,N,mm,tmp;//использовать динамическую память 
FILE *in, *out;// условие проверки добавите сами
in=fopen("D:\\input.txt","r");
out=fopen("D:\\output.txt","w");
fscanf(in,"%d",&N);
for(i=0;i<N;i++)
	fscanf(in,"%d",&dig[i]);
mm=0;
for(i=N-1;i>=1;i--)
{
for(j=1;j<=i;j++)
	if(dig[j] > dig[mm])
mm=j;
tmp=dig[i];
dig[i]=dig[mm];
dig[mm]=tmp;
}
for(i=0;i<N;i++)
fprintf(out, "%d ",dig[i]);
 fclose(in);
 fclose(out);
}

Последний раз редактировалось Stilet; 01.12.2010 в 20:44.
Ledom вне форума Ответить с цитированием
Старый 01.12.2010, 19:42   #5
rubakKa
Пользователь
 
Регистрация: 30.11.2010
Сообщений: 29
По умолчанию

Огромное спасибо, всё работает. Я понял в чем моя ошибка..
rubakKa вне форума Ответить с цитированием
Старый 01.12.2010, 20:25   #6
Ledom
Пользователь
 
Регистрация: 20.11.2010
Сообщений: 66
По умолчанию

ну плюсанул бы мне отзыв)))
Ledom вне форума Ответить с цитированием
Старый 01.12.2010, 20:45   #7
rubakKa
Пользователь
 
Регистрация: 30.11.2010
Сообщений: 29
По умолчанию

Цитата:
Сообщение от Ledom Посмотреть сообщение
ну плюсанул бы мне отзыв)))
уже
Кстати, а как будет выглядеть код, если в первой строке будет 2 числа - N и M. А во второй и третьей N и M чисел соответственно?
rubakKa вне форума Ответить с цитированием
Старый 01.12.2010, 21:02   #8
Ledom
Пользователь
 
Регистрация: 20.11.2010
Сообщений: 66
По умолчанию

если ты их будешь записывать в разные массивы...
то все точно так же...
Код:
scanf(in,"%d",&N);
scanf(in,"%d",&M);
for(i=0;i<N;i++)
	fscanf(in,"%d",&dig1[i]);
for(i=0;i<M;i++)
	fscanf(in,"%d",&dig2[i]);
функции все равно ты их хоть в строчку запиши она будет считывать цифры указанного типа разделенные разделителем, и останавливается она в файле после последнего считанного указывая на следующий.
если файл не закрывать то можно продолжать последовательно считывать...

Последний раз редактировалось Stilet; 02.12.2010 в 09:21.
Ledom вне форума Ответить с цитированием
Старый 01.12.2010, 21:20   #9
rubakKa
Пользователь
 
Регистрация: 30.11.2010
Сообщений: 29
По умолчанию

Огромное спасибо. Как еще плюсануть?

Последний вопрос
Как выявить совпадение значений в двух массивах?.. Пусть в тех же dig1[i] и dig2[i].
Пример:
dig1[i]={2 4 6 8 10 12 10 8 6 4 2}
dig2[i]={6 9 12 15 19}
Числа 6 и 12 встречаются в обоих массивах.

Код:
for(i=0;i<106;i++)
if(dig1[i]==dig2[i]){
               fprintf(out,"%d ", &i);
}
Но получаются не те числа, что я делаю не так?

Последний раз редактировалось Stilet; 02.12.2010 в 09:27.
rubakKa вне форума Ответить с цитированием
Старый 02.12.2010, 20:49   #10
Ledom
Пользователь
 
Регистрация: 20.11.2010
Сообщений: 66
По умолчанию

ну мог бы и сам догадаться, что не так..
посмотри на свой цикл, и что ты сравниваешь.
ты сравниваешь элементы с одинаковыми индексами, а остальные, что не надо???
Ledom вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Считывание из файла чисел, сортировка массива с++ Tresk Помощь студентам 13 07.11.2010 20:01
Считывание с файла отрицательных чисел trinki Общие вопросы C/C++ 2 01.10.2010 01:39
считывание в массив saidmir Общие вопросы C/C++ 4 04.07.2010 10:18
считывание из файла U-S Общие вопросы C/C++ 0 26.02.2010 19:42