飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 15805|回复: 48

[C/C++] C语言随堂作业一(看过视频后望大家再写一遍并提交代码)

[复制链接]

该用户从未签到

发表于 2009-5-10 21:28:15 | 显示全部楼层 |阅读模式
#define H strlen(a)
main()
{
        char *a="ChinaPYG!";
        int  *b=0;
        for( ; *((char *)&b+1) < H ; (*((char *)&b+1))++)
        printf("%c",*(a + *((char *)&b+1)));
}

用我视频中的思想去理解一下这段代码 同时去领会“变量都一样”的思想 用这种思想去解释这段代码

然后呢 大家输出一个菱形 先输入一个奇数 然后用for循环来输出菱形 比如:

输入:15
输出:
00.GIF
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2009-5-10 21:44:22 | 显示全部楼层
视频里边 关于C的部分大家多看两遍 扯淡的部分就略过吧 C部分都是我们好长时间才总结出的东西 你若看一遍肯定不好全弄懂

你如果不看视频 我讲过的东西 我就不再解释了

如果你还是按你之前的理解 去理解C 那就白学了 我的视频也就白做了

我看到有人问的问题 我就特别的失落 所以大家还是再琢磨下视频 多看看 多想想
PYG19周年生日快乐!

该用户从未签到

发表于 2009-5-10 21:52:16 | 显示全部楼层
两段代码执行后的结果相同。在tc for windows下执行的。但是有一点不是很明白就是关于目的地址(char*)p和(char*)&p。
#include "stdio.h"
main()
{
char *p[8];
memcpy((char*)p,"Hello,World!",sizeof("Hello,World!"));
puts((char *)p);
}

上面的这段程序很好理解,是典型的memcpy(目的地址,源地址,大小)的用法
#include "stdio.h"
main()
{
char *p[8];
memcpy((char*)&p,"Hello,World!",sizeof("Hello,World!"));
puts((char *)p);
}

但是上面的这个(char*)&p应该怎么去理解呢?是不是取字符串地址的地址?
PYG19周年生日快乐!

该用户从未签到

发表于 2009-5-10 22:31:15 | 显示全部楼层
不知道这样可不可以通过,为了给后面的发挥机会,先隐藏下  不受这个影响,不大会
游客,如果您要查看本帖隐藏内容请回复

修改了下代码,上面的少了输入奇数的地方补上:
游客,如果您要查看本帖隐藏内容请回复


[ 本帖最后由 unpack 于 2009-5-11 12:09 编辑 ]
PYG19周年生日快乐!

该用户从未签到

发表于 2009-5-10 23:08:46 | 显示全部楼层
#include "stdio.h"
#include "math.h"
void main()
{
        int i,j,m,n;
        for(i=1;i<=9;i++)
   {
           if(i==1||i==9)
           {
                   printf("    *\n");
                   continue;
           }
           for(j=1;j<=abs(i-5);j++)         
   {
                  printf(" ");
   }
                   printf("*");
                 for(n=0;n<=9-abs(i-5)-abs(i-5)-3;n++)
                   {
                           printf(" ");
                   }
                           printf("*\n");
                   }
}

[ 本帖最后由 lethesunshine 于 2009-5-10 23:09 编辑 ]
PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2017-3-9 21:22
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2009-5-10 23:54:39 | 显示全部楼层
    游客,如果您要查看本帖隐藏内容请回复


    [ 本帖最后由 ABCdiyPE 于 2009-5-11 00:01 编辑 ]
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2018-3-29 07:24
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2009-5-11 00:20:34 | 显示全部楼层
    第1个代码的理解:

    1. seg000:0201   mov     si, 194h       ; char *a="ChinaPYG!"  
    2. seg000:0204   mov     [bp+var_2], 0  ;对应int  *b=0,b为指针变量,指向[bp+var_2]地址,注意是int型,两字节
    3. seg000:0209   jmp     short loc_10221
    4. seg000:020B ;--------------------------------------------------------------
    5. seg000:020B
    6. seg000:020B loc_1020B:                              
    7. seg000:020B   mov     al, byte ptr [bp+var_2+1]  ;(char *)&b+1,前面的(char *)相当于byte ptr
    8. seg000:020E   cbw                                
    9. seg000:020F   mov     bx, ax
    10. seg000:0211   mov     al, [bx+si]    ;*(a + *((char *)&b+2)),a对应si,bx对应*((char *)&b+1,按位取字符
    11. seg000:0213   cbw
    12. seg000:0214   push    ax
    13. seg000:0215   mov     ax, 19Eh
    14. seg000:0218   push    ax              ; format   ;格式化
    15. seg000:0219   call    _printf                    ;输出字符
    16. seg000:021C   pop     cx
    17. seg000:021D   pop     cx
    18. seg000:021E   inc     byte ptr [bp+var_2+1] ;(*((char *)&b+1))++,*((char *)&b+1),指向地址中的内容,增1
    19. seg000:0221
    20. seg000:0221 loc_10221:                              
    21. seg000:0221   push    si               
    22. seg000:0222   call    _strlen         ; strlen(a)
    23. seg000:0225   pop     cx
    24. seg000:0226   push    ax              ; ax中为strlen(a)的结果
    25. seg000:0227   mov     al, byte ptr [bp+var_2+1] ;[bp+var_2+1]也为0,看清楚了前面定义的是int型,这是第2字节
    26. seg000:022A   cbw
    27. seg000:022B   pop     dx              ; dx=ax,为strlen(a)的结果
    28. seg000:022C   cmp     dx, ax          ; 比较是否大于字符串长度,即是否取完字符串
    29. seg000:022E   ja      short loc_1020B ; 没取完接着跳到前面按位输出字符
    30. seg000:0230   mov     ax, 1A1h
    31. seg000:0233   push    ax              ; format
    复制代码
    用ida看确实比较清楚,int *b=0这句是定义了一个指向整型的指针变量并赋初值,而这里的(char *)&b+1是int型
    第二字节的地址,*((char *)&b+1)就是取第二字节的内容了,所以这里的(char *)很关键
    如果我们这样改一下,就会更好理解了

    1. #define H strlen(a)
    2. #include <stdio.h>
    3. #include <string.h>
    4. main()
    5. {
    6.         char *a="ChinaPYG!";
    7.         int  *b=0;
    8.         *((char *)&b+1)=3;   注意这句,这样将会从数组的第4个元素开始取,结果为"naPYG!"
    9.         for( ; *((char *)&b+1) < H ; (*((char *)&b+1))++)
    10.         printf("%c",*(a + *((char *)&b+1)));
    11. }
    复制代码
    练习题:
    游客,如果您要查看本帖隐藏内容请回复


    [ 本帖最后由 x80x88 于 2009-5-11 10:24 编辑 ]
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2025-1-14 12:41
  • 签到天数: 683 天

    [LV.9]以坛为家II

    发表于 2009-5-11 12:32:01 | 显示全部楼层
    main()
    {
            int n,i,j,k;
            printf("Please enter odd number:");
            scanf("%d",&n);
           
            for(i=0;i<=n;i++)
            {
                    for(j=0;j<n-i;j++)        printf(" ");
                    printf("*");
                    for(k=0;k<2*i-1;k++)        printf(" ");
                    if(i!=0)        printf("*");
                    printf("\n");
            }
           
            for(i=n;i>0;i--)
            {
                    for(j=n;j>=i;j--)        printf(" ");
                    printf("*");
                    for(k=2*(i-1)-1;k>0;k--)        printf(" ");
                    if(i!=1)        printf("*");
                    printf("\n");
            }
    }
    这个是我在群里发过的,N大让我用一个For,苦思半天出不来
    main()
    {
        int i,j,n;
        scanf("%d",&n);
        for(j=i=1;i>0;i>=n&&(j=-1),i+=2*j)
          printf("%*c%*s",(n+2-i)>>1,'*',i,"*\n"+(i==1));
    }
    网上找的,看了一个半小时书,终于弄懂了/:L

    [ 本帖最后由 wr123 于 2009-5-12 07:32 编辑 ]
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-5-11 12:38:58 | 显示全部楼层
    main()
    {
    int num,i,j;
    printf("\nPlease input number:\n");
    scanf("%d",&num);
    if num%2==0
       {
        printf("\nERROR!\n");
        return();
       }
    for (i=-((num-1)/2);i<=(num-1)/2,i++)
         {
           for (j=0;j<=num;j++)
               {
                if (abs(7-j)==abs(abs(i)-7))
                    printf("*");
                else
                    printf(" ");
                }
          printf("\n");
         }
    }

    [ 本帖最后由 junren2ys 于 2009-5-11 13:04 编辑 ]
    PYG19周年生日快乐!
  • TA的每日心情

    2017-7-19 15:45
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2009-5-11 12:48:33 | 显示全部楼层
    vc6的代码:
    #include "stdafx.h"
    #include <iostream.h>

    int main(int argc, char* argv[])
    {
            int                i = 0;
            int                j = 0;
            cout << "请输入一个奇数:" << endl;
            cin  >> n;
            for (i = 1; i <= n; i ++ )
            {
                    if (i <= (n + 1) / 2)
                    {
                            for (j = (n + 1) / 2; j >= i; j --)
                            {
                                    cout << " ";
                            }
                            if (i > 1 && i != n)
                            {
                                    cout << "*";
                            }
                    }
                    else
                    {
                            for (j = i ; j >= (n + 1) / 2; j --)
                            {
                                    cout << " ";
                            }
                            if (i > 1 && i != n)
                            {
                                    cout << "*";
                            }
                    }
                    if (i <= (n + 1) / 2)
                    {
                            for (j = 1; j <= 2 * (i -1) - 1; j ++)
                            {
                                    cout << " ";
                            }
                               cout << "*" << endl;       
                    }
                    else
                    {
                            for (j = 1; j <= 2 * (n -i) - 1; j ++)
                            {
                                    cout << " ";
                            }
                               cout << "*" << endl;
                    }
                           
            }
            return 0;
    }
    未命名.JPG (7.72 KB, 下载次数: 1)

    [ 本帖最后由 yayazhi 于 2009-5-11 12:50 编辑 ]
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表