从键盘任意输入n个数(以0结束),统计正负数个数,并分别计算所有正数和负数的平均值的c语言程序

从键盘任意输入n个数(以0结束),统计正负数个数,并分别计算所有正数和负数的平均值的c语言程序,第1张

弄个简单的吧!……

/从键盘任意输入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个数,编写一个程序段检查这些数,正数保持不变,等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10079750.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存