c语言程序分析怎么写,简单c语言程序例子
大家好,感谢邀请,今天来为大家分享一下c语言程序分析怎么写的问题,以及和简单c语言程序例子的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!
一个C语言程序求分析
分析一:这个程序的输入是变量"_",因为标准C中是允许下划线开头的变量的,仅有下划线也满足变量命名的要求;
分析二:双下划线"__"这里不能理解为变量,我猜测"__TIME__"是C语言中的一个宏定义,是一个整体;
分析三:断句。仔细从“乱码”中能一眼看出两个关键字"main"和"putchar"。main函数里面居然还有main?!对,没错,这是一个递归函数。
把在分号后面添加回车,假如适量缩进,并把"_"用"argc"代替。程序的主要结构大致如下:
main(argc)
{
argc^448&&main(-~argc);
putchar(
--argc%64?32|-~7[__TIME__-argc/8%8][">'txiZ^(~z?"-48]>>";;;====~$::199"[argc*2&8|argc/64]/(argc&2?1:8)%8&1:10
);
}
分析四:如何实现的递归?没有返回值,没有if-else语句,怎么能递归,这貌似是不太可能的事,但是仔细分析一下第一句,即"_^448&&main(-~_);"
这是一个"condition1&&condition2"条件运算语句,如果condition1和condition2同为真(true),则该语句为真(true),否则,只要有一个condition为假(false),则该语句为假。C语言为了提高效率,如果condition1为假,程序是不会再去运算condition2的,很明显,在condition1==0时无论condition2是真是假,结果都是假。所以当"argc^448"的值为0时,递归结束。
递归就实现了。
分析五:putchar(*&^%$##$^^&***&^%&)。
putchar()函数不用多讲,是最简单的函数了,其作用就是输出一个ascii码对应的字符,例如要输出"a",只需写putchar('a');即可。所以可以推测putchar两个小括号之间应该是某个字符对应的ascii码。
根据C语言运算符的优先级结合性再对代码进行断句:
main(argc)
{
argc^448&&main(-~argc);
putchar(
--argc%64
?
(32|-~7[__TIME__-argc/8%8][">'txiZ^(~z?"-48]>>";;;====~$::199"[argc*2&8|argc/64]/(argc&2?1:8)%8&1)
:
10
);
}
我特意把"condition?value1:value2"这个三目运算符写的非常明显,楼主可看懂?
其实这个三目运算符就是相当与一个if-else语句,这条putchar()语句和下面的是等效的:
if(--argc%64)
putchar(32|-~7[__TIME__-argc/8%8][">'txiZ^(~z?"-48]>>";;;====~$::199"[argc*2&8|argc/64]/(argc&2?1:8)%8&1);
else
putchar(10);
如果楼主不信,可以将刚刚的代码替换原来的putchar一句,你会发现结果是一致的。
分析六:到此时,最复杂的东西就是第一个putchar的内容。其实根据运算符的优先级和结合性来分析的话,第一个putchar里的内容有下面几块:
32|-~
7[__TIME__-argc/8%8][">'txiZ^(~z?"-48]
>>
";;;====~$::199"[argc*2&8|argc/64]/(argc&2?1:8)%8
&
1
咋一看,有几个中括号若隐若现,于是想到了数组,但是却没发现有数组名,难道是错觉吗?!
如果楼主对数组与指针非常熟悉的话就应该知道,其实数组名就是一个地址,而地址就是一个特定含义的数字罢了。
所以"7"是一个地址;
";;;====~$::199"也是一个地址
第一个地址非常好理解,就是第7号地址
第二个其实也非常直观,就是字符串";;;====~$::199"在内存中的地址。你可以定义一个全局变量如下:
char*str=";;;====~$::199";
然后再代码中用str代替";;;====~$::199",结果是一致的。
现在将这两个地址的“带入原来的putchar语句中(怎么有点解方程的意思……)得:
32
|
-~7[A][B]>>str[C]/D%8
&
1
其中
A=__TIME__-argc/8%8
B=">'txiZ^(~z?"-48
C=argc*2&8|argc/64
D=argc&2?1:8
=================================================
好,分析先告一段落,我们来吧代码重新整理一下
#defineA(__TIME__-argc/8%8)
#defineB(">'txiZ^(~z?"-48)
#defineC(argc*2&8|argc/64)
#defineD(argc&2?1:8)
char*str=";;;====~$::199";
main(argc)
{
if(argc^448)
main(-~argc);
if(--argc%64)
{
putchar(32|-~(7[A][B])>>str[C]/D%8&1);
}
else
putchar(10);
}
怎么样,是不是看起来规范了一点呢^_^,最重要的是运行结果和之前的完全匹配
=================================================
结论:
我觉得我已经把代码整理得够清晰的了,至于"__TIME__"是什么?第7号地址是什么?以及宏定义B中的">'txiZ^(~z?"有何特殊意义楼主还是自己去查查资料吧,相信弄懂后你会对C语言的具体实现过程有非常深刻的了解的。
有疑问百度hi给我留言,虽然我不能保证及时答复,但只要是我知道的我一定会回答的
如果楼主喜欢这种怪异的C代码,我推荐下面几个例子,包爽!
最后,这个程序输出的是该可执行文件的修改时间。对于这个程序的设计者,我表示深深地膜拜!!
C语言程序设计实验报告怎么写啊
只是个例子,不可照抄。
实验内容与要求:
[实验内容]
1、通过本试验初步培养计算机逻辑解题能力。熟练掌握赋值语句和if语句的应用;掌握switch多路分支语句和if嵌套语句的使用
2、将前期所学习到的基本数据类型、运算符和表达式等程序设计基础知识运用于具体的程序设计。
3、进一步熟练掌握输入输出函数scanf, printf和getchar的使用,熟悉math.h中常用数学函数的使用方法
4、掌握循环语句的应用方法。
5、了解随机数生成函数。
[实验要求]
在规定期限独立完成实验内容
1、提交实验报告(电子版)
2、提交相应源程序文件(文件名 EX6_x姓名.c,如EX6_1彭健.c)
3、要求从简单到复杂,后面的要求均在前面的基础上进行修改,前六题,每题均需要保留各自的程序,六题以后,每题均在前一题基础上修改,保留最后一个程序即可(如做到第九题,则保留EX6_9姓名.c,做到第11题,则保留ex6_11姓名.c)
二、实验原理和设计方案:
1、函数头的选则,while循环语句,switch(case)语句,条件表达式,if else条件语句,自增运算符,设置复杂变量,输出随机操作数。
2、变量要有分数变量和等级变量,要有选择算法题数的变量和计算正确与否的变量,要有随机输出的两个操作数变量和自己按运算符号输入结果的变量,最后还有判断是否要进行的变量字符。中间结果有选择运算符的switch()和分数等级的switch()和错题对题的自增和选择运算符计算的自增。
3、问题的分析方法:先考虑设置整形变量和字符变量,考虑到要不断循环计算,选择用while语句来循环。在循环体中,将前面的输出提示运算符,和自行选择运算符、答案及输出随机操作数完成。再用switch语句对选择的运算符进行判断,并用变量进行自增运算,计算出错题于对题个数和选择了那种运算符号。在循环体最后用if else语句来判断是否继续执行还是跳出循环。最后根据自增计算的结果和公式进行分数计算,并用switch语句来是想等级的制定。
三、源代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void main()
{
..........
}
四、试验结果和启发
因为输入y要继续循环,所以选择用while语句。在while语句中要结合前面的按提示计算,并嵌套switch语句并用条件表达式,来计算结果正确与否,计算的题型是什么。最后再用switch语句来完成分数等级的判断。
五、实验体会:
描述自己在编程或程序编译运行中遇到的难点和问题及解决的办法。
求C语言编译原理语法分析程序
#include<iostream>
using namespace std;
#define m 45
#define n 100
#define t 10
int main()
{
FILE*fp;
char filename[20],c[n];
printf("Type the file name which you want to open:");
scanf("%s",&filename);
fp=fopen(filename,"r+");/*以r-只读方式打开指定文件*/
if((fp=fopen(filename,"r"))==NULL)/*文件不存在输出错误*/
{cout<<"文件不存在!"<<endl;exit(-1);}
cout<<"文件中内容如下:"<<endl;
for(int j=0;!feof(fp);j++){
c[j]=fgetc(fp);//从流中读取字符
}
char keyword[m][t]={"include","int","string","cout","cin","auto","break","case","char","class","const",
"continue","default","delete","do","double","else","enum","extern","float","for","friend","if","inline",
"int","long","new","operator","private","protected","public","register","return","short","sizeof","static",
"struct","switch","template","this","typedef","union","virtual","void","while"};//关键字数组
char a[t],*p=c,*q=a,*s=a;
bool w=0,r=0;
int i=0;
for(i=0;i<10;i++)a[i]=NULL;//初始化临时数组
while(*p!=NULL){
q=s=a;
if((*p>='a'&&*p<='z')||(*p>='A'&&*p<='Z')||*p=='_'){//识别标识符
*q=*p;p++;q++;
while((*p>='a'&&*p<='z')||(*p>='A'&&*p<='Z')||(*p>='0'&&*p<='9')||*p=='_'){
*q=*p;p++;q++;
}
for(i=0;i<m;i++)if(strcmp(keyword[i],a)==0){r=1;break;}
if(r==1){cout<<"关键字为:";r=0;}
else cout<<"标识符为:";
while(s!=q){
cout<<*s;
s++;
}
cout<<endl;
for(i=0;i<t;i++)a[i]=NULL;
}
else if(*p=='\''){//识别字符常量
p++;
while(*p!='\''){
*q=*p;
p++;
q++;
}
cout<<"字符常量为:";
while(s!=q){
cout<<*s;
s++;
}
cout<<endl;
for(i=0;i<t;i++)a[i]=NULL;
p++;
}
else if(*p=='\"'){//识别字符串常量
p++;
while(*p!='\"'){
*q=*p;
p++;
q++;
}
cout<<"字符串常量为:";
while(s!=q){
cout<<*s;
s++;
}
cout<<endl;
for(i=0;i<t;i++)a[i]=NULL;
p++;
}
else if(*p=='+'||*p=='-'||*p=='*'||*p=='/'||*p=='='||*p=='%'||*p=='/'){//识别运算符
cout<<"运算符为:"<<*p;
cout<<endl;
p++;
}
else if(*p==';'||*p==','){//识别分解符
cout<<"分界符为:"<<*p;
cout<<endl;
p++;
}
else if(*p>='0'&&*p<='9'){
s=q=a;
*q=*p;p++;q++;
while(*p>='0'&&*p<='9'||*p=='.'){
*q=*p;p++;q++;
}
while(s!=q){
if(*s=='.'){w=1;break;}//识别实型常量
s++;
}
s=a;
if(w==1){
cout<<"实型常量为:";
while(s!=q){
cout<<*s;
s++;
}
for(i=0;i<t;i++)a[i]=NULL;
}
else{
cout<<"整型常量为:";
while(s!=q){//识别整型常量
cout<<*s;
s++;
}
for(i=0;i<t;i++)a[i]=NULL;
}
cout<<endl;
}
else p++;
}
return 0;
}
文章分享结束,c语言程序分析怎么写和简单c语言程序例子的答案你都知道了吗?欢迎再次光临本站哦!