Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поправить программу 
:(
    Опции темы
Lucchese
Дата 25.1.2010, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 25.1.2010

Репутация: нет
Всего: нет



Нужна еше помощь вот код программы что я уже сделал
Код

#define _CRT_SECURE_NO_DEPRECATE
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <fstream.h>
 
//Объявления структуры------------------------------------
struct DBase {
        char PIB[20]; //ФИО работника
        unsigned int salary; //зарплата 
        unsigned int experience; //стаж работы
};
 
void menu(void) {
        cout << "\n"
                "1. Dobavit.\n"
                "2. Prosmotr.\n"
                "3. Sortirovat.\n"
                "4. Nayti.\n"
                "5. Podnyat.\n"
                "9. Exit.\n\n";
                }
    //Начало програмы------------------------------------
int main() {
        // открытие файла на запись------------------------------------
        FILE *f;
        f = fopen( "database.txt", "ab+" );
        if( f == NULL ){
        return -1;
        }
        menu();
        char c;
        
while(true) {
        cout << "\rViberite rijim roboti: ";
        DBase t;
        c = getch();

switch (c) {
        case '1': // Добавление ----------------------------------
        cout << "\n\n Popolneniya 'file.dat'.\n"
                "Dlya vihoda v menu vvedite 0 Vmesto FIO rabotnika ili Zarplati.\n\n";
        fseek( f, 0, SEEK_END );
        // работа с файлом------------------------------------
while( true )  {
        cout << "FIO Rabotnika: ";
        cin >> t.PIB;
        if( t.PIB[0]=='0' ) break;
                
        cout << "Zarplata: ";
        cin >> t.salary;
        if( t.salary=='0' ) break;
                
        cout << "Staz Roboti: ";
        cin >> t.experience;
                
        fwrite( &t, sizeof(t), 1, f );
        cout << "Informacia dobavlena.\n\n";
}
        menu();
        break;
                
        case '2': // Просмотр ------------------------------------
        cout << "\n\nSoderzimoe bazi 'database.txt'\n\n";
        fseek( f, 0, SEEK_SET );                               
        setlocale( LC_ALL, "Rus" );                          
while( true ) {

        if( fread( &t, sizeof(DBase), 1, f ) !=1 ) break;
        cout << "\tFIO:" << t.PIB 
             << "\tZarplata:" << t.salary 
              << "\tStaz:" << t.experience 
              << "\n";
}                                    
        menu();                             
        break;
                                
        case '4': // ПОИСК ------------------------------------
        int s_salary;
        cout << "\nVvedite Zrplatu dlya poiska: ";
        cin >> s_salary; //Зарплата для поиска.
        fseek( f, 0, SEEK_SET );
while( true ) {

        if (feof(f)) break;
        fread( &t, sizeof(DBase), 1, f );

while ( t.salary == s_salary ) {

        if ( t.salary != s_salary ) break;

        if ( t.salary == s_salary ) {           
        cout << "\tFIO:" << t.PIB << "\tZarplata:" << t.salary << "\tStaz:" << t.experience << "\n";
        }
}
}
        menu();
        break;          
 
        case '5': //Поднятие зарплаты
        int otvet;
        cout << "\nVi uverini chto hotite podnyat zarplatu?\n";
        cout << "Da = 1 \ Net = 0 ";
        cin >> otvet;

        if( otvet=='0' ) break;         
        int u_zarplata;
        fseek( f, 0, SEEK_SET );
 
 while( true ) {
 
        if (feof(f)) break;
        fread( &t, sizeof(DBase), 1, f );

        if (t.experience>=10) {

while(true) {
        u_zarplata = (t.salary * 10)/100;
        fwrite( &t.salary, sizeof(u_zarplata), 1, f );
}
        }                     
}                        
        menu();
        break;  
        
        case '9': // Выход------------------------------------
        return 0;
}
        }
        }

Нужно подправить вот это, а то выводит по несколько раз одного и того же человека...
Код

                case '4': // ПОИСК ------------------------------------
                int s_salary;
                cout << "\nVvedite Zrplatu dlya poiska: ";
                cin >> s_salary; //Зарплата для поиска.
                fseek( f, 0, SEEK_SET );
 
while( true ){

                if (feof(f)) break;
                fread( &t, sizeof(DBase), 1, f );

while ( t.salary == s_salary ) {

                if ( t.salary != s_salary ) break;

                if ( t.salary == s_salary ) {           
                cout << "\tFIO:" << t.PIB << "\tZarplata:" << t.salary << "\tStaz:" << t.experience << "\n";
                }
}                                                                          
}
                menu();
                break;   

Вот еще не могу понять, мне нужно поднять зарплату на 10% всем работникам у кого стаж работы больше или равен 10 годам, как заменить те данные что в файле, на те что увеличены
Код

                case '5': //Поднятие зарплаты
                int otvet;
                cout << "\nVi uverini chto hotite podnyat zarplatu?\n";
                cout << "Da = 1 \ Net = 0 ";
                cin >> otvet;
 
                if( otvet=='0' ) break;         
                int u_zarplata;
                fseek( f, 0, SEEK_SET );
                
while( true ){

                if (feof(f)) break;
                fread( &t, sizeof(DBase), 1, f );

                if (t.experience>=10){                

while(true) {
                u_zarplata = (t.salary * 10)/100;
                fwrite( &t.salary, sizeof(u_zarplata), 1, f );
}
                }
}


И еще как сделать что бы можно было ФИО вводить через пробел а то у меня только одним словом можно вести .
И последний вопрос как сделать сортирование по увеличению зарплаты?

Заранее огромнейшее спасибо всем кто поможет!


Это сообщение отредактировал(а) Lucchese - 26.1.2010, 20:43
PM MAIL   Вверх
bsa
Дата 26.1.2010, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



PM   Вверх
Lucchese
Дата 26.1.2010, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 25.1.2010

Репутация: нет
Всего: нет



Поправил, может кто-то помочь в этой программе перевести все в функции...
PM MAIL   Вверх
bsa
Дата 26.1.2010, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Lucchese, интересно, ты вообще читал что там написано? Почему в твоем коде фигурные скобки находятся друг под другом? Очень сложно выделить, где у тебя начинается блок, а где заканчивается.
PM   Вверх
Lucchese
Дата 26.1.2010, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 25.1.2010

Репутация: нет
Всего: нет



Второй раз поправил сделал отступы, растравил скобки...

Ну может теперь кто-то мне поможет ?
PM MAIL   Вверх
bsa
Дата 27.1.2010, 00:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Lucchese, нифига ты не сделал. Код должен выглядеть так:
Код
#define _CRT_SECURE_NO_DEPRECATE
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <fstream.h>

//Объявления структуры------------------------------------
struct DBase {
  char PIB[20]; //ФИО работника
  unsigned int salary; //зарплата 
  unsigned int experience; //стаж работы
};

void menu(void) {
  cout << "\n"
  "1. Dobavit.\n"
  "2. Prosmotr.\n"
  "3. Sortirovat.\n"
  "4. Nayti.\n"
  "5. Podnyat.\n"
  "9. Exit.\n\n";
}
//Начало програмы------------------------------------
int main() {
  // открытие файла на запись------------------------------------
  FILE *f;
  f = fopen( "database.txt", "ab+" );
  if( f == NULL ){
    return -1;
  }
  menu();
  char c;
  
  while(true) {
    cout << "\rViberite rijim roboti: ";
    DBase t;
    c = getch();
    switch (c) {
      case '1': // Добавление ----------------------------------
        cout << "\n\n Popolneniya 'file.dat'.\n"
        "Dlya vihoda v menu vvedite 0 Vmesto FIO rabotnika ili Zarplati.\n\n";
        fseek( f, 0, SEEK_END );
        // работа с файлом------------------------------------
        while( true )  {
          cout << "FIO Rabotnika: ";
          cin >> t.PIB;
          if( t.PIB[0]=='0' ) break;
          
          cout << "Zarplata: ";
          cin >> t.salary;
          if( t.salary=='0' ) break;
          
          cout << "Staz Roboti: ";
          cin >> t.experience;
          
          fwrite( &t, sizeof(t), 1, f );
          cout << "Informacia dobavlena.\n\n";
        }
        menu();
        break;
        
      case '2': // Просмотр ------------------------------------
        cout << "\n\nSoderzimoe bazi 'database.txt'\n\n";
        fseek( f, 0, SEEK_SET );                               
        setlocale( LC_ALL, "Rus" );                          
        while( true ) {
          if( fread( &t, sizeof(DBase), 1, f ) !=1 ) break;
          cout << "\tFIO:" << t.PIB 
          << "\tZarplata:" << t.salary 
          << "\tStaz:" << t.experience 
          << "\n";
        }                                    
        menu();                             
        break;
        
      case '4': // ПОИСК ------------------------------------
        int s_salary;
        cout << "\nVvedite Zrplatu dlya poiska: ";
        cin >> s_salary; //Зарплата для поиска.
        fseek( f, 0, SEEK_SET );
        while( true ) {
          if (feof(f)) break;
          fread( &t, sizeof(DBase), 1, f );
          while ( t.salary == s_salary ) {
            if ( t.salary != s_salary ) break;
            if ( t.salary == s_salary ) {           
              cout << "\tFIO:" << t.PIB << "\tZarplata:" << t.salary << "\tStaz:" << t.experience << "\n";
            }
          }
        }
        menu();
        break;          
        
      case '5': //Поднятие зарплаты
        int otvet;
        cout << "\nVi uverini chto hotite podnyat zarplatu?\n";
        cout << "Da = 1 \ Net = 0 ";
        cin >> otvet;
        if( otvet=='0' ) break;         
        int u_zarplata;
        fseek( f, 0, SEEK_SET );
        
        while( true ) {
          
          if (feof(f)) break;
          fread( &t, sizeof(DBase), 1, f );
          if (t.experience>=10) {
            while(true) {
              u_zarplata = (t.salary * 10)/100;
              fwrite( &t.salary, sizeof(u_zarplata), 1, f );
            }
          }                     
        }                        
        menu();
        break;  
        
      case '9': // Выход------------------------------------
        return 0;
    }
  }
}
Вот теперь, думаю, тебе самому будет легче разобраться, где ошибка. Кстати, после case (вне операторных скобок) внутри switch не стоит объявлять переменные (строки 96 и 78).
Рекомендую действия, выполняемые внутри case выделить в отдельные функции - код будет более читабельным.

Это сообщение отредактировал(а) bsa - 27.1.2010, 00:22
PM   Вверх
Lucchese
Дата 28.1.2010, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 25.1.2010

Репутация: нет
Всего: нет



Помогите поправить код. Нужно чтобы у всех работников у которых стаж больше 10 лет , зарплату увеличить на 10 %.
Вот код:
Код

void UpZarplata(void)
{
                          int r;
                          int otvet;
                          DBase t;
                          FILE *f,*fd;
              fd=fopen("database.tmp","wb");
              f=fopen("database.txt","rb");
                          int i;
              i=1;
              while (fread(&t,sizeof(DBase),1,f) == 1)
              {
              fwrite(&t, sizeof(DBase),1,fd);
              }
                          cout << "Vi uvereni chto hotite podnyat zarplatu ?\n";
                          cout << "Da = 1 / Net = 0";
                          cin >> otvet;
                          if (otvet == 1)
                          {
                           while (fread(&t, sizeof(DBase), 1, f) == 1) 
                           {
                           if (t.experience > 10)
                           {
                           r = (t.salary * 10)/100;
                           t.salary = t.salary + r;
                           }
                           fwrite(&t, sizeof(DBase),1,fd);
              while (fread(&t,sizeof(DBase),1,f))
              {
              fwrite(&t, sizeof(DBase),1,fd);
              }
              fclose(fd);
              fclose(f);
              f=fopen("database.txt","wb");
              fd=fopen("database.tmp","rb");
              while (fread(&t,sizeof(DBase),1,fd))
              {
              fwrite(&t, sizeof(DBase),1,f);
              }
                          }
                          }
              fclose(fd);
              fclose(f);
}

PM MAIL   Вверх
bsa
Дата 28.1.2010, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Lucchese, ты видел, как я твой код отформатировал? Почему ты упорно заставляешь нас ломать глаза, в попытках определить границы блока? Не надо форматировать код, чтобы он с 10 метров выглядел в виде аккуратного симметричного пятна, нужно чтобы его было легко читать сидя у монитора. Когда его легко читать, то в нем легко и ошибки находить.
И вообще, твой код какой-то мутный, зачем три цикла и временный файл? Ты же не удаляешь записи из файла!

Код
#include <iostream>
#include <fstream>
#include <clocale>

struct DbEntry
{
  char PIB[20]; //ФИО работника
  unsigned int salary; //зарплата 
  unsigned int experience; //стаж работы
};

int main()
{
   std::setlocale(LC_ALL, ""); //чтобы русский работал
   std::fstream file("database.dat", std::fstream::in|std::fstream::out|std::fstream::binary);
   if (!file.is_open()) {
       std::wcerr << L"Не удалось открыть файл" << std::endl;
       return 1;
   }
   DbEntry buf;
   while( file.read(static_cast<char*>(static_cast<void*>(&buf)), sizeof(buf)) ) {
       if (buf.experience > 10) {
          buf.salary += buf.salary/10;
          file.seekp( file.tellg() - sizeof(buf), std::fstream::beg);
          file.write( static_cast<char*>(static_cast<void*>(&buf)), sizeof(buf) );
       }
   }
   return 0;
}


Это сообщение отредактировал(а) bsa - 28.1.2010, 21:15
PM   Вверх
Lucchese
Дата 28.1.2010, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 25.1.2010

Репутация: нет
Всего: нет



На Borland С++ Builder 6.0 Так будет ? Просто нет возможности проверить....
Код

void UpZarplata(void) {
DBase t;
FILE *f;
f = fopen("database.txt","ab+");

   while (fread(&t, sizeof(DBase), 1, f) == 1)
   {
       if (t.experience > 10) {
          t.salary += t.salary/10;
          fseek( f, 0, SEEK_SET );
          fwrite(&t, sizeof(DBase),1,f );
       }
   }
   fclose(f);
   cout << "Informacia izmenina!";
}


Это сообщение отредактировал(а) Lucchese - 28.1.2010, 22:22
PM MAIL   Вверх
bsa
Дата 28.1.2010, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Lucchese, будет точно так же. Ты программу пишешь на C++, зачем использовать средства Си?
PM   Вверх
Lucchese
Дата 28.1.2010, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 25.1.2010

Репутация: нет
Всего: нет



Огромнейшее спасибо, сяду переписывать программу , заменять Си на С++
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1977 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.