c语言的难题
㈠ c语言的难点
c学起来也不是很难,主要是指针和其他的知识点入数组、函数等组合起来难理解一些
要想学习,主要有几点需要注意
一、记忆部分
1、保留字,如if,int,for等
2、常规的结构,如条件,循环,switch、数组的结构,指针定义,结构体的定义等
3、语法的构成,如printf,scanf等一些语句的构成
4、一些系统带的函数,常用的要记住,如strlen,printf等
5、一些经典的算法,如素数的计算,排序的写法等
二、算法,语法等
这个就是解决问题的方法,没有好的捷径,只要慢慢的积累,数学方面的算法要加深
其实,c基础也就是那么一些基础点
1、保留字
2、定义变量等,int,float等
3、条件语句if,选择语句switch,循环,do--while、for、while、goto
4、注意逗号语句,scanf和printf要熟练,知道格式(这个很基础,用错了很麻烦)
5、数组,这里注意二维数组和字符串的一些函数
6、指针,这个是难点,也就是说很难理解,特别是和数组函数结构体等结合使用的时候
7、结构体共用体,这个不难,就是繁琐而已。这里涉及到链表,其实不难理解,可以想象成一串珠子,next指针就是串珠子的线,结构体就是珠子
8、文件操作,这个就是套用格式,没难度
9、宏定义,这个没难度,就是最简单的直接替换。注意一点就是在定义宏的时候多用几个括号增加优先级没坏处
10、函数。这个难度不大,主要是要理解,参数是在调用的时候另外开辟内存空间。除了数组和用&定义的参数。要不然子函数改变了参数变量,调用它的地方的变量时不会改变的
其实就是这些基本的知识点
㈡ C语言难题 高手求解2
#include<stdio.h>
#include<string.h>
typedef struct{ long id;char name[10];char sex[2];}PS;
int del(PS *p1, int m, PS *p2,int n)
{
int i,k,j;
for(i=0;i<m;i++)
{
for(k=0;k<n;k++)
if(p1[i].id==p2[k].id)
{
for(j=i;j<m;j++)
{
p1[j]=p1[j+1];
i--;
}
m--;
break;
}
}
return m;
}
int merge(PS *p1,int m, PS *p2 ,int n)
{
int i,j,k,q;
PS temp;
for(i=n,j=0;i<m+n;i++,j++)
p2[i]=p1[j];
for(k=0;k<m+n;k++)
{
for(q=0;q<m+n-k-1;q++)
if(p2[q].id>p2[q+1].id)
{
temp=p2[q+1];
p2[q+1]=p2[q];
p2[q]=temp;
}
}
return m+n;
}
void sort(PS *p,int n)
{
PS temp;
int i,j=0,k;
for(i=0;i<n;i++)
if(p[i].sex[0]=='f')
{
temp=p[i];
p[i]=p[j];
p[j]=temp;
j++;
}
for(i=0;i<j;i++)
{
for(k=i+1;k<j;k++)
{
if(strcmp(p[i].name,p[k].name)>0)
{
temp=p[i];
p[i]=p[k];
p[k]=temp;
}
}
}
for(i=j;i<n;i++)
{
for(k=i;k<n;k++)
{
if(strcmp(p[i].name,p[k].name))
{
temp=p[i];
p[i]=p[k];
p[k]=temp;
}
}
}
}
void display(PS *p,int n)
{
int i;
printf("ID NAME SEX\n");
for(i=0;i<n;i++)
printf("%d %s %s\n",p[i].id,&p[i].name,&p[i].sex);
}
int main()
{
PS a[10]={{101, "tom","m"},{103,"mary","f"},{104,"mark","m"},{105,"julia","f"},{106, "sara","f"}};
PS b[10]={{102, "mark","m"},{104,"mark","m"}};
printf("a:\n");
display(a,5);
printf("b:\n");
display(b,2);
int m=del(a,5,b,2);
printf("a:\n");
display(a,m);
int n=merge(a,m,b,2);
printf("b:\n");
display(b,n);
sort(a,m);
printf("a:\n");
display(a,m);
}
㈢ C语言难题
第一题B和C,C表示ASCII表上的八进制值为034的字符。A中八进制没有9,最后D是双引号的空字符串。不是字符。有图为证
C的表示方式稍微有点错误,八进制前面要加0。但是既然编译器默认了
第二题:C选项被识别为八进制,因为表示方法为8进制。但是2字节的存储空间最大能存储有符号数为32767,但是B前面并没有+号强调一定是带符号int。无符号数的表示范围为0-65535.
第3题,A,这个很简单,A选项没有转义符。
我可以合法合理地告诉你,这种题只有中国和日本才会出,总之最终答案的解释权都在出题人手里,如果你不是考试的话,这种题有多远扔多远,实在恶心又没有任何用处。
㈣ C语言编程难题
#include<stdio.h>
int main()
{
int M=1, N,i;
scanf("%d", &N);
for (i = N; i > 1; i--)
M = 2 * (M + 1);
printf("%d ", M);
return 0;
}
㈤ 有关c语言难题
楼上似乎太简略了一点喔···
#include
<stdio.h>
void
main()
{
int
year;
printf
("请输入一个年份:
");
scanf
("%d",&year);
if
(
year
%4
==
0
&&
year
%
100
!=
0
||
year
%
400
==
0
)
printf
("%d是闰年\n",year);
else
printf
("%d不是闰年\n",year);
}
㈥ C语言难题
typedef struct stu{
char * name,gender;
int score;
}STU;
void f(char *p)
{
//p=(char *)malloc(10);
strcpy(p,"Qian");
}
int main(void)
{
STU a={NULL,'m',290},b;
a.name=(char *)malloc(10);
strcpy(a.name,"Zhao");
b = a;
f(b.name);
b.gender ='f';
b.score =350;
printf("%s,%c,%d
\n",a.name,a.gender,a.score);
printf("%s,%c,%d
\n",b.name,b.gender,b.score);
return 0;
}
为啥注释掉了以后的答案变成:Qian,m,290,Qian,f,
350,?
而不注释掉答案却是: Zhao,m,290,Zhao
,f,350?
你的目的是通过函数去修改另外一个结构体对象b中成员name
的值。
观察到成员中的gender和score基本上没有什么值得研究 ,
所以只研究第一个成员name。
在你执行了代码b=a的时候,b和a分别在内存条上占用
sizeof(stu)的空间大小。而且,这两个空间中的值都是一
模一样的。
当你执行了函数f()的时候,分两种情况。
第一没有注释:函数f会在栈上分配4个字节的内存(sizeof
(char*),因为p的类型就是char*)。那么p的值就是等于
b.name。
b.name的值我们假设是0x1234567,那么现在p的值也就是
0x1234567。没有注释的情况下,p的值马上被修改成malloc
的返回值,所以现在p的值一定不是0x1234567。
假如malloc的返回值是0x7654321,那么现在p的值也就是
0x7654321。你使用了strcpy,那么0x7654321首地址开始的
内容就变成了zhao。
所以,你没有改变0x1234567所指向的内容。结果就是
0x1234567指向的内容还是为zhao。
第二有注释:函数f会在栈上分配4个字节的内存(sizeof
(char*),因为p的类型就是char*)。那么p的值就是等于
b.name。
b.name的值我们假设是0x1234567,那么现在p的值也就是
0x1234567。有注释的时候。p的值没有被malloc改变,还是
0x1234567.你使用了strcpy,就修改了0x1234567所指向的
内存。
最开始的内存中值是zhao,你修改后就变成了qian.
你的这个例子错误很多,但是基于你是实验的目的,我就不指
正了。针对不注释的情况,如果你要改变的话,我认为比较正
确的做法应该是这样的。
typedef struct stu{
char * name,gender;
int score;
}STU;
void f(char **p)
{
*p=(char *)malloc(10);
strcpy(*p,"Qian");
}
int main(void)
{
STU a={NULL,'m',290},b;
a.name=(char *)malloc(10);
strcpy(a.name,"Zhao");
b = a;
f(&b.name);
free(a.name);
a.name=NULL:
return 0;
}
㈦ 你知道哪些学习C语言过程中的难点
实际学习c语言最大难点是c语言之外的东西,大家都说指针难懂,但如果您非常熟悉某一种汇编,熟悉微机原理,甚至了解编译原理过程,有操作系统的知识,了解最终目标代码中heap,stack等,指针就是一个so easy的事,同理关于struct也是。我们上学早,那时没有c,只有pascal,印象关于文件那章我就学的云里雾里,最终只是应付考试的水准。后来工作,接触多了,重新学习了操作系统,甚至是汇编,发现实际这个问题和操作系统有很大关系。c/c++也是这期间自学的,根本没看过什么谭浩强的书,通过反汇编看c/c++代码,了解其实际实现机制,突然发现所谓c++的虚函数,纯虚函数如此简单,甚至了解了gcc和vc的差异。后来是看官方库(那时还是bc),读linux内核,重读编译原理发现实际c/c++真的非常好学:因为他们最接近底层,如果您这些知识扎实,才发现c是最直接的。之所以,c难学并非语法本身,而是相关知识不足。
㈧ C语言的难题
0分,果然是难题
㈨ c语言问题
您好,c语言经典100题:
【程序1】
题目:有1,2,3,4个数字,能组成多少个互不相同且无重复数字的三位数 都是多少
1.程序分析:可填在百位,十位,个位的数字都是1,2,3,4.组成所有的排列后再去
掉不满足条件的排列.
2.程序源代码:
main()
{
int i,j,k;
printf("\n");
for(i1;i<5;i++) /*以下为三重循环*/
for(j1;j<5;j++)
for (k1;k<5;k++)
{
if (i!k&&i!j&&j!k) /*确保i,j,k三位互不相同*/
printf("%d,%d,%d\n",i,j,k);
}
}
【程序2】
题目:企业发放的奖金根据利润提成.利润(i)低于或等于10万元时,奖金可提10%;利润高
于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提
成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于
40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于
100万元时,超过100万元的部分按1%提成,从键盘输入当月利润i,求应发放奖金总数
1.程序分析:请利用数轴来分界,定位.注意定义时需把奖金定义成长整型.
2.程序源代码:
main()
{
long int i;
int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;
scanf("%ld",&i);
bonus1100000*0.1;bonus2bonus1+100000*0.75;
bonus4bonus2+200000*0.5;
bonus6bonus4+200000*0.3;
bonus10bonus6+400000*0.15;
if(i<100000)
bonusi*0.1;
else if(i<200000)
bonusbonus1+(i-100000)*0.075;
else if(i<400000)
bonusbonus2+(i-200000)*0.05;
else if(i<600000)
bonusbonus4+(i-400000)*0.03;
else if(i<1000000)
bonusbonus6+(i-600000)*0.015;
else
bonusbonus10+(i-1000000)*0.01;
printf("bonus%d",bonus);
}
【程序3】
题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少
1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后
的结果满足如下条件,即是结果.请看具体分析:
2.程序源代码:
#include "math.h"
main()
{
long int i,x,y,z;
for (i1;i2)/*如果是闰年且月份大于2,总天数应该加一天*/
sum++;
printf("it is the %dth day.",sum);}
【程序4】
题目:输入某年某月某日,判断这一天是这一年的第几天?
1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊
情况,闰年且输入月份大于3时需考虑多加一天。
2.程序源代码:
main()
{
int day,month,year,sum,leap;
printf("\nplease input year,month,day\n");
scanf("%d,%d,%d",&year,&month,&day);
switch(month)/*先计算某月以前月份的总天数*/
{
case 1:sum0;break;
case 2:sum31;break;
case 3:sum59;break;
case 4:sum90;break;
case 5:sum120;break;
case 6:sum151;break;
case 7:sum181;break;
case 8:sum212;break;
case 9:sum243;break;
case 10:sum273;break;
case 11:sum304;break;
case 12:sum334;break;
default:printf("data error");break;
}
sumsum+day; /*再加上某天的天数*/
if(year%4000||(year%40&&year%100!0))/*判断是不是闰年*/
leap1;
else
leap0;
if(leap1&&month>2)/*如果是闰年且月份大于2,总天数应该加一天*/
sum++;
printf("It is the %dth day.",sum);}
【程序5】
题目:输入三个整数x,y,z,请把这三个数由小到大输出.
1.程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,
然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小.
2.程序源代码:
main()
{
int x,y,z,t;
scanf("%d%d%d",&x,&y,&z);
if (x>y)
{tx;xy;yt;} /*交换x,y的值*/
if(x>z)
{tz;zx;xt;}/*交换x,z的值*/
if(y>z)
{ty;yz;zt;}/*交换z,y的值*/
printf("small to big: %d %d %d\n",x,y,z);
}
【程序6】
题目:用*号输出字母c的图案.
1.程序分析:可先用'*'号在纸上写出字母c,再分行输出.
2.程序源代码:
#include "stdio.h"
main()
{
printf("hello c-world!\n");
printf(" ****\n");
printf(" *\n");
printf(" * \n");
printf(" ****\n");
}
【程序7】
题目:输出特殊图案,请在c环境中运行,看一看,very beautiful!
1.程序分析:字符共有256个.不同字符,图形不一样.
2.程序源代码:
#include "stdio.h"
main()
{
char a176,b219;
printf("%c%c%c%c%c\n",b,a,a,a,b);
printf("%c%c%c%c%c\n",a,b,a,b,a);
printf("%c%c%c%c%c\n",a,a,b,a,a);
printf("%c%c%c%c%c\n",a,b,a,b,a);
printf("%c%c%c%c%c\n",b,a,a,a,b);}
【程序8】
题目:输出9*9口诀.
1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列.
2.程序源代码:
#include "stdio.h"
main()
{
int i,j,result;
printf("\n");
for (i1;i<10;i++)
{ for(j1;j<10;j++)
{
resulti*j;
printf("%d*%d%-3d",i,j,result);/*-3d表示左对齐,占3位*/
}
printf("\n");/*每一行后换行*/
}
}
【程序9】
题目:要求输出国际象棋棋盘.
1.程序分析:用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格,还是白方格.
2.程序源代码:
#include "stdio.h"
main()
{
int i,j;
for(i0;i<8;i++)
{
for(j0;j<8;j++)
if((i+j)%20)
printf("%c%c",219,219);
else
printf(" ");
printf("\n");
}
}
【程序10】
题目:打印楼梯,同时在楼梯上方打印两个笑脸.
1.程序分析:用i控制行,j来控制列,j根据i的变化来控制输出黑方格的个数.
2.程序源代码:
#include "stdio.h"
main()
{
int i,j;
printf("\1\1\n");/*输出两个笑脸*/
for(i1;i<11;i++)
{
for(j1;j<i;j++)
printf("%c%c",219,219);
printf("\n");
}
}
【程序11】
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月
后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少
1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....
2.程序源代码:
main()
{
long f1,f2;
int i;
f1f21;
for(i1;i<20;i++)
{ printf("%12ld %12ld",f1,f2);
if(i%20) printf("\n");/*控制输出,每行四个*/
f1f1+f2; /*前两个月加起来赋值给第三个月*/
f2f1+f2; /*前两个月加起来赋值给第三个月*/
}
}
【程序12】
题目:判断101-200之间有多少个素数,并输出所有素数.
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,
则表明此数不是素数,反之是素数.
2.程序源代码:
#include "math.h"
main()
{
int m,i,k,h0,leap1;
printf("\n");
for(m101;m<200;m++)
{ ksqrt(m+1);
for(i2;i<k;i++)
if(m%i0)
{leap0;break;}
if(leap) {printf("%-4d",m);h++;
if(h%100)
printf("\n");
}
leap1;
}
printf("\nthe total is %d",h);
}
㈩ C语言难题 高手求解
#include<stdio.h>
#include<stdlib.h>
structdata_array{
longnum;
intscore;
};
typedefstructstudent{
longnum;
intscore;
structstudent*next;
}NODE;
NODE*create(structdata_array*array,intn)
{
inti;
NODE*head=NULL,*phead,**preNext;
for(i=0;i<n;i++){
NODE*node=(NODE*)malloc(sizeof(NODE));
if(!node){
continue;
}
node->num=array[i].num;node->score=array[i].score;node->next=NULL;
for(phead=head,preNext=&head;
phead&&phead->num<array[i].num;
preNext=&phead->next,phead=phead->next);
*preNext=node;
node->next=phead;
}
returnhead;
}
voiddisplay(NODE*head)
{
while(head){
printf("%d%d ",head->num,head->score);
head=head->next;
}
}
void_list(NODE*head1,NODE**head2)
{
NODE*node=NULL,**preNext=head2;
while(head1){
node=(NODE*)malloc(sizeof(NODE));
if(node){
*preNext=node;
node->num=head1->num;node->score=head1->score;node->next=NULL;
preNext=&node->next;
}
head1=head1->next;
}
}
NODE*merge(NODE*head1,NODE*head2)
{
NODE*node1,**preNext1,*pnode2;
while(head2){
for(node1=head1,preNext1=&head1;
node1&&node1->num<head2->num;
preNext1=&node1->next,node1=node1->next);
pnode2=head2->next;
if(node1&&node1->num==head2->num){
node1->score=head2->score>node1->score?head2->score:node1->score;
head2=head2->next;
continue;
}
*preNext1=head2;
head2->next=node1;
head2=pnode2;
}
returnhead1;
}
NODE*del(NODE*head1,NODE*head2)
{
NODE*node1,*node2,**preNext;
for(node2=head2;node2;node2=node2->next){
for(node1=head1,preNext=&head1;node1;/**noactionhere*/){
if(node1->num==node2->num){
*preNext=node1->next;
free(node1);
node1=*preNext;
continue;
}
preNext=&(node1->next);
node1=node1->next;
}
}
returnhead1;
}
intmain(intargc,char**argv)
{
NODE*a=NULL,*b=NULL,*a_p=NULL,*b_p=NULL;
structdata_arraydata_a[]={{20304,75},{20311,89},{20303,62},{20307,87},{20320,79}};
structdata_arraydata_b[]={{20302,65},{20301,99},{20311,87},{20323,88},{20307,92},{20322,83}};
a=create(data_a,sizeof(data_a)/sizeof(structdata_array));
b=create(data_b,sizeof(data_b)/sizeof(structdata_array));
a=merge(a,b);
display(a);
return0;
}
main函数还需要你自己完善。