Разработка программы с использованием структурированных операторов while, do-while, for и командной строки, страница 2

              return 30;

               }

              // Открываем файл для записи

              if( ( f_out = fopen( argv [ 2 ], "w" ) ) == NULL )

              {

                            printf( "\n Ошибка 40. Файл %s для записи не открыт \n", argv [ 2 ] );

               return 40;

              }

              // Печатаем заголовок и аргументы функции

              fprintf( f_out,

"\n                                      Тереханов В. В., каф. ФПС, гр. 1/1                                                                     "

"\n            Санкт-Петербургский государственный политехнический университет                                  "

"\n                                      (семестр 1, программный проект 2)                                                                  \n"

"\n                                                                n                                                                                                                  "

"\n                                                    y := Сумма { ((-1)^(a+1)) /a }                                                                "

"\n                                                              a=1                                                                                                \n"

"\n                                      Аргументы суммы ряда: n = %u\n", n );                                                            

              // Закрываем файл для записи

              if( fclose ( f_out) == EOF )

              {

                            printf( "\n Ошибка 50. Файла %s не закрыт \n", argv [ 2 ] );

                            return 50;

              }

              // Вычисляем значение суммы ряда

              y = 0.0;

              double signum = 1.0;

              for( a = 1; a <= n; a++ )

              {

                            y += signum / a;

                            signum =-signum;

              }           

// Открываем файл для дозаписи

              if( ( f_out = fopen( argv [ 2 ], "a" ) ) == NULL )

              {

                            printf( "\n Ошибка 60. Файла %s для дозаписи не открыт \n", argv [ 2 ] );

                            return 60;

              }           

Листинг 2.1. Окончание.

// Печатаем значение функции

              fprintf( f_out, "\n                             Значение суммы ряда: y = %lg", y );

              // Закрываем файл для записи

              if( fclose( f_out ) == EOF )

               {

                            printf( "\n Ошибка 70. Файла %s не закрыт \n", argv [ 2 ] );                            

                            return 70;

              }

               return 0;

}

3. Программа и методика испытаний

Контрольный пример №1

Цель примера:

Продемонстрировать ошибку, возникающую при введении неправильного количества аргументов.

Действия:

Вводим в командную строку (Проект -> Properties) лишний аргумент файл *.exe в среде программирования задан по умолчанию):

Листинг 3.1.

Project2.dat Project2.out 

Результат:

Ошибка 05. Непредусмотренный формат командной строки. Для запуска программы используйте командную строку вида: Исполняемый_файл Файл_ввода Файл_вывода.

Контрольный пример №2

Цель примера:

Продемонстрировать ошибку, возникающую при неправильном указании файла с данными.

Действия:

Вводим в командную строку несуществующее имя файла с данными

Листинг 3.2.

Project2.dat Project2.out 

Результат:

Ошибка 10. Файл данных Project2.dat для чтения не открыт.

Контрольный пример №3

Цель примера:

Продемонстрировать ошибку, возникающую при неверном содержании файла данных.

Действия:

Файл данных содержит буквы вместо цифр

Листинг 3.3.

abc

Результат:

Ошибка 20. Ошибка чтения из файла данных Project.out.

Контрольный пример №4

Цель примера:

Продемонстрировать ошибку, возникающую при невозможности закрыть файл.

Действия:

Файл данных пропал – был удален или произошли сбои в сети.

Файл данных уже закрыт, а программа пытается его закрыть снова.

Листинг 3.4.

// Закрываем файл для чтения

    if( fclose(f_in ) == EOF )

    {

        printf( "\n Ошибка 30. Файл данных %s не закрыт.\n", argv[ 1 ] );

        return 30;

    }

// Снова закрываем файл для чтения…

    if( fclose(f_in ) == EOF )

    {

        printf( "\n Ошибка 30. Файл данных %s не закрыт.\n", argv[ 1 ] );

        return 30;

    }

Результат:

Ошибка 30. Файл данных Project2.dat не закрыт.

Контрольный пример №5

Цель примера:

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

Действия:

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

Листинг 3.5.

Project2.dat E:\task02.out

Результат:

Ошибка 40. Файл результатов E:\Project2.out для записи не открыт

Контрольный пример №6

Цель примера:

Продемонстрировать правильную работу программного проекта.

Действия:

Файл данных приведен на листинге 3.6.

Листинг 3.6.

3

Результат:

Файл результатов приведен на листинге 3.7.

Листинг 3.7.

                Тереханов В. В., каф. ФПС, гр. 1/1                       

        Санкт-Петербургский государственный политехнический университет      

                        (семестр 1, программный проект 2)                    

                         n                                      

                        y := Сумма { ((-1)^(a+1))/a }                        

                              a=1                                                        

                        Аргументы суммы ряда: n = 3

                      Значение суммы ряда: y = 0.833333

Анализ результата:

y = 1 слагаемое + 2 слагаемое + 3 слагаемое

1 слагаемое = ( (-1) ^(1+1) ) /1 = 1

2 слагаемое = ( (-1) ^(2+1) ) /2 = -0.5

3 слагаемое = ( (-1) ^(3+1) ) /2 = 0.333333

y = 1 - 0.5 + 0.333333 = 0.833333