本周c语言练习(11月15日————11月21日)
本周小结:本周主要针对数组和指针进行训练,还练习了一些特殊循环
总结:指针有些虽然能敲,但是时间较长,也就是不熟练,数组练习较好,但存在一些小问题,代码报错总得找半天才能发现错误。
下周目标:加强数组训练,继续攻克指针,
一.指针训练
1.指针取地址,自己较指针开始基础练习了一下;
#include<stdio.h>
int ha(int *i);
int bu(int *i);
int main(void)
{
int i=6;
printf("%d\t",i);
printf("%p\t",&i);
printf("\n");
ha(&i);
bu(&i);
}
int ha(int *i)
{
printf("%d\t",*i);
printf("%p\t",&i);
printf("%d\t",i);
printf("\n");
*i=100;
}
int bu(int *i){
printf("%d\t",*i);
printf("%p\t",&i);
}
2.指针改变数值;
int fun(int *x);
int cun(int x);
int main()
{
int x=6;
int *p;
fun(&x);
cun(x);
}
int fun(int *x){
printf("%d\t",*x);
*x=2;
}
int cun(int x){
printf("%d",x);
}
3.指针地址练习
#include<stdio.h>
int main()
{
char ac[]={0,1,2,3,4,5,6,7,8,9,};
char *p = ac ;
char *p1 =&ac[5];
printf("%p\n",p);
printf("%p\n",p+1);
printf("%d\n",p1-p);
int ai[]={0,1,2,3,4,5,6,7,8,9,};
int *q = ai;
int *q1 = &ai[6];
printf("%p\n",q);
printf("%p\n",q1);
printf("%d\n",q1-q);
return 0;
}
4.上周没看懂的指针和数组的结合这周搞明白了
#include<Stdio.h>
void minmax(int a[],int len,int *max,int *min);
int main ()
{
int a[]={1,2,3,4,5,6,7,8,9,12,13,};
int min,max;
minmax(a,sizeof (a)/sizeof a[1],&min,&max);
printf("min=%d,max=%d\n",min,max);
return 0;
}
void minmax(int a[],int len,int *min,int *max)
{
int i;
*min=*max=a[0];
for(i=1;i<len;i++){
if(a[i]<*min){
*min=a[i];
}
if(a[i]>*max){
*max=a[i];
}
}
}
5.指针的一个作用可以改变返回值
#include<stdio.h>
int divide(int a,int b,int*result);
int main()
{
int a=5;
int b=2;
int c;
if( divide(a,b,&c)){
printf("%d/%d=%d\n",a,b,c);
}
return 0;
}
int divide(int a,int b,int*result)
{
int ret = 1;
if (b==0)ret = 0;
else{
*result =a/b;
}
return ret;
}
二,数组
1,这个数组题就有一个小错误,一直想不来,说明数组还是有些问题
#include<stdio.h>
int main()
{
int a[100];
int i,t,j,x;
scanf("%d",&x);
for(i=0;i<x;i++){
for(j=i+1;j<x-1;j++){
t=0;
if(a[i]<a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
for(i=0;i<x;i++){
printf("%d",a[i]);
}
}
2,数组进制转化
#include<stdio.h>
int main(void){
int n,i,a[100],t;
while(scanf("%d",&n))
{
i=0;
while(n>0)
{
a[i]=n%2;
n/=2;
i++;
}
for(i--;i>=0;i--)
printf("%d",a[i]);
printf("\n");
}
}
3,二维数组的遍历(这个最主要想练习一下扫雷的数组遍历)
#include <stdio.h>
int main(){
int a[10][10];
int i,j,t,w,v,d,x;
for(i=0;i<10;i++){
for(t=0;t<10;t++){
v++;
a[i][t]=v;
}
}
for(j=0;j<10;j++){
for(w=0;w<10;w++){
d++,x++;
printf("a[d][x]=%-4d",a[j][w]);
}printf("\n");
}
}
4,数组随机数取最大值(这个代码很有意思)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
int a[10];
int i,max;
srand(time(0));
for(i=0;i<10;i++)
{
a[i]=rand()%100;
printf("%4d",a[i]);
}
printf("\n");
for(i=0;i<10;i++){
if(max<a[i]){
max=a[i];
}
}
printf(" 这个数组最大值为%d",max);
}
三,一些循环或者思维题的训练
1,
#include<stdio.h>
#include<math.h>
int main()
{
double x,y,z;
int a,b,c,i;
for(i=100;i<1000;i++){
a=i%10;
b=i/10%10;
c=i/100;
x=pow(a,3);
y=pow(b,3);
z=pow(c,3);
if(x+y+z==i)
printf("%d\t",i);
}
}
2,
#include<stdio.h>
int main(void)
{
int i,x,j;
scanf("%d",&x);
for(i=x;i>0;i--)
{
j=i;
while(j){
j--;
printf("* ");
}
printf("\n");
}
}
3,这个是慕课上的题 (井字棋)
#include<stdio.h>
int main()
{
const int size = 3;
int board[size][size];
int i,j;
int numofx;
int numofo;
int result= -1;
for (i=0;i<size;i++){
for (j=0;j<size;j++){
scanf("%d",&board[i][j]);
}
}
for(i=0;i<size && result == -1;i++){
numofo = numofx =0;
for( j=0;j<size;j++){
if( board[i][j] == 1){
numofx ++;
}else{
numofo ++;
}
}
if( numofo == size){
result = 0;
}else if(numofx == size)
{
result =1;
}
}
}
4,
#include<stdio.h>
int main(void)
{
int x,i,j,k;
scanf("%d",&x);
for(i=1;i<=x;i++){
for(k=1;k<=x-i;k++){
printf(" ");}
for(j=1;j<=i;j++){
printf("%d ",j);
}
printf("\n");
}
}
5
#include<stdio.h>
int main()
{
int i,j,k;
scanf("%d",&k);
for(i=1;i<=k;i++){
j=i;
while(j){
j--;
printf("*");
}
printf("\n");
}
}