利用DOS系统功能调用,将键盘输入的小写字母转换成大写字母输出显示,直到输入“$”字符时停止输出。
(1)第一步应分析要求,选择合适的结构设计流程图。
例如:本设计采用 结构。(注意选择的结构和下面自己编写的程序对应。)
(2)此程序不需定义数据段,直接从代码段定义开始完成程序设计。
流程图:
代码设计如下:将键入的字符送AL寄存器,并送屏幕显示输出。转换成大写后,将DL寄存器中的内容送屏幕显示输出。
CODE SEGMENT
ASSUME CS:CODE
START:
MOV AX, DATA
MOV DS, AX
MOV BL, '$'
INPU:MOV AH, 01H
INT 21H;读数据
CMP AL, BL;判断是否为$字符
JE EXT;若是则退出程序
SUB AL, 20H;小写转大写,ASCII码
MOV DL, AL
MOV AH, 02H
INT 21H;显示DL中的字符
EXT: MOV AH, 4CH
INT 21H
CODE ENDS
END START
引用chatGPT作答,根据题目要求,我们需要编写一个程序,能够接收键盘输入的小写字母,并将其转换为大写字母输出,直到输入“$”字符时停止输出。下面是程序的设计流程图:
开始
读取键盘输入
如果输入字符为"$",则结束程序
如果输入字符为小写字母,转换为大写字母并输出
重复执行读取输入直到结束程序
结束
下面是基于DOS系统功能调用的程序代码实现:
assume cs:code
code segment
start:
mov ah, 1 ; 从键盘读取字符
int 21h ; 调用DOS系统功能
cmp al, '$' ; 判断是否输入结束
je end_prog ; 如果是"$"字符,则结束程序
cmp al, 'a' ; 判断是否小写字母
jb skip ; 如果小于'a',则跳过
cmp al, 'z' ; 判断是否大写字母
ja skip ; 如果大于'z',则跳过
sub al, 20h ; 转换为大写字母
skip:
mov ah, 2 ; 输出字符
int 21h ; 调用DOS系统功能
jmp start ; 重复执行读取输入直到结束程序
end_prog:
mov ah, 4Ch ; 退出程序
int 21h ; 调用DOS系统功能
code ends
end start
该程序首先使用DOS系统功能调用读取键盘输入的字符,然后判断是否为“$”字符,如果是则结束程序,如果不是则判断是否为小写字母,如果是则转换为大写字母并输出。程序使用无限循环重复执行读取输入直到结束程序。最后程序退出并返回DOS系统。注意,在代码段定义时需要使用assume cs:code指令将代码段和代码段寄存器CS关联。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define FLAG -1 //停止输入的标志
typedef struct Node
{
int data;
struct Node * next;
}LNode,*LinkList;
void CreateLinkList(LinkList L);
void show_List(LinkList L);
LNode *Breakupthelist(LinkList La,int *A,int *B);
void main()
{
LinkList La,Lb;
int A = 0,B = 0;
La = (LinkList)malloc(sizeof(LNode));//创建头结点
printf("创建单链表:\n");
CreateLinkList(La);
printf("遍历单链表:\n");
show_List(La);
printf("拆分链表:\n");
Lb = Breakupthelist(La,&A,&B);//A,B用来判断全是奇数或全是偶数的情况
if(A == 0)//全是偶数
{
printf("偶数链:\n");
show_List(La);
printf("奇数链为空!\n");
}
else if(B == 0)//全是奇数
{
printf("奇数链:\n");
show_List(Lb);
printf("偶数链为空!\n");
}
else
{
printf("偶数链:\n");
show_List(La);
printf("奇数链:\n");
show_List(Lb);
}
}
void CreateLinkList(LinkList L) //尾插法 输出是输入的正序
{
LinkList s,r;
int x;
scanf("%d",&x);
r = L;
while(x != FLAG)
{
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf("%d",&x);
}
r->next = NULL;
}
void show_List(LinkList L)
{
LinkList p = L->next;
printf("%d",p->data);
p = p ->next;
while(p != NULL)
{
printf("->%d",p->data);
p = p->next;
}
printf("\n");
}
LNode *Breakupthelist(LinkList La,int *A,int *B) //返回奇数链表的头结点
{
LinkList p,q,r;//r始终指向偶数链的尾部
LinkList Lb = (LinkList)malloc(sizeof(LNode));
p = La;
q = Lb;
r = La;
p = p->next;
while(p)
{
if(p->data % 2 != 0) //奇数
{
q->next = p;
p = p->next;
r->next = p;
q = q->next;
*A = 1;
}
else
{
p = p->next;
r = r->next;
*B = 1;
}
}
q->next = NULL;
return Lb;
}