Примеры и решения зачётных задач по Си
Три примера, в каждом листинге сначала идёт условие, а затем программа, компилировалось в Borland C++ 3.1
/* В произвольном файле найти ASCII-код наиболее часто встречаемого символа. Учесть, что таких символов может быть более одного */ #include <stdio.h> #include <stdlib.h> #include <string.h> void main() { FILE *fp=fopen ("z1.cpp","r+b"); if (fp==NULL) { printf ("\nНе могу открыть файл!"); exit (1); } unsigned char c; unsigned long ascii[256]; memset (ascii,0,256*sizeof(unsigned long)); while (1) { fread (&c,1,1,fp); if (feof(fp)) break; ascii[c]++; } unsigned long max=0; for (int i=0; i<256; i++) if (ascii[i]>max) max=ascii[i]; printf ("\n N=%ld, symbol(s): ",max); for (i=0; i<256; i++) if (ascii[i]==max) printf ("%d(%c) ",i,i); getchar(); }
/* В строке s, заданной указателем, подсчитать количество вхождений строки t, также заданной указателем. Задачу решить с помощью функции. */ #include <stdio.h> int strnchr (unsigned char *s, unsigned char *t) { int n=0; unsigned char *t0=t; while (*s) { while (*s!=*t) { s++; if (*s=='\0') return n; } while (*s==*t) { s++; t++; if (*t=='\0') { n++; if (*s=='\0') return n; } } t=t0; } return n; } void main() { unsigned char *s="abacbccabbbaacabc"; unsigned char *t="abc"; puts (s); puts (t); printf ("%d times",strnchr(s,t)); getchar(); }
/* Выделить память динамически для хранения произвольного файла, имя файла задается пользователем. В случае, если память выделить невозможно, вывести соответствующее сообщение */ #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> #include <alloc.h> void main() { FILE *fp; unsigned char name[128]; printf ("\nEnter file name: "); fgets (name,128,stdin); name[strlen(name)-1]='\0'; fp=fopen(name,"r+b"); if (fp==NULL) { printf ("\Can't open file %s",name); exit (1); } fpos_t len; fseek (fp,0,SEEK_END); fgetpos (fp,&len); unsigned char far *fdata=(unsigned char far *)farmalloc(len); if (fdata==NULL) { printf ("\Can't allocate %ld bytes",len); exit (2); } unsigned char c; unsigned long k=-1; fseek (fp,0,SEEK_SET); while (1) { fread (&c,1,1,fp); fdata[++k]=c; if (feof(fp)) break; } for (unsigned long i=0; i<k; i++) putch(fdata[i]); getchar(); }
24.12.2010, 13:37 [10621 просмотр]