Nisy 发表于 2009-5-10 21:28:15

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

#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
输出:

Nisy 发表于 2009-5-10 21:44:22

视频里边 关于C的部分大家多看两遍 扯淡的部分就略过吧 C部分都是我们好长时间才总结出的东西 你若看一遍肯定不好全弄懂

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

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

我看到有人问的问题 我就特别的失落 所以大家还是再琢磨下视频 多看看 多想想

kelvar 发表于 2009-5-10 21:52:16

两段代码执行后的结果相同。在tc for windows下执行的。但是有一点不是很明白就是关于目的地址(char*)p和(char*)&p。

#include "stdio.h"
main()
{
char *p;
memcpy((char*)p,"Hello,World!",sizeof("Hello,World!"));
puts((char *)p);
}

上面的这段程序很好理解,是典型的memcpy(目的地址,源地址,大小)的用法

#include "stdio.h"
main()
{
char *p;
memcpy((char*)&p,"Hello,World!",sizeof("Hello,World!"));
puts((char *)p);
}

但是上面的这个(char*)&p应该怎么去理解呢?是不是取字符串地址的地址?

unpack 发表于 2009-5-10 22:31:15

不知道这样可不可以通过,为了给后面的发挥机会,先隐藏下不受这个影响,不大会
**** Hidden Message *****
修改了下代码,上面的少了输入奇数的地方补上:
**** Hidden Message *****

[ 本帖最后由 unpack 于 2009-5-11 12:09 编辑 ]

lethesunshine 发表于 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 编辑 ]

ABCdiyPE 发表于 2009-5-10 23:54:39

**** Hidden Message *****

[ 本帖最后由 ABCdiyPE 于 2009-5-11 00:01 编辑 ]

x80x88 发表于 2009-5-11 00:20:34

第1个代码的理解:
seg000:0201   mov   si, 194h       ; char *a="ChinaPYG!"
seg000:0204   mov   , 0;对应int*b=0,b为指针变量,指向地址,注意是int型,两字节
seg000:0209   jmp   short loc_10221
seg000:020B ;--------------------------------------------------------------
seg000:020B
seg000:020B loc_1020B:                              
seg000:020B   mov   al, byte ptr ;(char *)&b+1,前面的(char *)相当于byte ptr
seg000:020E   cbw                              
seg000:020F   mov   bx, ax
seg000:0211   mov   al,     ;*(a + *((char *)&b+2)),a对应si,bx对应*((char *)&b+1,按位取字符
seg000:0213   cbw
seg000:0214   push    ax
seg000:0215   mov   ax, 19Eh
seg000:0218   push    ax            ; format   ;格式化
seg000:0219   call    _printf                  ;输出字符
seg000:021C   pop   cx
seg000:021D   pop   cx
seg000:021E   inc   byte ptr ;(*((char *)&b+1))++,*((char *)&b+1),指向地址中的内容,增1
seg000:0221
seg000:0221 loc_10221:                              
seg000:0221   push    si               
seg000:0222   call    _strlen         ; strlen(a)
seg000:0225   pop   cx
seg000:0226   push    ax            ; ax中为strlen(a)的结果
seg000:0227   mov   al, byte ptr ;也为0,看清楚了前面定义的是int型,这是第2字节
seg000:022A   cbw
seg000:022B   pop   dx            ; dx=ax,为strlen(a)的结果
seg000:022C   cmp   dx, ax          ; 比较是否大于字符串长度,即是否取完字符串
seg000:022E   ja      short loc_1020B ; 没取完接着跳到前面按位输出字符
seg000:0230   mov   ax, 1A1h
seg000:0233   push    ax            ; format
用ida看确实比较清楚,int *b=0这句是定义了一个指向整型的指针变量并赋初值,而这里的(char *)&b+1是int型
第二字节的地址,*((char *)&b+1)就是取第二字节的内容了,所以这里的(char *)很关键
如果我们这样改一下,就会更好理解了
#define H strlen(a)
#include <stdio.h>
#include <string.h>
main()
{
      char *a="ChinaPYG!";
      int*b=0;
      *((char *)&b+1)=3;   注意这句,这样将会从数组的第4个元素开始取,结果为"naPYG!"
      for( ; *((char *)&b+1) < H ; (*((char *)&b+1))++)
      printf("%c",*(a + *((char *)&b+1)));
}
练习题:
**** Hidden Message *****

[ 本帖最后由 x80x88 于 2009-5-11 10:24 编辑 ]

wr123 发表于 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 编辑 ]

junren2ys 发表于 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 编辑 ]

yayazhi 发表于 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;
}


[ 本帖最后由 yayazhi 于 2009-5-11 12:50 编辑 ]
页: [1] 2 3 4 5
查看完整版本: C语言随堂作业一(看过视频后望大家再写一遍并提交代码)