DeadVillage
Advanced Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Договорившись, что файл входных данных имеет вид типа: <длина первого слагаемого> <первое слагаемое> <длина второго слагаемого> <второе слагаемое> и считая, что слагаемые могут быть разной длины, я настрадал следующее: Код: program prim4 integer len1,len2,length, StringLength character*301 str1, str2, answer ! открываем файл и читаем данные open(unit=10, file='input.txt', err=1) read(unit=10, fmt=*, end=2, err=2) len1, str1, len2, str2 close(unit=10, status='keep') ! на случай, если указанные в файле длины слагаемые оказались, намеренно или случайно, разными if(len1.ne.len2) then len1 = StringLength(str1) len2 = StringLength(str2) end if length = max(len1,len2) + 1 ! вызываем подпрограмму суммирования call Plus(length, str1, str2, answer) ! вывод ответа в файл open(unit=20, file='output.txt', err=4) do i=1,length write(unit=20, fmt='(A,$)', err=5) answer(i:i) end do close(unit=20, status='keep'); stop 'Done!' ! печать разных сообщений на случай, если что-то при работе с файлом пошло не так ! с последующей остановкой программы 1 write(unit=*,fmt='(A)') 'Cannot open input file'; stop 2 write(unit=*,fmt='(A)') 'Not enough data in input file'; stop 3 write(unit=*,fmt='(A)') 'Cannot read from input file'; stop 4 write(unit=*,fmt='(A)') 'Cannot open output file'; stop 5 write(unit=*,fmt='(A)') 'Cannot write in output file'; stop end subroutine Plus(length, str1, str2, answer) integer length,i , k, shift integer num1(length), num2(length), num3(length) character str1, str2, answer ! раскидываем символьные переменные по числовым массивам num1(1)=0 num2(1)=0 do i=length,2,-1 k = i-1 num1(i) = ichar(str1(k:k))-48 num2(i) = ichar(str2(k:k))-48 end do ! выполняем суммирование shift = 0 do i = length,1,-1 num3(i) = num1(i) + num2(i) + shift if(num3(i).ge.10) then num3(i) = mod(num3(i),10) shift = 1 else shift = 0 end if end do ! переносим значения численного массива в символьную переменную do i=1,length answer(i:i) = char(num3(i)+48) end do end ! возвращает длину символьной переменной до первого пробела integer function StringLength(string) character*(*) string integer i StringLength = 0 do i=1,250 if(string(i:i).eq.' ') exit StringLength = StringLength + 1 end do end |
|