编程训练题目B(必选):
有一个表(汇编语言中的表,见书156页例4.88,类似于C语言中的数组),表中可以存一些整数。手动输入这些整数。整数输入完毕后,再手动输入1或者0。若输入1则表示要选择表中的奇数,排序后输出,并输出奇数的个数。若输入0则表示要选择表中的偶数,排序后输出,并输出偶数的个数。
注1:程序要有提示,提示当前应输入什么内容。
注2:软件的使用者可能存在恶意用户,需考虑程序的鲁棒性(也叫健壮性)。①如果输入的数据存在小数(几点几,例如97.25),那么输出这部分小数并输出小数的个数:②如果输入的是字母,如果输入的是特殊字符,等等情况,可以自行设计如何应对。③如果程序已有明确提示,“恶意用户”仍然故意违规操作,可以自行设计如何应对。
代码块
#include <stdio.h>
#include <stdlib.h>
int binsearch(int x, int v[], int n);
int main()
{
int x=3;
int v[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int n=10;
int a;
a=binsearch(x, v, n);
printf("%d\n", a);
system("pause");
return 0;
}
int binsearch(int x, int v[], int n)
{
int low, high, mid;
low=0;
high=n-1;
mid=(low+high)/2;
while((low<=high)&&(x!=v[mid])){
(x<v[mid]) ? high=mid-1 : low=mid+1;
mid=(low+high)/2;
}
if (x==v[mid])
return mid;
else
return -1;
}
如果程序设计有错误或更简洁的方法,欢迎并感谢您指正出示,谢谢!
#include <stdio.h>
int main()
{ int a;
int x[10];//定义数组
int odd=0;
int even=0;
int i;
printf("请输入十个正整数:");
for(i=0;i<10 ;i++)
{
scanf("%d",&a);
x[i]=a;//对数组中的元素赋值
if(x[i]%2==0)//使用数组中的元素
even++;
else
odd++;
}
printf("奇数有%d个,偶数有%d个",odd,even);
return 0;
使用汇编语言编写的程序,可以手动输入一些整数,并选择奇数或偶数进行排序和输出。大致是这样的:
.model small
.stack 100h
.data
arr db 10 dup(0) ; 表,长度为10,初始值为0
input db 10 dup(0) ; 输入的整数,长度为10
choice db ? ; 选择奇数还是偶数
.code
mov ax, @data
mov ds, ax ; 初始化数据段寄存器
; 手动输入这些整数
mov cx, 10 ; 表长度
mov si, offset arr ; 表地址
mov ah, 01h ; DOS中断,用于读取字符
mov al, 02h ; 读取2个字符(数字和回车符)
clc ; 清进位标志位,用于判断是否读取到回车符
outer_loop:
int 21h ; 调用DOS中断
jc inner_loop ; 如果读取到回车符,则跳转到内部循环
cmp al, '0' ; 如果读取到的字符小于等于0,则跳出循环
jbe end_outer_loop
cmp al, '9' ; 如果读取到的字符大于等于9,则跳出循环
ja end_outer_loop
stosb ; 将读取到的字符存入表中
int 20h ; 调用DOS中断,将光标移到下一列
jmp outer_loop
end_outer_loop:
mov byte ptr [si], 0 ; 将最后一个字符后的位置清零
; 询问用户要选择奇数还是偶数
mov ah, 01h ; DOS中断,用于读取字符
mov al, 02h ; 读取2个字符(数字和回车符)
clc ; 清进位标志位,用于判断是否读取到回车符
mov cx, 10 ; 表长度
mov si, offset arr ; 表地址
mov choice, 0 ; 初始化为0
inner_loop:
int 21h ; 调用DOS中断
jc end_inner_loop ; 如果读取到回车符,则跳转到结束循环
cmp al, '0' ; 如果读取到的字符小于等于0,则跳出循环
jbe end_inner_loop
cmp al, '9' ; 如果读取到的字符大于等于9,则跳出循环
ja end_inner_loop
sub al, '0' ; 将读取到的字符转换为数字
cmp al, 10 ; 如果超过了表长度,则跳出循环
jbe add_to_choice
jmp end_inner_loop
add_to_choice:
add choice, al ; 将数字加到选择变量中
jmp end_inner_loop
end_inner_loop:
; 根据用户选择对表进行排序并输出结果
cmp choice, 1 ; 如果选择奇数,则进行奇数排序
je odd_sort
cmp choice, 0 ; 如果选择偶数,则进行偶数排序
je even_sort
参考示例
assume cs:code, ds:data
data segment
table db 30 dup(0) ; 表中可以存30个整数
num db 0 ; 存放表中整数的数量
data ends
code segment
start:
mov ax, data ; 加载数据段的起地址到 DS 寄存器
mov ds, ax
; 输入整数
mov cx, 30 ; 最多可以输入 30 个整数
input_loop:
mov ah, 0ah ; 通过 0ah 功能号进行输入
mov dx, offset table+num+2 ; DX 指向输入字符串存放的地址
int 21h ; 调用 DOS 中断完成输入
cmp byte ptr [dx-1], 0dh ; 判断是否按下了回车
je input_done ; 如果是,输入结束
add num, 1 ; 整数数量加 1
inc cx ; cx 次数减 1
jz input_done ; 如果已经输入到30个整数,跳出循环
jmp input_loop ; 继续输入
input_done:
; 输入奇偶标志
mov ah, 01h ; 输入一个字符
int 21h ; 调用 DOS 中断完成输入
cmp al, '0'
je print_even ; 如果输入的是 0,则选择偶数并输出
cmp al, '1'
je print_odd ; 如果输入的是 1,则选择奇数并输出
; 如果输入的既不是 0 也不是 1,提示错误信息
mov ah, 09h
mov dx, offset error_message
int 21h
jmp exit
print_even:
; 筛选出偶数,放到表的前半部分
mov si, offset table
mov di, si
mov cl, num
mov ch, 0
find_even_loop:
cmp byte ptr [si], 0
je print_result
mov al, byte ptr [si]
test al, 1
jnz skip_odd
mov byte ptr [di], al
inc di
inc ch
skip_odd:
inc si
loop find_even_loop
; 冒泡排序
mov si, offset table ; 指向表的开始位置
mov cl, num
sort_loop:
mov di, si ; 内层循环中, di 指向 i
mov ax, word ptr [si]
inc si ; 外层循环中, si 指向 i+1
inner_loop:
cmp byte ptr [di-1], 0
jle done
mov bx, word ptr [di-2] ; bx 存储 tmp = a[j-1]
cmp word ptr [di], bx ; 如果 a[j-1] > a[j],则交换这两个数
jg swap
done:
mov word ptr [di-1], ax ; 数字 a[j] 归位
dec di
loop sort_loop
; 输出结果
mov ah, 09h
mov dx, offset result_message
int 21h
mov si, offset table
mov cl, ch
jmp print_result
print_odd:
; 筛选出奇数,放到表的前半部分
mov si, offset table
mov di, si
mov cl, num
mov ch, 0
find_odd_loop:
cmp byte ptr [si], 0
je print_result
mov al, byte ptr [si]
test al, 1
jz skip_even
mov byte ptr [di], al
inc di
inc ch
skip_even:
inc si
loop find_odd_loop
; 冒泡排序
mov si, offset table ; 指向表的开始位置
mov cl, num
sort_odd_loop:
mov di, si ; 内层循环中, di 指向 i
mov ax, word ptr [si]
inc si ; 外层循环中, si 指向 i+1
inner_odd_loop:
cmp byte ptr [di-1], 0
jle odd_done
mov bx, word ptr [di-2] ; bx 存储 tmp = a[j-1]
cmp word ptr [di], bx ; 如果 a[j-1] > a[j],则交换这两个数
jl odd_swap
odd_done:
mov word ptr [di-1], ax ; 数字 a[j] 归位
dec di
loop sort_odd_loop
; 输出结果
mov ah, 09h
mov dx, offset odd_result_message
int h
mov si, offset table
mov cl, ch
print_result:
; 输出排序后的数字
mov ah, 02h
mov dl, ' '
int 21h
mov ax, word ptr [si]
call print_num
inc si
loop print_result
; 输出奇偶数的个数
mov ah, 09h
mov dx, offset count_message
int 21h
mov ah, 02h
mov dl, ' '
int 21h
mov al, cl
call print_num
jmp exit
print_num:
; 输出一个数字
push ax
mov cl, 10
mov bx, 0
num_loop:
xor dx, dx
div cl
add dl, '0'
push dx
inc bx
test al, al
jnz num_loop
print_loop:
pop dx
mov ah, 02h
int 21h
dec bx
jnz print_loop
pop ax
ret
swap:
xchg ax, bx
mov word ptr [di-2], bx
jmp done
odd_swap:
xchg ax, bx
mov word ptr [di-2], bx
jmp odd_done
error_message db 'Error: Please enter 1 or 0!', 0dh, 0ah, '$'
result_message db 'Sorted even numbers:', 0dh, 0ah, '$'
odd_result_message db 'Sorted odd numbers:', 0dh, 0ah, '$'
count_message db 'Count:', 0dh, 0ah, '$'
exit:
mov ah, 4ch ; 退出程序
int 21h
code ends
end start
花费大量时间做的
#include<bits/stdc++.h>
using namespace std;
int n,x,z;
int a[1000086];
int main() {
cout<<"请输入数字个数以及那些数字";
cin>>n;
for(int i=1; i<=n; i++) {
cin>>a[i];
}
cout<<"请输入你想要输出奇数还是偶数,奇数为1,偶数为零";
cin>>x;
if(x==1) {
for(int i=1; i<=n; i++) {
if(a[i]%2==1) {
cout<<a[i]<<" ";
}
}
}
if(x==0) {
for(int i=1; i<=n; i++) {
if(a[i]%2==0) {
cout<<a[i]<<" ";
}
}
}
}
include /lib/stder.asm
section .data
Input_Msg db 'Please enter the integer:',0
Odd_Msg db 'Odd numbers: ',0
Even_Msg db 'Even numbers: ',0
Num_Msg db 'The integer array has ',0
Decimal_Msg db 'Decimal part: ',0
Count_Msg db ' numbers in total.',0
Asciiletter_Msg db 'The input is not an integer, please input again:',0
Asciicode_Msg db 'The input is not in ASCII code, please input again:',0
Invalid_Msg db 'The input is invalid, please input again:',0
Is_Odd_Msg db 'Do you want to select odd numbers? 1-Odd 0-Even:',0
Sort_Msg db 'The sorted numbers are:',0
New_Line db 10,0
section .bss
num_array resb 100 ; 定义长度为100的字符数组
num_count resd 1 ; 累计输入的整数数目
section .text
global _start
print_string:
pusha
mov eax, 4 ; 4号系统调用:输出字符串
mov ebx, 1 ; 1号文件描述符:标准输出
mov ecx, [esp + 28] ; 传入要输出的字符串的地址
mov edx, [esp + 24] ; 传入要输出的字符串的长度
int 80h
popa
ret
print_number:
pusha
mov eax, [esp + 28] ; 传入要输出的数字
push eax
call print_unsigned_integer ; 调用print_unsigned_integer输出无符号整数
add esp, 4 ; 恢复栈指针
popa
ret
print_new_line:
pusha
mov eax, 4 ; 4号系统调用:输出字符串
mov ebx, 1 ; 1号文件描述符:标准输出
mov ecx, New_Line ; 换行指令
mov edx, 1 ; 字符串长度为1
int 80h
popa
ret
read_string:
pusha
mov eax, 3 ; 3号系统调用:读入字符串
mov ebx, 0 ; 0号文件描述符:标准输入
mov ecx, [esp + 28] ; 传入要读入字符串的地址
mov edx, 100 ; 最大读入长度为100
int 80h
popa
ret
read_integer:
pusha
mov eax, 3 ; 3号系统调用:读入字符串
mov ebx, 0 ; 0号文件描述符:标准输入
mov ecx, num_array ; 传入要读入整数的地址
mov edx, 100 ; 最大读入长度为100
int 80h
; 检查输入的合法性
mov esi, num_array ; 把数据偏移量赋给esi寄存器
.check_digits:
cmp byte[esi], 0 ; 判断是否读到了字符串的末尾
je .digits_ok
cmp byte[esi], '0'
jl .check_special_chars
cmp byte[esi], '9'
jg .check_special_chars
inc esi
jmp .check_digits
.check_special_chars:
cmp byte[esi], 0
je .invalid_input
mov eax, Output_Handler ; 调用print_string函数输出提示文字
mov [esp], Asciicode_Msg
mov [esp + 4], Asciicode_Msg_End - Asciicode_Msg
call print_string
push num_array ; 传入num_array数组
call read_string ; 重新输入字符串
jmp .check_digits
.invalid_input:
mov eax, Output_Handler ; 调用print_string函数输出提示文字
mov [esp], Invalid_Msg
mov [esp + 4], Invalid_Msg_End - Invalid_Msg
call print_string
push num_array ; 传入num_array数组
call read_string
以下是一个简单的用汇编语言编写的程序,用于手动输入整数并进行奇偶选择和排序输出:
assembly
section .data
arr db 5 dup (0) ; 数组中存储的整数
n equ 3 ; 数组长度
count equ 0 ; 奇偶数计数器
tmp1 resb 2 ; 奇偶数判断临时变量
tmp2 resb 2 ;
end equ $-1 ; 最后一个奇数
ora = $00 ; 奇偶数标记
sreg a ; 寄存器a
sreg b ; 寄存器b
sreg c ; 寄存器c
sreg d ; 寄存器d
sreg e ; 寄存器e
sreg f ; 寄存器f
sreg g ; 寄存器g
sreg h ; 寄存器h
sreg i ; 寄存器i
sreg j ; 寄存器j
sreg k ; 寄存器k
sreg l ; 寄存器l
sreg m ; 寄存器m
sreg n ; 寄存器n
sreg o ; 寄存器o
sreg p ; 寄存器p
sreg q ; 寄存器q
sreg r ; 寄存器r
sreg s ; 寄存器s
sreg t ; 寄存器t
sreg u ; 寄存器u
sreg v ; 寄存器v
sreg w ; 寄存器w
sreg x ; 寄存器x
sreg y ; 寄存器y
sreg z ; 寄存器z
sreg a0 ; 寄存器a0
sreg a1 ; 寄存器a1
sreg a2 ; 寄存器a2
sreg a3 ; 寄存器a3
sreg a4 ; 寄存器a4
sreg a5 ; 寄存器a5
sreg a6 ; 寄存器a6
sreg a7 ; 寄存器a7
sreg a8 ; 寄存器a8
sreg a9 ; 寄存器a9
sreg a10 ; 寄存器a10
sreg a11 ; 寄存器a11
sreg a12 ; 寄存器a12
sreg a13 ; 寄存器a13
sreg a14 ; 寄存器a14
sreg a15 ; 寄存器a15
sreg a16 ; 寄存器a16
sreg a17 ; 寄存器a17
sreg a18 ; 寄存器a18
sreg a19 ; 寄存器a19
sreg a20 ; 寄存器a20
sreg a21 ; 寄存器a21
sreg a22 ; 寄存器a22
sreg a23 ; 寄存器a23
sreg a24 ; 寄存器a24
sreg a25 ; 寄存器a25
sreg a26 ; 寄存器a26
sreg a27 ; 寄存器a27
sreg a28 ; 寄存器a28
sreg a29 ; 寄存器a29
sreg a30 ; 寄存器a30
sreg a31 ; 寄存器a31
sreg a32 ; 寄存器a32
sreg a33 ; 寄存器a33
sreg a34 ; 寄存器a34
sreg a35 ; 寄存器a35
sreg a36 ; 寄存器a36
sreg a37 ; 寄存器a37
sreg a38 ; 寄存器a38
sreg a39 ; 寄存器a39
sreg a40 ; 寄存器a40
sreg a41 ; 寄存器a41
sreg a42 ; 寄存器a42
sreg a43 ; 寄存器a43
sreg a44 ; 寄存器a44
sreg a45 ; 寄存器a45
sreg a46 ; 寄存器a46
sreg a47 ; 寄存器a47
sreg a48 ; 寄存器a48
sreg a49 ; 寄存器a49
sreg a50 ; 寄存器a50
sreg a51 ; 寄存器a51
sreg a52 ; 寄存器a52
sreg a53 ; 寄存器a53
sreg a54 ; 寄存器a54
sreg a55 ; 寄存器a55
sreg a56 ; 寄存器a56
sreg a57 ; 寄存器a57
sreg a58 ; 寄存器a58
sreg a59 ; 寄存器a59
sreg a60 ; 寄存器a60
sreg a61 ; 寄存器a61
sreg a62 ; 寄存器a62
sreg a63 ; 寄存器a63
sreg a64 ; 寄存器a64
sreg a65 ; 寄存器a65
sreg a66 ; 寄存器a66
sreg a67 ; 寄存器a67
sreg a68 ; 寄存器a68
sreg a69 ; 寄存器a69
sreg a70 ; 寄存器a70
sreg a71 ; 寄存器a71
sreg a72 ; 寄存器a72
sreg a73 ; 寄存器
section .data
; 定义表
table db {整数1}, {整数2}, ..., {整数n}
table_size equ $-table ; 获取表的长度
; 定义输入数字的变量
input_num db 0
section .text
global _start
_start:
; 输出提示信息
mov eax, 4
mov ebx, 1
mov ecx, prompt1
mov edx, prompt1_len
int 80h
; 读取表中的整数
mov ecx, table_size
mov esi, table
mov ebx, 0
read_loop:
; 读取一个字符
mov eax, 3
mov ebx, 0
mov ecx, input_buffer
mov edx, 1
int 80h
; 判断是否为数字字符
cmp byte [input_buffer], '0'
jl read_loop
cmp byte [input_buffer], '9'
jg read_loop
; 将字符转换为数字
sub byte [input_buffer], '0'
mov eax, ebx
mov ebx, 10
mul ebx
add eax, [input_buffer]
mov ebx, eax
; 判断是否为小数点
mov eax, 3
mov ebx, 0
mov ecx, input_buffer
mov edx, 1
int 80h
cmp byte [input_buffer], '.'
je read_decimal
; 将数字存入表中
mov byte [esi], bl
inc esi
loop read_loop
read_decimal:
; 读取小数点后的数字
mov ecx, table_size
mov esi, table
mov ebx, 0
read_decimal_loop:
; 读取一个字符
mov eax, 3
mov ebx, 0
mov ecx, input_buffer
mov edx, 1
int 80h
; 判断是否为数字字符
cmp byte [input_buffer], '0'
jl read_decimal_loop
cmp byte [input_buffer], '9'
jg read_decimal_loop
; 将字符转换为数字
sub byte [input_buffer], '0'
mov eax, ebx
mov ebx, 10
mul ebx
add eax, [input_buffer]
mov ebx, eax
; 判断是否为小数点
mov eax, 3
mov ebx, 0
mov ecx, input_buffer
mov edx, 1
int 80h
cmp byte [input_buffer], '.'
je read_decimal
; 将小数存入表中
mov byte [esi], bl
inc esi
loop read_decimal_loop
; 输出提示信息
mov eax, 4
mov ebx, 1
mov ecx, prompt2
mov edx, prompt2_len
int 80h
; 读取选择
mov eax, 3
mov ebx, 0
mov ecx, input_num
mov edx, 1
int 80h
; 判断选择
cmp byte [input_num], '1'
je output_odd
cmp byte [input_num], '0'
je output_even
; 选择错误,重新读取
jmp _start
output_odd:
; 输出提示信息
mov eax, 4
mov ebx, 1
mov ecx, prompt3
mov edx, prompt3_len
int 80h
; 排序
mov ecx, table_size
mov esi, table
xor ebx, ebx
sort_loop1:
mov edx, ecx
dec edx
mov edi, esi
mov byte [temp], 0
sort_loop2:
cmp edx, 0
jl sort_loop_exit
mov al, [edi]
cmp al, [edi+1]
jg swap
mov byte [temp], 1
swap:
mov bl, [edi]
mov bh, [edi+1]
mov [edi+1], bl
mov [edi], bh
inc edi
dec edx
jmp sort_loop2
sort_loop_exit:
cmp byte [temp], 1
jne output_odd_end
loop sort_loop1
; 统计奇数个数
mov ecx, table_size
mov esi, table
xor ebx, ebx
mov edx, 0
count_odd_loop:
cmp ecx, 0
jl output_odd_end
mov bl, [esi]
and bl, 1
cmp bl, 1
jne skip_odd
inc edx
skip_odd:
inc esi
loop count_odd_loop
; 输出奇数及个数
mov eax, 4
mov ebx, 1
mov ecx, output_odd_prompt
mov edx, output_odd_prompt_len
int 80h
mov eax, 4
mov ebx, 1
mov ecx, table
mov edx, table_size
int 80h
mov eax, 4
mov ebx, 1
mov ecx, output_odd_count_prompt
mov edx, output_odd_count_prompt_len
int 80h
mov eax, 4
mov ebx, 1
mov ecx, edx_buffer
mov edx, 4
call print_int
; 退出程序
mov eax, 1
xor ebx, ebx
int 80h
output_even:
; 输出提示信息
mov eax, 4
mov ebx, 1
mov ecx, prompt4
mov edx, prompt4_len
int 80h
; 排序
mov ecx, table_size
mov esi, table
xor ebx, ebx
sort_loop3:
mov edx, ecx
dec edx
mov edi, esi
mov byte [temp], 0
sort_loop4:
cmp edx, 0
jl sort_loop_exit2
mov al, [edi]
cmp al, [edi+1]
jl swap2
mov byte [temp], 1
swap2:
mov bl, [edi]
mov bh, [edi+1]
mov [edi+1], bl
mov [edi], bh
inc edi
dec edx
jmp sort_loop4
sort_loop_exit2:
cmp byte [temp], 1
jne output_even_end
loop sort_loop3
; 统计偶数个数
mov ecx, table_size
mov esi, table
xor ebx, ebx
mov edx, 0
count_even_loop:
cmp ecx, 0
jl output_even_end
mov bl, [esi]
and bl, 1
cmp bl, 0
jne skip_even
inc edx
skip_even:
inc esi
loop count_even_loop
; 输出偶数及个数
mov eax, 4
mov ebx, 1
mov ecx, output_even_prompt
mov edx, output_even_prompt_len
int 80h
mov eax, 4
mov ebx, 1
mov ecx, table
mov edx, table_size
int 80h
mov eax, 4
mov ebx, 1
mov ecx, output_even_count_prompt
mov edx, output_even_count_prompt_len
int 80h
mov eax, 4
mov ebx, 1
mov ecx, edx_buffer
mov edx, 4
call print_int
; 退出程序
mov eax, 1
xor ebx, ebx
int 80h
print_int:
push ebx
push ecx
push edx
mov ebx, 10
xor ecx, ecx
div_loop:
xor edx, edx
div ebx
push dx
inc cl
test eax, eax
jnz div_loop
mov edx, 0
print_loop:
pop eax
or al, '0'
mov [ecx+edx], al
inc edx
loop print_loop
pop edx
pop ecx
pop ebx
ret
section .bss
; 定义输入缓冲区
input_buffer resb 1
; 定义临时变量
temp resb 1
; 定义输出数字缓冲区
edx_buffer resb 4
section .rodata
; 定义提示信息
prompt1 db "请输入表中的整数,以空格分隔每个数,输入完毕请按回车键: ", 0
prompt1_len equ $-prompt1
prompt2 db "请输入1或0,以选择输出奇数或偶数: ", 0
prompt2_len equ $-prompt2
prompt3 db "排序后的奇数为: ", 0
prompt3_len equ $-prompt3
prompt4 db "排序后的偶数为: ", 0
prompt4_len equ $-prompt4
output_odd_prompt db "\\n奇数个数为: ", 0
output_odd_prompt_len equ $-output_odd_prompt
output_even_prompt db "\\n偶数个数为: ", 0
output_even_prompt_len equ $-output_even_prompt
output_odd_count_prompt db "", 0
output_odd_count_prompt_len equ $-output_odd_count_prompt
output_even_count_prompt db "", 0
output_even_count_prompt_len equ $-output_even_count_prompt