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
输出:
视频里边 关于C的部分大家多看两遍 扯淡的部分就略过吧 C部分都是我们好长时间才总结出的东西 你若看一遍肯定不好全弄懂
你如果不看视频 我讲过的东西 我就不再解释了
如果你还是按你之前的理解 去理解C 那就白学了 我的视频也就白做了
我看到有人问的问题 我就特别的失落 所以大家还是再琢磨下视频 多看看 多想想 两段代码执行后的结果相同。在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应该怎么去理解呢?是不是取字符串地址的地址? 不知道这样可不可以通过,为了给后面的发挥机会,先隐藏下不受这个影响,不大会
**** Hidden Message *****
修改了下代码,上面的少了输入奇数的地方补上:
**** Hidden Message *****
[ 本帖最后由 unpack 于 2009-5-11 12:09 编辑 ] #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 编辑 ] **** Hidden Message *****
[ 本帖最后由 ABCdiyPE 于 2009-5-11 00:01 编辑 ] 第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 编辑 ] 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 编辑 ] 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 编辑 ] 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 编辑 ]