
弄个简单的吧!……
/从键盘任意输入n个数(以0结束),
统计正负数个数,
并分别计算所有正数和负数的平均值的c语言程序/
#include<stdioh>
int main()
{
int n,sz=0,sf=0,pz,pf;//f代表要输入的数,sz,sf,pz,pf分别代表正负数的个数,正数和负数的平均值
int xz=0,xf=0;//正数和负数的和
scanf("%d",&n);
while(n!=0) //输入n个数,以0结束
{
if(n>0)
{
sz++;
xz+=n;
}
else if(n<0)
{
sf++;
xf+=n;
}
scanf("%d",&n);
}
pz=xz/sz;
pf=xf/sf;
printf("正数的个数为%d个\n",sz);
printf("负数的个数为%d个\n",sf);
printf("正数的平均值为%d\n",pz);
printf("负数的平均值为%d\n",pf);
}
public static void test(){
Scanner sc = new Scanner(Systemin);
long num = 0,negative = 0, positive = 0,sum = 0;
List<Long> nums = new ArrayList<Long>();
do{
Systemoutprintln("please enter a number :");
String s = scnextLine();
if (isNumber(s)) {
num = LongparseLong(s);
if(num != 0){
numsadd(num);
continue;
}
break;
}
Systemoutprintln("not number !");
break;
}while(true);
for (Long n : nums) {
if(n > 0){
positive ++;
}else{
negative ++;
}
sum += n;
}
Systemoutprintln("the negative : " + negative);
Systemoutprintln("the positive : " + positive);
Systemoutprintln("the sum : " + sum);
}
public static boolean isNumber(String s){
try {
LongparseLong(s);
return true;
} catch (Exception e) {
return false;
}
}
在 main 函数中调用即可
ORG 0000H
JMP Main
ORG 0030H
Main:
MOV R0,#00H
Loop:
MOV DPTR,#0200H
MOV A, R0
MOVC A,@A+DPTR
CJNE A, #0, No_euual
JMP In_Zero
No_euual:
JC ln_Negative
ln_Positive: ; 正数
;保持不变
JMP ln_RET
ln_Negative: ; 负数
// ;您所要做的事情。
JMP ln_RET
ln_Zero: ; 零
// ;您所要做的事情
JMP ln_RET
ln_RET:
INC R0
MOV A,R0
CJNE A,#100,Loop
END
//好像就是这样吧,应该没有什么问题。
//好久没用汇编了,搞了n久!好多都忘了。
//希望对你有帮助。谢谢
; 输入的五位数字,第一位为符号位,当符号位为0时为正数,否则为负数
; 后四位为参数计算的数字,输出结果同上
assume cs:codesg,ds:datasg,ss:stacksg
datasg segment
input1 db 'Input first number! ','$'
input2 db 'Input second number! ','$'
result db 'result is : ','$'
; 21号中断10号例程,存放输入数据
add1 db 6 ; 缓冲区最大容量
db ; 实际上接收字符的个数,不包括最后的回车
db 6 dup () ; 存放输入的字符,回车结尾
add2 db 6
db
db 6 dup ()
num dw ; 存放中间结果
sign db ; 两个数和的符号位
sum dw 10 dup () ; 两个数的和
datasg ends
stacksg segment
stacksg ends
codesg segment
start: mov ax,datasg
mov ds,ax
lea dx,input1
mov ah,9
int 21h
; 读取第一个加数
mov dx,offset add1
mov ah,10
int 21h
; 取光标位置,ah为行,al为列
mov ah,3
mov bh,0
int 10h
; 设置光标位置
mov ah,2
mov bh,0
inc dh
mov dl,0
int 10h
lea dx,input2
mov ah,9
int 21h
; 读取第二个加数
mov dx,offset add2
mov ah,10
int 21h
; 取光标位置,ah为行,al为列
mov ah,3
mov bh,0
int 10h
; 设置光标位置
mov ah,2
mov bh,0
inc dh
mov dl,0
int 10h
lea bx,add1
mov ax,[bx+1]
mov ah,0
dec ax ; 除去符号位,得到数字个数
push ax ; 压入字符数量
add bx,3
push bx ; 压入字符串首地址
call DeciToBina
lea bx,add1
mov dl,[bx+2] ; 取输入的数字的符号位
cmp dl,'0'
jz posi1
neg ax ; 符号位不为0,则表示负数,所以求补得到负数
posi1:
lea bx,num
mov [bx],ax ; 保存第一个数
lea bx,add2
mov ax,[bx+1]
mov ah,0
dec ax
push ax ; 压入字符数量
add bx,3
push bx ; 压入字符串首地址
call DeciToBina
lea bx,add2
mov dl,[bx+2]
cmp dl,'0'
jz posi2
neg ax
posi2:
lea bx,num
add [bx],ax ; 保存两个数相加的结果
lea dx,result
mov ah,9
int 21h
lea bx,num
mov ax,[bx] ; 取出两个数的和
push ax ; 保存一个备份
; 测试结果的符号位
and ax,1000000000000000b ; 取最高位
neg ax
sbb ax,ax
neg ax ; ax的值是0或1
add ax,30h ; 转为0或1的ascii码
lea bx,sign
mov [bx],al ; 存入符号位
pop ax ; 取出备份
cmp byte ptr [bx],30h ; 测试结果是否为正数
jz posi
neg ax ; 不为正,则求补取绝对值
posi:
push ax ; 压入第二个参数,即待转换的十六进制数的绝对值
lea di,sum
push di ; 压入第一个参数,接收结果的缓冲区
call BinaToDeci
lea dx,sign
mov ah,9
int 21h
mov ax,4c00h
int 21h
;
; 作用:将十六进制数,转为十进制字符,用以输出
; 形式:void BinaToDeci( [buff], int ),从右向左依次压入堆栈
; 参数1:第一个参数 [buff]:接收结果的缓冲区地址
; 参数2:第二个参数int :待转换的十六进制数字
; 返回值:无,直接保存到内存中
;
BinaToDeci proc
push bp
mov bp,sp
push ax
push bx
push cx
push dx
mov cx,0 ; 初始化计数器,记录循环次数,即十进制数的位数
mov ax,[bp+6] ; 取出传入的待转换十六进制数,段内调用只加6,段间调用加8
; 计算出十进制各位数字,并保存到堆栈
bina_next:
xor dx,dx
mov bx,10
div bx
push dx
inc cx
cmp ax,0
jz bina_end
jmp bina_next
bina_end:
mov bx,[bp+4] ; 取出保存十进制数的缓冲区首地址
; 将十进制的各个位数转换成ascii码,并存入指定的内存区域
bina_next2:
pop ax
add ax,30h
mov byte ptr [bx],al
inc bx
loop bina_next2
; 字符串以'$'结尾,用以调用21号中段的9号例程
mov byte ptr [bx],'$'
pop dx
pop cx
pop bx
pop ax
mov sp,bp
pop bp
ret 4
BinaToDeci endp
;
;
; 作用:将十进制字符,转换为十六进制数,用以计算
; 形式:void DeciToBina( [buff], int ),从右向左依次压入堆栈
; 参数1:第一个参数 [buff]:放置十进制数字字符串的缓冲区的首地址
; 参数2:第二个参数int :十进制字符串的字符个数
; 返回值:十六进制的数字
;
DeciToBina proc
push bp
mov bp,sp
push bx
push cx
push dx
push si
mov bx,[bp+4] ; 取放置十进制字符串缓冲区的首地址
mov cx,[bp+6] ; 十进制数字字符串的字符个数
xor ax,ax
; 将ascii码还原为数字,并保存到堆栈
deci_next:
mov al,byte ptr [bx] ; 依次取缓冲区内的字符
sub al,30h
push ax
inc bx
loop deci_next
mov cx,[bp+6] ; 再次获得字符的个数
xor ax,ax
xor dx,dx
mov bx,1 ; 用作乘数
xor si,si
; 各位相乘然后累加获得十六进制数值
; 结果=个位1+十位10+百位100+千位1000
deci_next1:
pop ax ; 取出数字
mul bx ; 相乘
add si,ax ; 累加结果
; 计算下次相乘时的乘数
mov ax,bx
mov bx,10
mul bx
mov bx,ax
loop deci_next1
; 将结果存入ax,为返回值
mov ax,si
pop si
pop dx
pop cx
pop bx
mov sp,bp
pop bp
ret 4
DeciToBina endp
;
codesg ends
end start
=====================================================
masm5测试通过
file1cpp
extern double pow(double x, int n)
{
double result = 10;
bool negative = false;
if (n < 0)
negative = true;
while(n)
{
if(n & 1)
{
result = x;
}
x = x;
n = n / 2;
}
return negative (10 / result) : result;
}
file2cpp
#include <iostream>
using namespace std;
extern double pow(double x, int n);
void main()
{
double a = 0;
int b = 1, m = 0;
cin >> a >> m;
cout << "a b = " << a b << endl;
cout << "a ^ m = " << pow(a, m) <<endl;
}
以上就是关于从键盘任意输入n个数(以0结束),统计正负数个数,并分别计算所有正数和负数的平均值的c语言程序全部的内容,包括:从键盘任意输入n个数(以0结束),统计正负数个数,并分别计算所有正数和负数的平均值的c语言程序、编写java程序,输入个数不定的整数,输入0时结束。统计这些整数中正数和负数的个数,并计算它们的总和。、汇编语言:若从0200H单元开始存有100个数,编写一个程序段检查这些数,正数保持不变,等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)