C语言数组问题

1、 编写程序,根据10种商品的进价和销售价,计算各商品的利润?
进价和销售价如下:
int a[10]={12,8,20,15,28,32,38,45,51,65};
int b[10]={20,13,29,22,37,40,49,56,62,78};

2、定义一个3×4矩阵,并通过键盘往矩阵中输入数据,求矩阵中所有数据的和,并输出?

3、假设一个学习小组由5名学生组成,每个组员有数学、英语和物理课的考试成绩。求学习小组各科的平均成绩和各人的总分

4、假设一个小组有10名同学,定义一个一维数组,输入这10个学生的成绩,然后进行降序排列。并输出排序后的结果。

先给你介绍一些本人的经验,然后再分析题目吧,这样比较容易看懂一些。
在进行指针的运算时,最好不要用语言去描术他,因为容易出错,而且不容易理解,最好是把它转换为数学的方式,通过计算得出最后的答案,那样才是正确可靠的。比如像你这例的pp[0][1]如果用数学方式运算,只需一行就搞定,如果用语言表达,就要弯过来弯过去,还不好理解,还容易理解错误。

1、两条基本准则:
a、首先要明白,指针运算符的作用,我用一言以概之,你在哪里使用都不会错。指针运算符*的作用是求出*后面所指地址里的值。因此只要*后面的变量表示的是一个地址就可以使用*运算符,来求出这个地址中的值,你不用管这个地址的表示形式是怎样的,只要是地址就可以使用*来求出地址中的值。

b、[ ]这个运算符的的运算法则是,把左侧的地址加上[ ]内的偏移量然后再求指针运算,注意有[ ]运算符的地方就有个隐含的指针,比如x[2]表示的就是将指针x偏移2个单位量后再求指针运算。也就说x[2]与*(x+2)是相等的。

对二维数组的指针和[ ]的混合运算,假设b是二维数组b[3][4]

在下面的指针和[ ]的混合计算中,要记住两点关键法则,记住了这两点在哪里计算都不会出错

a、对于像b[1]这样的地址,最好应表示为&b[1][0]再进行偏移计算,比如对于b[1]+1,这不是直接在对b[1]加1,也就是b[1]+1不等于b[2],因为b[1]表示的是第二行行1个元素的地址,对其加1,应该表示的是第二行第二个元素的地址,也就是&b[1][1],而b[2]则表示的是第二行第一个元素的地址,因此错误,所以在计算时应把b[1]转换为&b[1][0]之后,才能直接进行地址的偏移,也就是说b[1]+1=&b[1][0]+1=&b[1][1],这样才能得到正确的结果,并且不会出错。

b、对于有小括号的地方,一定不要省略小括号。比如(&b[1])[1]与&b[1][1]将表示的是不同的结果,第二个是显然的,对于第一个(&b[1])[1]=*((&b[1])+1)=*(&b[1]+1)=*(&b[2])=b[2],可以看到,表示的是第3行第1个元素的地址,因此这两个的结果是显然不一样的。因此对于(b+1)[1]这样的运算,不能省略小括号,即(b+1)[1]=(&b[1])[1]=*((&b[1])+1)=*(&b[1]+1)=*(&b[2])=b[2],如果省略了小括号,则是(b+1)[1]=&b[1][1],这将是不易发现的错误。因此这是两个完完全全不同的符案。

c、总结,指针和[ ]混合运算2点关键,
第1:应把是地址的[ ]运算,转换为地址的形式,比如b[1]应转换为&b[1][0]。因为只有这样才能进行直接的地址相加运算,即&b[1][0]+1=&b[1][1],而b[1]+1不等于b[2]。

第2:有小括号的地方不能省略小括号,如(b+1)[1]=(&b[1])[1]=*((&b[1])+1)=*(&b[1]+1)=*(&b[2])=b[2],也&b[1][1]是完全不同的。

答案A:正确,因为双重指针pp指向的是p也就是说pp=p是与pp=&p[0]等价的,因此pp[0]=*(pp+0)用文字表述就是pp[0]是表示指针pp所指向的地址的值,因为pp指向的地址是&p[0],这个地址里的值就是p[0],也就是p[0]所指向的地址,也就是&a[0],因此pp[0]=&a[0],那么pp[0][1]=(&a[0])[1]=*((&a[0])+1)=*(&a[0]+1)=*(&a[1])=a[1],用文字表达就是,把a[0]的地址偏移一个单位之后得到的地址,也就是&a[1],然后再对这个地址求值,也就是得到a[1]的值,同理pp[1][1]就等同。pp[1]=*(pp+1)=*(&p[0]+1)=*(&p[1])=p[1]=&a[4],其中p[1]=&a[4]是在for循环中得到的,因此就得到pp[1][1]=(&a[4])[1]=a[5]的值,你可以把数组a赋与12个值来验证本人的计算。

答案B:很明显是正确的,不作解释
答案C:错误:因为p[3][1]=*(p[3]+1);在这里可以很明显的看到,指针数组最大的下标只有2,没有p[3]所以是错误的。即,你定义的时候是int *p[3],所以没有p[3]这个值,p[3]数组溢出。
答案D:正确。*(*(p+2)+2)=*(*(&p[0]+2)+2)=*(*(&p[2])+2)=*(p[2]+2)=*(&a[8]+2)=*(&a[10])=a[10],因此是正确的,用文字表达就是,把指针数组p的首地址偏移两个单位,也就得到了是p[2]的地址,即&p[2]。然后求出偏移了这两个单位地址的值,也就是p[2],p[2]就是&a[8]的地址,p[2]指向的地址在for循环中计算得到的,然后再对p[2]所指向的地址偏移两个单位,这样就得到&a[10]的地址,然后再求出这个地址中的值,因此就是a[10]
另外,团IDC网上有许多产品团购,便宜有口碑
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-05-04
我c语言记得不多了,简单说一下算法就行了,别见怪。
1.可以另外定义一个数组c,c[i] = b[i] - a[i];
2.一个两层的循环而已:
先定义一个2维数组a[3][4]
for(i==0,i<=2,i++)
{ for(j==0,j<=3,j++)
scanf(&a[i][j]);
};
这是存数据,读取再相加也是一个两层循环,过程一样。
3.定义一个2维数组a[5][3],然后把数据填进去,无论是平均分还是总分都很好算出来。
4.就是一个冒泡排序嘛。本回答被提问者和网友采纳
第2个回答  2011-05-03
2、
int a[3][4];
int i,j,sum=0;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
{
scanf("%d",&a[i][j]);
sum+=a[i][j];
}
printf("%d\n",sum);
第3个回答  2011-05-04
同学,你是SISO的吧,答案我有,借你看看?

c语言数组大小的问题?
C语言中第一维大小是指数组第一维的长度:如下定义一个一维数组:int arr[10];则其长度可以使用sizeof(arr)来求得:printf("长度:%d",sizeof(arr));其结果为:10 二维数组的第一维大小是指数组的行数,第二维是数组的列数:定义一个二维数组:int arr[5][8];则其行数为5,列数为8,其...

c语言中输入数组的问题
}}printf(“%d\\n”,t); } 可以观察到,arr[0]并未存入字符,t的数值比预期少1 原因:这种情况通常发生在前面已经有了输入语句,而当前的scanf是在接收字符(即用%c控制输入)时。由于前面的输入语句(不一定是scanf)把最后输入的'\\n'遗留在了输入缓冲区,而当前的scanf(“%c”,......

关于C语言中数组定义问题
主函数内定义的数组在堆栈段中分配内存。全局变量数组在数据段中分配内存。一般数据段比堆栈段大很多,所以堆栈段分配不了的内存,数据段可以分配 (1)在堆栈段中分配内存,由于太大无法分配,所以错误。(2)在数据段中分配内存,数据段可以分配,无错误。(3)数组比(1)需要的内存少,在堆栈段大小...

C语言数组初始化问题
第一种常见的初始化方式,如:int a[10] = {1, 2, 3}; 这种方式可以一次性将数组的部分元素初始化,但若只初始化单个元素,如:int a[10] = {1}; 实际上只会让第一个元素被设置为1,其他元素仍保持默认值0。不初始化数组,如:int b[10]; 这种情况下的数组元素并不默认初始化为0。...

C语言的数组排序问题。
第一个填 i-1 第二个填 i++或i+1 最后顺便说句,楼主,for循环里面条件有问题,n+1变量是错误,你要么在前面定义int n = strlen(a),要么在这个地方修改为8+1。修改后并经过测试的代码如下:include<stdio.h> void main(){ int i,x,a[20]={2,4,5,7,8,12,13,18};printf("Input ...

c语言数组指针问题 这里面第二个for循环里 比大小到底是怎么理解的...
输出当前元素的值。比大小的逻辑是:在第二个for循环中,循环条件是p<=*q+i,即p所指向的地址小于等于当前行的第i个元素的地址。因为在这个循环中,我们只需要输出当前行的前i个元素,所以循环条件要限制在这个范围内。注意,这里的p和q都是指针变量,所以它们指向的是地址,而不是数组元素的值。

c语言数组问题
答案是:abcbcc 第一个for循环之后,x[3][4] = {"abc", "abc", "abc"} 第二个for循环的时候,&x[0][0]就是第一行第一个元素的地址所以输出abc &x[1][1]就是第二行第二个元素的地址所以输出bc &x[2][2]就是第三行第三个元素的地址所以输出c ...

C语言,数组输入遇到问题求大神指教:哪里错了,如何改正,为什么会出现...
scanf的格式加'\\n',含义特殊,不是输入一个回车,而是输入完一个数字后,必须等待一个非空格、制表符、回车的输入,程序才会继续。所以你那样写,第一次循环输入2回车,不会进入下一次循环,而是等待再次输入,然后你输入3的时候2被存储在元素1中,进入下一个循环,已经有3了还要等待输入,于是你输入...

C语言如何用printf打印数组问题
)用到 int main(){ int a[5]={1,2,3,8,9};\/\/printf("%d",a[5]); \/\/a[5]表示数组a的第六个元素,越界了 \/\/整型数组,不能一下子简单输出出来,必须用循环 int i;for( i=0;i<5;i++ )printf("%d " , a[i] );printf("\\n");getch();return 0;} ...

c语言三维数组问题
三维数组的基本概念 在C语言中,数组是一种用于存储相同类型元素的数据结构。三维数组是数组的扩展,它具有三个维度或层次。这对于处理如图像、三维空间中的点或任何其他需要三层索引的数据非常有用。每个维度都有一个索引,这些索引允许我们访问数组的特定部分。如何声明和初始化三维数组 在声明三维数组时,...

相似回答
大家正在搜