IPB

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V  1 2 >  
Ответить в эту темуОткрыть новую тему
> С++
InFuz
сообщение 3.5.2010, 17:30
Сообщение #1


Студент
**

Группа: Продвинутые
Сообщений: 116
Регистрация: 13.10.2009
Город: Ульяновск
Учебное заведение: УлГУ
Вы: студент



Создать двоичный файл и записать в него 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 записать, хотя до этого работало в предыдушей проге (IMG:style_emoticons/default/mellow.gif)
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Vahappaday
сообщение 4.5.2010, 19:26
Сообщение #2


Аспирант
***

Группа: Продвинутые
Сообщений: 334
Регистрация: 26.4.2009
Город: Липецк
Учебное заведение: ЛГТУ
Вы: студент



Вот есть две строчки:

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

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

Несостыковочка, хотя. как мне кажется, студия бы обработала сие нормально, хотя в файле были бы ужасы))
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
InFuz
сообщение 5.5.2010, 12:36
Сообщение #3


Студент
**

Группа: Продвинутые
Сообщений: 116
Регистрация: 13.10.2009
Город: Ульяновск
Учебное заведение: УлГУ
Вы: студент



гы ))
действительно стоило заменить f на i и все заработало )))) (IMG:style_emoticons/default/thumbsup.gif)
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
InFuz
сообщение 6.5.2010, 10:46
Сообщение #4


Студент
**

Группа: Продвинутые
Сообщений: 116
Регистрация: 13.10.2009
Город: Ульяновск
Учебное заведение: УлГУ
Вы: студент



Лаба №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
сообщение 6.5.2010, 12:01
Сообщение #5


Аспирант
***

Группа: Продвинутые
Сообщений: 334
Регистрация: 26.4.2009
Город: Липецк
Учебное заведение: ЛГТУ
Вы: студент



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

В main останется разбить на строки, а затем пробежаться по массиву строк и вывести только те, которые палиндромами не являются.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
InFuz
сообщение 6.5.2010, 12:51
Сообщение #6


Студент
**

Группа: Продвинутые
Сообщений: 116
Регистрация: 13.10.2009
Город: Ульяновск
Учебное заведение: УлГУ
Вы: студент



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

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

Код
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
сообщение 6.5.2010, 13:23
Сообщение #7


Аспирант
***

Группа: Продвинутые
Сообщений: 334
Регистрация: 26.4.2009
Город: Липецк
Учебное заведение: ЛГТУ
Вы: студент



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

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


Путанно получилось, ну уж не обессудьте...((
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
InFuz
сообщение 6.5.2010, 14:39
Сообщение #8


Студент
**

Группа: Продвинутые
Сообщений: 116
Регистрация: 13.10.2009
Город: Ульяновск
Учебное заведение: УлГУ
Вы: студент



вроде понятно, более менее (время покажет).

функция то вроде правильная, но ругается как раз на lvalue required в сторочке с if.
и как должна функция разбиения на строки выглядеть?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Vahappaday
сообщение 6.5.2010, 18:25
Сообщение #9


Аспирант
***

Группа: Продвинутые
Сообщений: 334
Регистрация: 26.4.2009
Город: Липецк
Учебное заведение: ЛГТУ
Вы: студент



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
сообщение 6.5.2010, 19:08
Сообщение #10


Студент
**

Группа: Продвинутые
Сообщений: 116
Регистрация: 13.10.2009
Город: Ульяновск
Учебное заведение: УлГУ
Вы: студент



== , все время забываю про него, зараза такая (IMG:style_emoticons/default/smile.gif)
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
InFuz
сообщение 13.5.2010, 13:43
Сообщение #11


Студент
**

Группа: Продвинутые
Сообщений: 116
Регистрация: 13.10.2009
Город: Ульяновск
Учебное заведение: УлГУ
Вы: студент



Так, терь насчет разбиения на строки, я так понял идея такая, когда мы доходим до конца строки то создается еще одна строка char s2 так сказать и так до тех пор пока вместо \0 она не встретит . ?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Vahappaday
сообщение 13.5.2010, 15:49
Сообщение #12


Аспирант
***

Группа: Продвинутые
Сообщений: 334
Регистрация: 26.4.2009
Город: Липецк
Учебное заведение: ЛГТУ
Вы: студент



тут вариантов куча....
Смотря, как решать основную задачу...

Под
Цитата

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

Или заданы строки с номерами, а из них надо все палиндромы удалить?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
InFuz
сообщение 13.5.2010, 16:02
Сообщение #13


Студент
**

Группа: Продвинутые
Сообщений: 116
Регистрация: 13.10.2009
Город: Ульяновск
Учебное заведение: УлГУ
Вы: студент



не, вроде так,
вводишь несколько строк затем указываешь в каких из них нужно удалить числа палиндромы
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Vahappaday
сообщение 13.5.2010, 16:42
Сообщение #14


Аспирант
***

Группа: Продвинутые
Сообщений: 334
Регистрация: 26.4.2009
Город: Липецк
Учебное заведение: ЛГТУ
Вы: студент



ну, тогда край построчно читать

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

Посмотри gets/wgets
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
InFuz
сообщение 13.5.2010, 17:13
Сообщение #15


Студент
**

Группа: Продвинутые
Сообщений: 116
Регистрация: 13.10.2009
Город: Ульяновск
Учебное заведение: УлГУ
Вы: студент



эээ... куда... какой край... я еще не разобрался с разбиением на строки (IMG:style_emoticons/default/smile.gif)
как оформить его?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Vahappaday
сообщение 14.5.2010, 5:02
Сообщение #16


Аспирант
***

Группа: Продвинутые
Сообщений: 334
Регистрация: 26.4.2009
Город: Липецк
Учебное заведение: ЛГТУ
Вы: студент



))) я имел в виду, что без разбиения на строки не обойтись
край=обязательно, без этого никак))

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

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

PS. Помог бы паскалянтам в соседних темах))
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
InFuz
сообщение 14.5.2010, 12:36
Сообщение #17


Студент
**

Группа: Продвинутые
Сообщений: 116
Регистрация: 13.10.2009
Город: Ульяновск
Учебное заведение: УлГУ
Вы: студент



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

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

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


P.S. там граф уже помогает (IMG:style_emoticons/default/smile.gif)
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
InFuz
сообщение 14.5.2010, 12:50
Сообщение #18


Студент
**

Группа: Продвинутые
Сообщений: 116
Регистрация: 13.10.2009
Город: Ульяновск
Учебное заведение: УлГУ
Вы: студент



еще вопросик не потеме
в проге которую я вначале показывал, что вот тут делается


Код
    if(s[i]>='0'&&s[i]<='9')
    {
      a*=10;           // тута
      a+=s[i]-'0';    // и тута
    }
    else if(prost(a))
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Vahappaday
сообщение 14.5.2010, 19:51
Сообщение #19


Аспирант
***

Группа: Продвинутые
Сообщений: 334
Регистрация: 26.4.2009
Город: Липецк
Учебное заведение: ЛГТУ
Вы: студент



Сильно будет смущать, если ограничена максимальная длина строки?
Если не смущает, то делаем буфер и в него построчно читаем. Про функцию 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
сообщение 14.5.2010, 20:17
Сообщение #20


Студент
**

Группа: Продвинутые
Сообщений: 116
Регистрация: 13.10.2009
Город: Ульяновск
Учебное заведение: УлГУ
Вы: студент



stdin это должен файл с данными быть?
что то я уже перестал что либо понимать (IMG:style_emoticons/default/sad.gif)
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

2 страниц V  1 2 >
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия Сейчас: 18.4.2024, 15:56

Книжки в помощь: "Сборник заданий по высшей математике" Кузнецов Л.А., "Сборник заданий по высшей математике" Чудесенко В.Ф., "Индивидуальные задания по высшей математике" Рябушко А.П., и другие.




Зеркало сайта Решебник.Ру - reshebnik.org.ru