1

嗨,我想获得将大写转换为小写和小写转换为同一单词的大写的想法或代码,例如:将 StAcKOVERfloW 转换为 sTaCkoverFLOw 请任何人给我想法或 qbasic 编程语言的代码

4

1 回答 1

1

解决这个任务的方法是一个接一个地处理字符串中的字符。一个基本的FOR NEXT循环实现了这一点:

FOR cpos% = 1 TO LEN(text$)
  char$ = MID$(text$, cpos%, 1)  ' Extracts 1 character at the current position
  ...
NEXT

QBasic 具有将字符串参数分别转换为大写和小写的UCASELCASE函数。如果我们处理的字符串由一个只有大写和小写字符的单词组成,下一个代码片段将产生所需的结果:

text$ = "StAcKOVERfloW"
PRINT text$;
FOR cpos% = 1 TO LEN(text$)
  char$ = MID$(text$, cpos%, 1)
  IF char$ >= "A" AND char$ <= "Z" THEN
    MID$(text$, cpos%) = LCASE$(char$)
  ELSE
    MID$(text$, cpos%) = UCASE$(char$)
  END IF
NEXT
PRINT " --> "; text$

UCASE我们可以在不使用or的情况下编写上述代码LCASE。然后我们将处理字符的 ASCII 码。大写字符“A”到“Z”的 ASCII 码是 65 到 90,小写字符“a”到“z”的 ASCII 码是 97 到 122。这些范围相隔 32,这是从 1 转换的重要数字在另一个。
下一个版本以这种方式工作:

text$ = "StAcKOVERfloW"
PRINT text$;
FOR cpos% = 1 TO LEN(text$)
  char$ = MID$(text$, cpos%, 1)
  IF char$ >= "A" AND char$ <= "Z" THEN
    MID$(text$, cpos%) = CHR$(ASC(char$) + 32) ' Upper to Lower means + 32
  ELSE
    MID$(text$, cpos%) = CHR$(ASC(char$) - 32) ' Lower to Upper means - 32
  END IF
NEXT
PRINT " --> "; text$

使用 ASCII 代码的这一举措将允许我们在一行中编写转换。XOR在这里做繁重工作的是操作员。我们不再需要决定加 32 还是减 32。异或为我们做了切换:

text$ = "StAcKOVERfloW"
PRINT text$;
FOR cpos% = 1 TO LEN(text$)
  MID$(text$, cpos%) = CHR$(ASC(MID$(text$, cpos%, 1)) XOR 32)
NEXT
PRINT " --> "; text$

对于切换字符大小写问题的一般解决方案,我们必须考虑到键盘上的用户可能正在输入文本,并且文本可能包含非大写或小写字母的字符.
为了防止出现空文本,我们可以替换FOR NEXTwhereWHILE WEND条件,如果当前位置cpos%不存在于字符串text$中,则跳过循环。
因为对字符串的所有修改都是有条件的,所以除了字母之外没有任何修改的危险。

INPUT ; "Text : ", text$
cpos% = 1
WHILE cpos% <= LEN(text$)
  ascii% = ASC(MID$(text$, cpos%, 1))
  ucase% = ascii% AND &HDF
  IF ucase% >= 65 AND ucase% <= 90 THEN
    MID$(text$, cpos%) = CHR$(ascii% XOR 32)
  END IF
  cpos% = cpos% + 1
WEND
PRINT " --> "; text$

代码被“优化”,它倾向于使用数字操作而不是使用字符串操作。一般来说,字符串分配确实需要相对较长的时间。
代码首先将 ASCII 码转换为大写,以简化IFfrom

IF (ascii% >= 65 AND ascii% <= 90) or (ascii% >=97 and ascii% <=122) THEN

ucase% = ascii% AND &HDF
IF ucase% >= 65 AND ucase% <= 90 THEN
于 2021-11-17T23:36:40.010 回答