C语言最后一次上级

本文探讨了四段程序:字符串对称性检测函数、求三个数中最大值的算法、字符串复制函数,以及一个CPRSTR函数实现字符串复制。通过实例演示和结果分析,展示了这些技术在实际编程中的应用。
  1. 分析下列程序的运行结果,并上机验证

main 

{

int  i,  j,  *pi,  *pj;

pi=&i;   pj=&j;                                                  

i=5;   j=7;   

printf( "%d\t%d\t%d\t%d", i, j, pi, pj );          

printf( "\n%d\t%d\t%d\t%d\n", &i, *&i, &j, *&j );

}

运行结果:5       7       1703724 1703720

                  1703724 5        1703720 7

main()                                                                                

{  int  a[ ]={ 1, 2, 3 };                                                         

   int  *p,  i;                                                                

   p=a;                                                                             

   for  ( i=0; i<3; i++ )                                                                                         

    printf( "%d  %d  %d  %d\n", a[i], p[i], *(p+i), *(a+i) );

}

      运行结果:1 1 1 1

                        2 2 2 2

                        3 3 3 3

main()

{  int  a[ ]={ 2, 5, 3, 6, 8 };                                          

   int  *p, i=1, s=0;                                                                                          

   for  ( p=a;  p<a+5; p++ )                                

    {  i*=*p;  s+=*p; }

   printf( "%d    %d\n", i, s);

}

运行结果:1440    24

              

int  ff( char  *x )                                          

{  char  *p=x,  *q;                                                                    

int   i, k=1;                                    

      q = p+strlen(x)-1;

  for ( i=1; i<=strlen(x)/2; i++)                                                           

if  (*p==*q)   { p++;  q--; }                      

        else  { k=0;  break;  }

      return  k;

}

main()                                                          

{ char  a[80];                                                                                                            

  gets(a);

  if  ( ff (a)==1 )    printf( "*****\n");   

 else  printf("%%%\n");

}

若从键盘输入:asdfghgfdsa

则输出结果为:*****

若从键盘输入:aweftfew

则输出结果为:%

用户自定义函数的功能是:检测一个字符串左右是否对称,若对称输出“*****”,若不对称输出“%”。

  1. 以下是求三个数中的最大数的程序,试完整程序。

void  cut( int  *p,  int  *q)

{  int  t;

  t=*p;    *p=*q    ;  *q=t;  }

main()

{  int  a, b, c;

scanf( "%d%d%d", &a, &b, &c );

if  ( a<b )           cut(&a,&b);  

if  ( a<c )               cut(&a,&c);  

printf( "%d\n",       a       );

}

3、以下是将字符串复制到另一个字符串中的源程序,其中函数cprstr的形参为两个字符指针变量,其中,pm指向原字符串,pn指向目标字符串,试完整源程序。

#include  "stdio.h"

void  cpystr( char *pm,  char *pn)

{

  while  ( ( *pn=*pm )!='\0' )

   {      pn++       ;

         pm++       ;

}

}

main( )

{  char  *pa="BEIJING CHINA",  b[20], *pb;

   pb=b;

   cpystr (    pa,pb    );

   printf( "string_a=%s\nstring_b=%s\n",  pa, pb );

}

### C语言中的16进制位操作 在C语言中,处理16进制数据并执行位操作是非常常见的需求。通过使用特定的操作符和函数可以轻松完成这些任务。 #### 使用`printf`输出16进制数值 为了将一个整数以大写的16进制格式打印出来,可以在`printf`函数里指定格式说明符`%X`[^2]: ```c #include <stdio.h> int main(void){ unsigned int num = 255; printf("Hexadecimal uppercase output: %X\n", num); } ``` 这段程序会把变量`num`里的值按照无符号整形对待,并将其转换成大写形式的十六进制字符串输出到控制台。 #### 实现统计16位二进制数中'1'的数量并以16进制显示结果的功能 下面是一个完整的例子来展示如何编写一段COM文件格式下的汇编兼容代码片段用于计算给定16位寄存器内的二进制表示中有多少个‘1’,最后将以16进制的形式呈现该数量: ```assembly .code segment assume cs:.code org 100h main proc near start: mov ax, 0FEDCh ; 假设这是要分析的目标16位数 xor cx, cx ; 清零计数器CX count_loop: test ax, 1 ; 测试最低位是否为1 jz skip_inc ; 如果不是,则跳过增加计数的动作 inc cx ; 否则就让计数加一 skip_inc: shr ax, 1 ; 右移AX一位以便下一轮循环继续检测新的低位 jnz count_loop ; 若还有未处理过的位,则重复上述过程直到全部遍历完毕 push cx ; 将最终得到的一位总数压入堆栈准备调用DOS中断服务打印它 call print_hex ; 调用自定义子程序负责实际输出工作 exit_program: ret ; 返回操作系统结束此程序运行 print_hex proc near pop dx ; 获取待打印的数据项DX add dl,'0' ; ASCII编码调整偏移量使得可以直接作为字符输出 cmp dl,'9' jbe direct_print; 对于小于等于9的情况直接按ASCII表对应关系映射即可 sub dl,('A'-':') ; 大于9的部分需要额外加上'A'-'0'-10才能获得正确的字母位置 direct_print: mov ah,0Eh ; BIOS视频服务号设置为0E即意味着我们要做的是屏幕回显功能 int 10h ; 执行BIOS中断请求命令触发硬件响应从而真正显示出字符 retn ; 子程序返回上级调用处 print_hex endp main endp ends .code end start ``` 以上代码实现了对输入的一个16位立即数(`mov ax, 0FEDCh`)进行逐位扫描,每当遇到一个'1'就会使计数器(cx)递增一次;当整个字都被解析完成后便利用简单的算法将这个计数值转化为对应的ASCII码并通过BIOS中断机制发送至显示器上形成可见的文字表达——这里特别注意到了对于大于9的情形要做特殊处理以确保能正确反映出'a'~'f'(或'A'~'F')这样的英文字母而不是非法字符[^1]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值