Name : c_file_row_count.c
Author : UranFlex
Version : 0.1 alpha
Copyright : GNU GPL
Description : В файле input.txt записана информация из нескольких текстовых строк. Выводим содержимое этого файла на экран, посчитаем количество строк в файле.
#include <stdio.h>
#include <stdlib.h>
#define FNAME "input.txt" // имя исходного файла
int main( void ) {
// пробуем открыть файл для чтения
FILE* in = fopen( FNAME, "r" );
// обрабатываем ошибку открытия файла
if ( in == NULL ) {
perror( "Ошибка при открытии исходного файла" );
return EXIT_FAILURE;
}
size_t counter = 0; // предполагаем, что строк ноль в файле - т.е. пустой
int ch, pre = EOF; // текущий символ, последний считаный символ
printf( "%s %s\n", "Содержимое файла", FNAME );
// в цикле считаем сколько переводов строки в файле и запоминаем это в переменную counter
// а также выводим на экран каждый считаный символ.
// если файл пустой, то тело цикла не выполнится ни разу, так как первый считанный символ будет как раз EOF
// и в pre останется EOF
while ( ( ch = fgetc( in ) ) != EOF ) { // в цикле проходим весь файл посимвольно
pre = ch; // запоминаем последний считаный символ
if ( ch == '\n' ) // если нашли перевод строки,
++counter; // то увеличиваем счетчик строк
putchar( ch ); // выводим очередной символ на экран
}
// весь смысл переменной pre в том, чтобы запомнить какой символ мы считали перед тем как наткнулись на EOF в файле
// или в pre будет EOF - если тело цикла ни разу не выполнилось, это будет при пустом файле
// последняя строка файла может заканчиваться не \n, а строку посчитать надо - вот для этого и нужна переменная pre.
if ( pre == EOF ) // если файл пустой
puts( "Файл пустой!" ); // информация об этом.
else if ( pre != '\n' ) { // pre содержит в себе не перевод строки, и файл не пустой.
++counter; // увеличиваем
puts( "" );
}
puts( "" );
// выводим на экран информацию о количестве строк
printf( "%s %s %d", "строк в файле", FNAME, counter );
return EXIT_SUCCESS;
Объяснение:
Сейчас решаем такую же задачу, только на олимпиаде, вроде так.
program n1;
uses crt;
var aw:array[1..10] of integer;
i,w,g:integer;
begin
g:=0;
w:=10;
for i:=0+1 to w do begin
aw[i]:=random(100);
write(aw[i]:6);
end;
writeln();
write('Чот');
for i:=0+1 to w do begin
if aw[i] mod 2 = 0 then g:=g+1; end; write('Всего чотных чисел ',g);
writeln();
write('Не чот');
g:=0;
for i:=0+1 to w do begin
if aw[i] mod 2 > 0 then g:=g+1;end; write('Всего не чотных чисел ',g) ;
end.
uses crt;
const
n=10;
var
mas:array[1..n] of integer;
i,c,b:integer;
begin
randomize;
c:=0;
b:=0;
for i:=1 to n do
mas[i]:=random(101)+1;
for i:=1 to n do
write(mas[i],' ');
for i:=1 to n do
begin
if mas[i] mod 2=0 then
inc(c);
end;
writeln('c=',c);
for i:=1 to n do
begin
if mas[i] mod 2<>0 then
inc(b);
end;
writeln('b=',b);
end.
const n = 10;
type Mstring = array [1..n] of string;
var m:Mstring;
procedure InputM(var arg:Mstring);
var i:byte;
begin
for i:=1 to n do
begin
writeln('enter string number ',i);
readln(arg[i]);
end;
end;
procedure OutputM(const arg:Mstring);
var i:byte;
begin
for i:=1 to n do
begin
writeln(arg[i]);
end;
end;
function repl(const arg:string):string;
var i:byte;
res:string;
begin
res:=arg;
for i:=1 to length(res) do
begin
if res[i] = '!' then res[i]:='.';
end;
repl:=res;
end;
procedure MasRepl(var arg:Mstring);
var i:byte;
begin
for i:=1 to n do
begin
arg[i]:= repl(arg[i]);
end;
end;
begin
InputM(m);
MasRepl(m);
OutputM(m);
readln;
end.
Буква в стандарте ASCII (компьютерный стандарт) весит один байт, 8 бит.
значит в слове программа 9 букв == 9 * 8 = 72 бит или 9 байтов