C言語で簡易テキストコンパイラを実現する
データ構造課程設計の簡易テキストコンパイラ(C言語実現)
需要分析
(1)グラフィックメニュー画面を持っています。リアルタイムの年、日付、曜日、時間を表示します。
(2)
検索:テキスト中の文字列を検索し、その出現した行数、列数、合計出現回数を表示します。
置換(等長、不等長):テキスト中のテキストを等長および不等長に置き換えることができます。
挿入(列の挿入、テキストブロックの挿入):行または行番号を特定の行に挿入します。
ブロック移動(行ブロック、列ブロック移動):1行下に移動し、1行上に移動します。
具体的な行番号は左に移動しますか?右に移動します。
削除:行を削除し、列を削除し、長い内容を指定します。
(3)正確にディスクを保存し、ディスクを取ることができます。読み取り、テキスト保存;
(4)行の合計数を正しく表示します。(行数は5行以下で、行数は80文字以下です。
使用するデータ構造
1:採用する論理構造
テキストエディタは主にテキストを編集します。テキストの操作は文字の操作です。テキストエディタは、行、
列の2方向を編集します。
各ラインは線形テーブルとして見られ、線形テーブルは線形構造であり、線形構造の特徴はデータ要素間の直線性である。
関係は、要素によって「次から次へと並べる」というものです。線形テーブルでは、データ要素の種類は同じです。各行のために
記憶できる最大文字数は同じで、行方向のすべての直線表の最大長は同じに設定できます。行と行の間
の関係も線形表として見られます。
2.採用した記憶構造
リニアテーブルの記憶は、順序記憶とチェーン記憶の2種類に分けられます。
順序記憶とは、メモリ中に住所で連続したブロックの記憶空間を指し、線形テーブルの各要素を順次記憶するもので、このような記憶形式を用いる。
記憶されているリニアテーブルをシーケンステーブルと呼びます。プログラム設計言語において、1次元配列がメモリに占める記憶空間は連続的なものです。
の記憶領域は、1次元配列でシーケンステーブルを表すデータ記憶領域が最適である。
チェーン記憶は、-グループの任意の記憶手段によって、線形テーブル内のデータ要素を記憶するもので、データ要素系間の線形を確立するものである。
各データ要素に対する関係は、データ要素自身の情報を保存する以外に、その後継または前駆の所在地を一緒に保存する必要がある。
この2つの部分の情報は、それぞれの要素が同じである「結点」を構成する。データ要素の情報を保存することを「データ要素」といいます。
データ領域では、前駆者または後継者のアドレスを格納することをポインタドメインと呼びます。一つの記憶ユニットのアドレスだけがシングルチェーンテーブルで、二つの記憶があります。
ユニットのアドレスはダブルチェーンです。
実際の機能要件を考慮して、各ラインの線形テーブルは、各文字がノードである順序で記憶されてもよい。行列の長さ
この行に入力できる最大文字を表します。行と行の間の直線表は、各ノードが4つの領域を含む2つのチェーンテーブルを使用して記憶されています。
一つのポインタドメインpriorは前の行を指し、一つのポインタドメインnextは次の行を指し、一つのデータ領域numは行番号、一つのデータです。
フィールドは本行の文字配列です。プログラムは行と列でテキストの位置を識別します。行は双方向リンクを使って行情報を記憶します。
列情報は、文字の位置を正確に特定し、検索、置換、挿入、ブロック移動、削除など様々な操作が可能です。
関数機能ブロック図:
定義された構造体:
需要分析
(1)グラフィックメニュー画面を持っています。リアルタイムの年、日付、曜日、時間を表示します。
(2)
検索:テキスト中の文字列を検索し、その出現した行数、列数、合計出現回数を表示します。
置換(等長、不等長):テキスト中のテキストを等長および不等長に置き換えることができます。
挿入(列の挿入、テキストブロックの挿入):行または行番号を特定の行に挿入します。
ブロック移動(行ブロック、列ブロック移動):1行下に移動し、1行上に移動します。
具体的な行番号は左に移動しますか?右に移動します。
削除:行を削除し、列を削除し、長い内容を指定します。
(3)正確にディスクを保存し、ディスクを取ることができます。読み取り、テキスト保存;
(4)行の合計数を正しく表示します。(行数は5行以下で、行数は80文字以下です。
使用するデータ構造
1:採用する論理構造
テキストエディタは主にテキストを編集します。テキストの操作は文字の操作です。テキストエディタは、行、
列の2方向を編集します。
各ラインは線形テーブルとして見られ、線形テーブルは線形構造であり、線形構造の特徴はデータ要素間の直線性である。
関係は、要素によって「次から次へと並べる」というものです。線形テーブルでは、データ要素の種類は同じです。各行のために
記憶できる最大文字数は同じで、行方向のすべての直線表の最大長は同じに設定できます。行と行の間
の関係も線形表として見られます。
2.採用した記憶構造
リニアテーブルの記憶は、順序記憶とチェーン記憶の2種類に分けられます。
順序記憶とは、メモリ中に住所で連続したブロックの記憶空間を指し、線形テーブルの各要素を順次記憶するもので、このような記憶形式を用いる。
記憶されているリニアテーブルをシーケンステーブルと呼びます。プログラム設計言語において、1次元配列がメモリに占める記憶空間は連続的なものです。
の記憶領域は、1次元配列でシーケンステーブルを表すデータ記憶領域が最適である。
チェーン記憶は、-グループの任意の記憶手段によって、線形テーブル内のデータ要素を記憶するもので、データ要素系間の線形を確立するものである。
各データ要素に対する関係は、データ要素自身の情報を保存する以外に、その後継または前駆の所在地を一緒に保存する必要がある。
この2つの部分の情報は、それぞれの要素が同じである「結点」を構成する。データ要素の情報を保存することを「データ要素」といいます。
データ領域では、前駆者または後継者のアドレスを格納することをポインタドメインと呼びます。一つの記憶ユニットのアドレスだけがシングルチェーンテーブルで、二つの記憶があります。
ユニットのアドレスはダブルチェーンです。
実際の機能要件を考慮して、各ラインの線形テーブルは、各文字がノードである順序で記憶されてもよい。行列の長さ
この行に入力できる最大文字を表します。行と行の間の直線表は、各ノードが4つの領域を含む2つのチェーンテーブルを使用して記憶されています。
一つのポインタドメインpriorは前の行を指し、一つのポインタドメインnextは次の行を指し、一つのデータ領域numは行番号、一つのデータです。
フィールドは本行の文字配列です。プログラムは行と列でテキストの位置を識別します。行は双方向リンクを使って行情報を記憶します。
列情報は、文字の位置を正確に特定し、検索、置換、挿入、ブロック移動、削除など様々な操作が可能です。
関数機能ブロック図:
定義された構造体:
struct line
{
char text[MAX_LEN]; //
int num; //
struct line *next; //
struct line *prior; //
};
コードは以下の通りです。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>
#define MAX 240
#define NOT_FOUND -1
//
void HeadWord(void); // , 。
void PrintWord(void); //
void printf_time(); // ,
void scanf_load(); //
void file_load(); //
void findstr(); //
void delete1(int linenum);//
void delete2(int linenum,int position,int lenth);// , ,
void insert1(); //
void insert2(char str[], int linenum, int position);//
void replace(); //
void Mainmenu(); //
void menu1(); //
void menu2(); //
void menu_move(); //
//
struct line
{
char text[MAX]; //
int num; //
struct line *prior; //
struct line *next; //
};
struct line *start; //
struct line *last; //
//
int main()
{
Mainmenu();
return 0;
}
// , 。
void HeadWord()
{
printf("\t\t ____________________________________________________
");
printf("\t\t**** Welcom to use our TXT edition system! ****
");
printf("\t\t ____________________________________________________
");
}
//
void PrintWord()
{
struct line *p = start;
while(p != last)
{
printf("
\t\t %d |%s",p->num,p->text);
p = p->next;
}
printf("
\t\t %d |%s",last->num,last->text);
printf("
");
}
//
void printf_time()
{
time_t timep;
struct tm *p;
time (&timep);
p=gmtime(&timep);
//
printf("\t\t|Data:%d-%d-%d |",1900+p->tm_year,1+p->tm_mon,p->tm_mday);
//
printf("Today is ");
switch (p->tm_wday)
{
case 7:
printf("Sunday |");
break;
case 1:
printf("Monday |");
break;
case 2:
printf("Tuesday |");
break;
case 3:
printf("Wednesday|");
break;
case 4:
printf("Thursday |");
break;
case 5:
printf(" Friday |");
break;
case 6:
printf("Saturday |");
break;
default:
break; }
// 08:04:11 , , ,
if(p->tm_hour+8<10&&p->tm_min>10&&p->tm_sec>10)
printf("Time:0%d:%d:%d |",p->tm_hour+8,p->tm_min,p->tm_sec);
else if(p->tm_hour+8<10&&p->tm_min<10&&p->tm_sec>10)
printf("Time:0%d:0%d:%d |",p->tm_hour+8,p->tm_min,p->tm_sec);
else if(p->tm_hour+8<10&&p->tm_min<10&&p->tm_sec<10)
printf("Time:0%d:0%d:0%d |",p->tm_hour+8,p->tm_min,p->tm_sec);
else if(p->tm_hour+8>=10&&p->tm_min<10&&p->tm_sec<10)
printf("Time:%d:0%d:0%d |",p->tm_hour+8,p->tm_min,p->tm_sec);
else if(p->tm_hour+8>=10&&p->tm_min>=10&&p->tm_sec<10)
printf("Time:%d:%d:0%d |",p->tm_hour+8,p->tm_min,p->tm_sec);
else if(p->tm_hour+8>=10&&p->tm_min>=10&&p->tm_sec>=10)
printf("Time:%d:%d:%d |",p->tm_hour+8,p->tm_min,p->tm_sec);
else if(p->tm_hour+8>=10&&p->tm_min<10&&p->tm_sec>=10)
printf("Time:%d:0%d:%d |",p->tm_hour+8,p->tm_min,p->tm_sec);
else if(p->tm_hour+8<10&&p->tm_min>=10&&p->tm_sec<10)
printf("Time:0%d:%d:0%d |",p->tm_hour+8,p->tm_min,p->tm_sec);
}
//
void file_load()
{
struct line *info,*temp; // ,info ,temp info
char ch;
temp = NULL;
int linenum,i; // ,
FILE *fp; //
char name[20];
printf(" ( c:\\a.txt)");
scanf("%s",name);
while ((fp=fopen(name,"r"))==NULL)
{
printf("
, :");
scanf("%s",name);
}
start = (struct line*)malloc(sizeof(struct line)); //
info = start;
linenum = 1;
while((ch = fgetc(fp)) != EOF)
{
i = 0;
info->text[i] = ch;
i++;
while((ch = fgetc(fp)) != '
') //
{
info->text[i] = ch;
i++;
}
info->num = linenum++;
info->next = (struct line*)malloc(sizeof(struct line));
if (!info->next)
{
printf("
\t\t ");
getchar();
exit(0);
}
temp = info;
info = info->next;
info->prior = temp;
}
last = info->prior;
printf("\t\t
");
fclose(fp);
}
//
void scanf_load()
{
struct line *info,*temp; // ,info ,temp info
char ch;
temp = NULL;
int linenum,i; // ,
FILE *fp; //
temp = NULL;
start = (struct line*)malloc(sizeof(struct line)); //
info = start;
linenum = 1;
printf("\t\t ( , # )
\t\t");
while((ch = getchar()) !='#')
{
i = 0;
info->text[i] = ch;
i++;
while((ch = getchar()) != '
') //
{
info->text[i] = ch;
i++;
}
printf("\t\t");
info->text[i] = '\0';
info->num = linenum++;
info->next = (struct line*)malloc(sizeof(struct line));
if (!info->next)
{
printf("
\t\t ");
getchar();
exit(0);
}
info->prior = temp;
temp = info;
info = info->next;
}
temp->next = NULL;
last = temp;
free(info);
start->prior = NULL;
}
//
void save()
{
system("cls");
FILE *fp;
line *info=start;
int i=0;
char name[20];
printf("
( : c:\\a.txt):");
scanf("%s",name);
while ((fp=fopen(name,"w+"))==NULL)
{
printf(" , :");
scanf("%s",name);
}
while(info)
{
while(info->text[i]!='
')
{fprintf(fp,"%c",info->text[i]);
i++;
}
info = info->next;
i = 0;
}
fclose(fp);
printf("
");
}
//
void findstr(){
PrintWord();
char str[MAX];
getchar();
printf("\t\t :");
gets(str);
printf("\t\t|>>________________________________________________<<|
");
struct line *info;
int i = 0, find_len, found = 0, position;
char substring[MAX];
info = start;
int find_num = 0; //
find_len = strlen(str);
while (info) //
{
i = 0; //
while (i <= (strlen(info->text) - find_len)) //
{ int k=0;
for(int j=i;j<i+find_len;j++) // find_len substring
{
substring[k] = info->text[j];
k++;
}
if (strcmp(substring,str) == 0)
{
find_num++;
printf("\t\t| %d :%d %d
",find_num,info->num,(i+1+1)/2);
found = 1;
}
i++;
}
info = info->next;
}
if (found) //
printf("\t\t|\t\t %d
",find_num);
else //
printf("\t\t
");
printf("\t\t|>>________________________________________________<<|
");
}
//
void delete1(int line_num)
{
struct line * info, *p;
info = start;
while ((info->num < line_num) && info) //
info = info->next;
if (info == NULL)
printf(" ");
else
{
p = info->next; //
if (start == info) //
{
start = info->next;
if (start) // ,
start->prior = NULL;
else //
last = NULL;
}
else
{
info->prior->next = info->next; //
if (info != last) //
info->next->prior = info->prior; //
else // ,
last = info->prior;
}
free(info);
while (p) //
{
p->num = p->num - 1;
p = p->next;
}
}
}
// , ,
void delete2(int line_num,int position,int lenth)
{
struct line *info=start;
char rest_str[MAX];
if(line_num == 1)
info = start;
else
for(int i=1;i<line_num;i++) // info
info = info->next;
if (info == NULL)
printf(" !n");
else
{
if (strlen(info->text) <= (position + lenth)) // <= + , '\0'
info->text[position] = '\0';
else
{ int i;
for(i = position-1;info->text[i+lenth]!='\0';i++)
info->text[i]=info->text[i+lenth];
info->text[i]='\0';
}
}
}
//
void insert1()
{
int linenum;
printf("\t\t :");
scanf("%d", &linenum);
struct line * info, * q, * p;
p = start;
q = NULL;
while (p && p->num != linenum)
{
q = p; //
p = p->next; //
}
if (p == NULL && (q->num + 1) != linenum) // ,
{
printf("\t\t ");
}
else // ,
{
info = (struct line *)malloc(sizeof(struct line));
printf("\t\t :");
scanf("%s", info->text);
info->num = linenum;
if (linenum == 1) //
{
info->next = p;
p->prior = info;
info->prior = NULL;
start = info;
}
else if (q->num != linenum) //
{
q->next = info;
info->next = p;
info->prior = q;
}
else //
{
q->next = info;
info->next = p;
p->prior = info;
info->prior = q;
}
while (p) // , 1
{
p->num = p->num + 1;
p = p->next;
}
}
}
//
void insert2(char str[], int linenum, int position)
{
struct line * info;
int len, i;
int lenth;
char rest_str[MAX],kongge[2] = { " " };
info = start;
while (info && info->num != linenum) //
{
info = info->next;
}
if (info == NULL)
printf(" !
");
else if (position < 0)
printf(" !
");
else // ,
{
lenth = strlen(info->text);
if (lenth < position) //
{
len = position - lenth - 1;
for (i = 0; i < len; i++)
strcat(info->text, kongge); //
strcat(info->text, str); //
}
else //
{
strcpy(rest_str, &info->text[position - 1]);
strcpy(&info->text[position - 1], str);
strcat(info->text, rest_str);
}
}
}
//
void replace()
{
PrintWord();
char str[MAX];
printf("\t\t :\t\t");
scanf("%s",&str);
char replace[MAX];
printf("\t\t :");
scanf("%s",&replace);
struct line *info;
int i = 0, find_len, found = 0, position;
char bijiao[MAX];
info = start;
int find_num = 0; //
find_len = strlen(str);
while (info) //
{
i = 0; //
while (i <= (strlen(info->text) - find_len)) //
{ int k=0;
for(int j=i;j<i+find_len;j++) // find_len substring
{
bijiao[k] = info->text[j];
k++;
}
if (strcmp(bijiao,str) == 0)
{
find_num++;
delete2(info->num,i+1,find_len);
insert2(replace,info->num,i+1);
found = 1;
}
i++;
}
info = info->next;
}
if (found) //
printf("\t\t %d
",find_num);
else //
printf("\t\t
");
printf("\t\t :
");
PrintWord();
}
//
void menu1()
{
printf("\t\t| 1: 2: |
\t\t");
int i;
scanf("%d",&i);
getchar();
if(i>2||i<1)
{
printf("\t\t , !
");
}
switch(i)
{
case 1:
scanf_load();
system("cls");
break;
case 2:
file_load();
system("cls");
break;
}
}
//
void menu_move()
{
int choice;
printf("
\t\t|_____________________ _______________________|
");
printf("
\t\t|----->1. <-----------|
");
printf("\t\t|----->2. <-----------|
");
printf("\t\t|----->3. <-----------|
");
printf("\t\t|----->4. <-----------|
");
printf("\t\t|----->5. <-----------|
");
printf("\t\t ");
scanf("%d",&choice);
int line_num,number;
char str[2];
switch (choice)
{
case 1: //
printf("\t\t :");
scanf("%d", &line_num);
struct line *info,*p; //
info = (struct line *)malloc(sizeof(struct line));
info->text[0] = ' ';
info->text[1] = '\0';
info->num = line_num;
if (line_num == 1) //
{
info->next = start;
start->prior = info;
start = info;
start->prior = NULL;
p=start->next;
}
else //
{
p=start;
while (p->num != line_num)
p = p->next; // p
info->next=p;
info->prior=p->prior;
p->prior->next=info;
p->prior = info;}
while (p) // 1
{
p->num = p->num + 1;
p = p->next;
}
break;
case 2: //
printf("\t\t :");
scanf("%d",&line_num);
delete1(line_num-1);
break;
case 3: //
printf("\t\t :");
scanf("%d", &line_num);
printf("\t\t :");
scanf("%d", &number);
str[0] = ' ';
str[1] = '\0';
insert2(str, line_num, number);
break;
case 4: //
printf("\t\t :");
scanf("%d", &line_num);
printf("\t\t :");
scanf("%d", &number);
if (number <= 0)
printf("\t\t ");
else
delete2(line_num, number - 2, 1);
break;
case 5: //
break;
}
}
//
void menu2()
{
char str1[20];
char str2[20];
int a;
do
{
HeadWord();
printf_time();
printf("
\t\t ____________________________________________________
");
printf("\t\t| |
");
printf("\t\t|____________________________________________________|
");
printf("\t\t|----> 1、 |
");
printf("\t\t|----> 2、 |
");
printf("\t\t|----> 3、 |
");
printf("\t\t|----> 4、 |
");
printf("\t\t|----> 5、 |
");
printf("\t\t|----> 6、 |
");
printf("\t\t|----> 7、 |
");
printf("\t\t|____________________________________________________|
");
printf("\t\t :");
scanf("%d",&a);
switch(a)
{
case 1:
system("cls");
HeadWord();
findstr();
printf("\t\t ・・・・・");
getchar();
getchar();
system("cls");
break;
case 2:
system("cls");
HeadWord();
printf("\t\t| 1: 2: , , |
\t\t");
int delete_choice;
scanf("%d",&delete_choice);
getchar();
if(delete_choice == 1)
{
int linenum;
printf("\t\t :
");
PrintWord();
printf("\t\t :");
scanf("%d",&linenum);
getchar();
delete1(linenum);
}
else if(delete_choice == 2)
{
int linenum, position,lenth; // , ,
printf("\t\t :
");
PrintWord();
printf("\t\t , , ,
");
printf("\t\t---> :
\t\t");
scanf("%d %d %d",&linenum,&position,&lenth);
position = (position*2)-1;
getchar();
delete2(linenum,position,lenth);
}
printf("\t\t :
");
PrintWord();
printf("\t\t ・・・・・");
getchar();
getchar();
system("cls");
break;
case 3:
system("cls");
HeadWord();
printf("\t\t| 1: 2: |
\t\t");
int insert_choice;
scanf("%d",&insert_choice);
if(insert_choice == 1)
{
printf("\t\t :
");
PrintWord();
insert1();}
else
{
printf("\t\t :
");
PrintWord();
char str[MAX]; int linenum; int position;
printf("\t\t :");
scanf("%d", &linenum);
printf("\t\t - :");
scanf("%d", &position);
position = (position*2)-1;
printf("\t\t :");
scanf("%s", str);
insert2(str,linenum,position);
}
printf("\t\t :
");
PrintWord();
printf("\t\t ・・・・・");
getchar();
getchar();
system("cls");
break;
case 4:
system("cls");
HeadWord();
printf_time();
menu_move();
printf("\t\t :
");
PrintWord();
printf("\t\t ・・・・・");
getchar();
getchar();
system("cls");
break;
case 5:
system("cls");
HeadWord();
printf_time();
replace();
printf("\t\t ・・・・・");
getchar();
getchar();
system("cls");
break;
}
if(a==6)
{
system("cls");
break;
}
if(a==7) exit(0);
}while(1);
}
//
void Mainmenu()
{
printf("
\t\t\tWelcom to use our TXT edition system!
");
printf("
\t\t\t !
");
printf("
press Enter to continue...");
getchar();
system("cls");
int t;
do{
HeadWord();
printf_time();
printf("
");
printf("\t\t ____________________________________________________
");
printf("\t\t| |
");
printf("\t\t| |
");
printf("\t\t|----> 1、 |
");
printf("\t\t|----> 2、 |
");
printf("\t\t|----> 3、 |
");
printf("\t\t|----> 4、 |
");
printf("\t\t|----> 5、 |
");
printf("\t\t| |
");
printf("\t\t| : 1 |
");
printf("\t\t|____________________________________________________|
");
printf(" \t\t :");
scanf("%d",&t);
if(t>5||t<1)
{
printf(" , , !
");
}
else
switch(t)
{
case 1:
system("cls");
HeadWord();
menu1();
printf("\t\t ・・・・・");
getchar();
getchar();
system("cls");
break;
case 2:
system("cls");
menu2();
break;
case 3:
system("cls");
HeadWord();
printf_time();
printf("
\t\t ____________________ ______________________
");
PrintWord();
printf("
");
printf("\t\t ・・・・・");
getchar();
getchar();
system("cls");
break;
case 4:
HeadWord();
save();
break;
}
if(t==5) break;
}while(1);
}
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。