Помощь - Поиск - Пользователи - Календарь
Полная версия: С++ > Информатика / Программирование
Образовательный студенческий форум > Другие дисциплины > Информатика / Программирование
InFuz
Создать двоичный файл и записать в него n целых чисел. Сформировать массив из элементов исходного файла, внеся в него числа, расположенные в файле до мин. эл. и после макс..

Код
# include <iostream.h>
# include <stdio.h>
# include <conio.h>

//-----------------------------------------------------------------
    void main()
    {
      clrscr();
      FILE *f;
      int i,n;
      int a;
      f=fopen("input.dat","wb");
      cout<<"n="; cin>>n;
      fwrite(&n, sizeof(int),1,f);
      for(i=0; i<n; i++)
      {
    cout<<"a["<<i<<"]="; cin>>a;
    fwrite(&a, sizeof(int),1,f);
      }
      fclose(f);
    }


Код
# include <iostream.h>
# include <stdio.h>
# include <math.h>
# include <conio.h>
# include <alloc.h>

//-----------------------------------------------------------------
    void main()
    {
      clrscr();
      FILE *f,*g;
      int i,n,imin=0,imax=0,s=0;
      int *a,*b;
      f=fopen("input.dat","rb");
      fread(&n,sizeof(int),1,f);
      a=new int[n];
      fread(a,sizeof(int),n,f);
      for(i=0; i<n; i++)
      {
    if(a[imax]<a[i]) imax=i;
    if(a[imin]>a[i]) imin=i;
      }
      for(i=0; i<imin; i++)
       s++;
      for(i=imax+1; i<n; i++)
       s++;        
      b=new int[s]; int t=0;
      for(i=0; i<imin; i++)
      {
    b[t]=a[i];
    t++;    
      }
      for(i=imax+1; i<n; i++)
      {
    b[t]=a[i];
    t++;
      }
      for(i=0; i<t; i++)
    {
      cout<<"\n b["<<i<<"]="<<b[i];
      cout<<endl;
    }
      g=fopen("result.txt","wt");
       for(i=0; i<t; i++)
      {
      fprintf(g,"%f ",b[i]);
      }
      fclose(g);  
      fclose(f);
      delete[]a;
      delete[]b;  
      getch();
    }


нашел, ругается на что-то когда пытаешься результат во txt записать, хотя до этого работало в предыдушей проге mellow.gif
Vahappaday
Вот есть две строчки:

int *a,*b; - тут b -указатель на массив целых чисел

fprintf(g,"%f ",b[i]); - а тут его элемент выводится как float

Несостыковочка, хотя. как мне кажется, студия бы обработала сие нормально, хотя в файле были бы ужасы))
InFuz
гы ))
действительно стоило заменить f на i и все заработало )))) thumbsup.gif
InFuz
Лаба №7

Удалить в строках с заданными номерами числа-палиндромы.


Вот есть прога для определения, простое число или нет.

Код
#include <conio.h>
#include <iostream.h>
#include <stdio.h>
#define maxline 80

//---------------------------------------------------

void getchars(char a[])
{
  char c;
  for(int i=0; i<maxline && (c=getchar())!='\n';i++)
  *(a+i)=c;
  *(a+i)='\0';
}

//---------------------------------------------------

int prost(int a)
{
  if(a<=0)return 0;
  int b=2;
  while(b<=a/2)
  {
    if(a%b==0)return 0;
    b++;
  }
return 1;
}

//---------------------------------------------------

int main()
{
  clrscr();
  char s[maxline];
  int a=0,i=0;
  cout<<"Enter String -> ";
  getchars(s);
  while(s[i]!='\0')
  {
    if(s[i]>='0'&&s[i]<='9')
    {
      a*=10;
      a+=s[i]-'0';
    }
    else if(prost(a))
    {
      cout<<"Yes - "<<a;
      getch();
      return 1;
    }
    else
    a=0;
    i++;
  }
cout<<"no";
getch();
return 0;
}


Помогите переделать под мой вариант.
Vahappaday
По-моему, лучше с нуля написать...
Сделать ввод с клавиатуры отдельной функцией как тут. Но добавить сразу проверку ввода (нельзя вводить ничего кроме чисел, пробела и переноса строки), и сделать динамическое выделение памяти (чтобы макс. длина строки не была ограничена) - второе, в принципе, не обязательно.
Сделать функцию разбиения на подстроки, разделенные пробелами - на вход поступает char*, на выходе char** и количество строчек в массиве.
И, наконец, функцию проверки, является ли строка палиндромом.

В main останется разбить на строки, а затем пробежаться по массиву строк и вывести только те, которые палиндромами не являются.
InFuz
я ни фига не разбираюсь в строках, так что будем все по порядку делать

функция так получиться?

Код
void getchars(char a[])
{
  char c;
  for(int i=0; i<maxline && (c=getchar())!='\n';i++)
  {
    if(a[i]>='0'&&a[i]<='9'||a[i]=' '||a[i]='\n')
    *(a+i)=c;
  }
  *(a+i)='\0';
}


что такое *(a+i)=c; и *(a+i)='\0'; ?
Vahappaday
Во)) Вот тут паскаль отличается от С. Я не дюже силён в паскале, но знаю, что там в начале строки-массива хранится количество символов в строке. В С такого нет, здесь строка - массив символов, ограниченный символом с кодом 0 ('\0').
а - указатель на начало массива, +i - это мы прибавляем к указателю (адресу) смещение равное i его элементам. В нашем случае мы работаем с char, его размер в большинстве случаев = 1 байту, значит, указатель увеличивается на i байт.
*(a+i) - это разыменовывание (кажется, так называется).
*x - получение значения по адресу x. Если бы мы написали a+i=x это было бы, во-первых, неверно, потому что сумма не является lvalue (ей нельзя присвоить значение). Но и в случае, если у нас там был бы просто указатель операция была по смыслу неверной, так как мы должны изменять не адрес, а значение по этому адресу.

Соответственно
*(a+i)=с; - записываем в текущую позицию считанный символ.
*(a+i)='\0'; - записываем в текущую позицию 0, показываем, что строчка завершена.


Путанно получилось, ну уж не обессудьте...((
InFuz
вроде понятно, более менее (время покажет).

функция то вроде правильная, но ругается как раз на lvalue required в сторочке с if.
и как должна функция разбиения на строки выглядеть?
Vahappaday
a[i]=' '||a[i]='\n'
Вместо = нужно == поставить, но проблема не в этом, проблема похоже в *(a+i).

Нашёл ещё пару косяков, например, если ввести строчку длиной ровно в maxlenth, будет ошибка, есть и другие, но мне легче было переписать.

Код
void getchars(char a[])
{
  char c;
  for(int i=0; i<maxline-1 && (c=getchar())!='\n';i++)
  {
    if(((c>='0')&&(c<='9')) || (a[i]==' ')) a[i]=c;
    else break;
  }
  a[i]='\0';
}

Так, он будет прерывать ввод, когда встретит любой символ, отличный от цифры или пробела, ещё в моём варианте не будет выхода за границы массива.
InFuz
== , все время забываю про него, зараза такая smile.gif
InFuz
Так, терь насчет разбиения на строки, я так понял идея такая, когда мы доходим до конца строки то создается еще одна строка char s2 так сказать и так до тех пор пока вместо \0 она не встретит . ?
Vahappaday
тут вариантов куча....
Смотря, как решать основную задачу...

Под
Цитата

Удалить в строках с заданными номерами числа-палиндромы.
что вообще понимается? Как вводятся строки?
Если я правильно понял, то прога будет выполнять команду.
"В строках 1, 3 и 5 удали числа палиндромы". И текст на вход подаётся, так что ли?

Или заданы строки с номерами, а из них надо все палиндромы удалить?
InFuz
не, вроде так,
вводишь несколько строк затем указываешь в каких из них нужно удалить числа палиндромы
Vahappaday
ну, тогда край построчно читать

Если строка из тех,что надо обрабатывать, в функцию её передаём, а возвращённую выводим на печать.
Если не из тех - просто на печать

Посмотри gets/wgets
InFuz
эээ... куда... какой край... я еще не разобрался с разбиением на строки smile.gif
как оформить его?
Vahappaday
))) я имел в виду, что без разбиения на строки не обойтись
край=обязательно, без этого никак))

надо читать построчно
обрабатывать строку, если нужно
и выводить её на печать

читать построчно можно функцией gets (MS советуют fgets как более безопасную), но при этом нужно задавать максимальную длину строки.

PS. Помог бы паскалянтам в соседних темах))
InFuz
забыл еще написать, весь наш ввод оканчивается точкой(в последней строке, в самом конце обязательно ставиться точка (индикатор конца ввода)).

так что на счет разбиения на стороки? там что-то типа такого должно быть

if a[i]=='\n' //создаем char c2(не знаю как записать)
else (значит место \n попалась точка) return 0;


P.S. там граф уже помогает smile.gif
InFuz
еще вопросик не потеме
в проге которую я вначале показывал, что вот тут делается


Код
    if(s[i]>='0'&&s[i]<='9')
    {
      a*=10;           // тута
      a+=s[i]-'0';    // и тута
    }
    else if(prost(a))
Vahappaday
Сильно будет смущать, если ограничена максимальная длина строки?
Если не смущает, то делаем буфер и в него построчно читаем. Про функцию fgets чего не почитал?)
Код
const int maxlen=100;
char buffer[maxlen];
int i, count=0;
while(fgets(buffer, maxlen, stdin))
{
  count++;
  for(i=0;i<n;i++)
  {
    if(arr[i]==count)
    {
        process(buffer);
        break;
    }
  }
  printf(buffer);
  if(buffer[strlen(buffer)-1]=='.') break;
}

Я бы как-то так написал...

return 0 не надо спешить делать...
пользователю-то надо показать, как программа отработала?

Насчёт кусочка кода - в нём конвертируется строчка в число) В этом варианте такого делать не надо)
InFuz
stdin это должен файл с данными быть?
что то я уже перестал что либо понимать sad.gif
Vahappaday
эм... нет. stdin - это структура FILE* соответствующая стандартному потоку ввода. В нашем случае - консоли.
InFuz
Вопросы:
for(i=0;i<n;i++) - n имеется ввиду '\0' или может maxlen или что?
массив arr[i] - это наш массив с первой строчкой, который у меня выше был как s[maxline]?
process(buffer) - это функция определения является ли число палиндромом?
strlen - это кто? smile.gif
Vahappaday
strlen - функция, принимает на вход строку, завершающуюся нулём, возвращает длину строки.

Цитата
process(buffer) - это функция определения является ли число палиндромом?
- да, я подразумевал именно это, но эту функцию надо в отличие от предыдущей написать самому.

arr[i] - массив с номерами строк, которые надо обрабатывать
соответственно n - количество элементов в нём.

Прога недописана, она не скомпилится.

Надо дописать process, надо сделать ввод массива arr.
InFuz
Цитата(Vahappaday @ 27.5.2010, 16:45) *

- да, я подразумевал именно это, но эту функцию надо в отличие от предыдущей написать самому.

ну ясен пень, кто же будет создавать библиотечное нахождении палиндрома, а там в буфер будет передавать числа по очереди или вся строчка сразу?
Vahappaday
вся строчка сразу, ограничено либо \0, либо \n
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.