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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.01.2011, 16:32   #1
Saferon
Новичок
Джуниор
 
Регистрация: 13.01.2011
Сообщений: 5
По умолчанию Массивы,текстовые данные на языке С++

Написал программу,а преподавателю не нравится,чтение из файла и то,что я использую указатели. Помогите пожалуйста.
Вот задание:
Текстовый файл содержит произвольный набор целых числе. Прочитать числа из файла в динамически сформированный массив Х и вывести числа, наиболее близкие к среднему арифметическому всех значений.
А вот код:
Код:
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <alloc.h>
void wait(){
 fflush(stdin);
 getchar();
}
void error(int n){
 switch(n){
  case 0:printf("\n YES");break;
  case 1:printf("\n ???");break;
  case 2:printf("\n NO");break;
 }
 wait();
 exit(n);
}
void prov(FILE *fp){
 char *s;
 if (ferror(fp)){
  sprintf(s,"Error %d",errno);
  perror(s);
  wait();
  clearerr(fp);
  exit(errno);
 }
}
int main(void){
 clrscr();
 int *x;
 FILE *fp;
 double s=0,sr=0;
 int n,i=0,t;
 double min=1000;
 fp=fopen("zachet.txt","rt");
 prov(fp);
 while (!feof(fp)){
  fscanf(fp,"%d",&x[i]);
  printf(" %d",x[i]);
  s+=x[i];
  i++;
 }
 x[i]=(int)malloc(n*sizeof(int));
 n=i;
 sr=s/n;
 printf("\n Среднее значение=");
 printf(" %f \n",sr);
 for (i=0;i<n;i++)
  printf(" %d",x[i]);
 printf("\n Введите ограничение t:");
 scanf("%d",&t);
 for (i=0;i<n;i++)
  if (fabs(x[i]-sr)<t){
   min=fabs(x[i]-sr);
   printf("\n %d %d",x[i],i);
  }
 fclose(fp);
 wait();
 return 0;
}

Последний раз редактировалось Stilet; 13.01.2011 в 17:39.
Saferon вне форума Ответить с цитированием
Старый 13.01.2011, 16:55   #2
Tahoma
DI HALT RET
Форумчанин
 
Аватар для Tahoma
 
Регистрация: 30.12.2010
Сообщений: 117
По умолчанию

А числа в файле как хранятся?
Tahoma вне форума Ответить с цитированием
Старый 13.01.2011, 17:00   #3
Saferon
Новичок
Джуниор
 
Регистрация: 13.01.2011
Сообщений: 5
По умолчанию

в строчку через пробел,например:1 2 3 4 5 5 6 7 8 9 5 5 5
в конце пробела нет.
Saferon вне форума Ответить с цитированием
Старый 13.01.2011, 17:03   #4
Tahoma
DI HALT RET
Форумчанин
 
Аватар для Tahoma
 
Регистрация: 30.12.2010
Сообщений: 117
По умолчанию

А могут ли они быть например:
21 35464 243 144 1 1 555?
Tahoma вне форума Ответить с цитированием
Старый 13.01.2011, 17:04   #5
Saferon
Новичок
Джуниор
 
Регистрация: 13.01.2011
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Tahoma Посмотреть сообщение
А могут ли они быть например:
21 35464 243 144 1 1 555?
вообще могут

вот немного переделанный код:
Код:
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <alloc.h>
void wait(){
fflush(stdin);
getchar();
}
void error(int n){
switch(n){
case 0:printf("\n YES");break;
case 1:printf("\n ???");break;
case 2:printf("\n NO");break;
}
wait();
exit(n);
}
void prov(FILE *fp){
char *s;
if (ferror(fp)){
sprintf(s,"Error %d",errno);
perror(s);
wait();
clearerr(fp);
exit(errno);
}
}

int main(void){
clrscr();
int *x;
FILE *fp;
double s=0,sr=0;
int n,i=0,t;
double min=1000;
fp=fopen("zachet.txt","rt");
prov(fp);
long n1;
fseek(fp,0,SEEK_END);
n1=ftell(fp);
fseek(fp,0,SEEK_SET);
x=(int *)malloc(n1/sizeof(int *));
while (!feof(fp)){
fscanf(fp,"%d",&x[i]);
printf(" %d",x[i]);
s+=x[i];
i++;
}
n=i;
sr=s/n;
printf("\n Среднее значение=");
printf(" %f \n",sr);
for (i=0;i<n;i++)
printf(" %d",x[i]);
printf("\n Введите ограничение t:");
scanf("%d",&t);
for (i=0;i<n;i++)
if (fabs(x[i]-sr)<t){
min=fabs(x[i]-sr);
printf("\n %d %d",x[i],i);
}
fclose(fp);
wait();
return 0;
}

Последний раз редактировалось Stilet; 13.01.2011 в 17:40.
Saferon вне форума Ответить с цитированием
Старый 13.01.2011, 17:27   #6
Tahoma
DI HALT RET
Форумчанин
 
Аватар для Tahoma
 
Регистрация: 30.12.2010
Сообщений: 117
По умолчанию

А ты попробуй тогда создать массив int чисел от байтового размера файла. Таким образом пропадет второй цикл.
Использовать &x[i], где x какраз этот массив.
И fscanf при попытке считывания конца файла возвращает EOF, т.е. его можно использовать как while(fscanf...

p.s.: хотя твой метод более оптимизирован в плане потребления памяти
Tahoma вне форума Ответить с цитированием
Старый 13.01.2011, 18:00   #7
Saferon
Новичок
Джуниор
 
Регистрация: 13.01.2011
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Tahoma Посмотреть сообщение
p.s.: хотя твой метод более оптимизирован в плане потребления памяти
вот объяснить бы это моему преподу...
Saferon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
паскаль! текстовые данные. кусака Паскаль, Turbo Pascal, PascalABC.NET 3 10.06.2010 20:32
паскаль! текстовые данные. кусака Помощь студентам 1 10.06.2010 19:18
Строковые данные и текстовые файлы Solnyshek Паскаль, Turbo Pascal, PascalABC.NET 0 24.04.2010 12:11
текстовые данные в С++ Giffon Общие вопросы C/C++ 4 29.11.2009 22:39
Пожалуйста помогите решить задачи на Массивы, текстовые данные и оператор цикла alena-yalymova Паскаль, Turbo Pascal, PascalABC.NET 35 04.04.2008 16:23