-
C基礎第三天
今天老師講了數組和指針,單單是數組感覺難度不大,不難理解,但是和指針結合之后,對我來說難度就不止一點了,尤其是講到最后,直接懵掉,感覺被繞暈了。老師先給我們講解了昨天留的作業,又給我們出了幾道題來鞏固昨天的內容,然后才開始講解數組和指針。
homework:猜拳小游戲
思路:
電腦: 石頭(0) 剪刀(1) 布(2)
人: 石頭(4) 剪刀(7) 布(10)
srand((unsigned)time(NULL))
a=rand()%3 0 1 2
人贏:5 || 9 || 10
電腦贏:6 || 7 || 11
else:平手
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
void main()
{
char people;
int computer,total;
while(1)
{
sleep(3);
system("clear");
printf("\n這是一個猜拳游戲:\n");
printf("A.石頭\nB.剪刀\nC.布\nD.不玩了\n");
scanf("%c%*c",&people);
switch(people)
{
case 'A':
case 'a':
people=4;
break;
case 'B':
case 'b':
people=7;
break;
case 'C':
case 'c':
people=10;
break;
case 'D':
case 'd':
return;
default:
printf("輸入有誤,請重新輸入");
}
srand((unsigned)time(NULL));
computer=rand()%3;// 0 1 2
switch(computer)
{
case 0:
printf("電腦出了:石頭!\n");
break;
case 1:
printf("電腦出了:剪刀!\n");
break;
case 2:
printf("電腦出了:布!\n");
}
total=people+computer;
if(total==5 || total==9 || total==10)
{
printf("你贏了!\n");
}
else if(total==6 || total==7 || total==11)
{
printf("電腦贏了!\n");
}
else
{
printf("平手!\n");
}
}
}
練習:for 百錢買百雞,公雞 3/只 ,母雞2/只 ,小雞一塊錢2只,問:實現一百塊錢買一百只雞。
思路:
公雞:33
母雞:50
小雞:100-公-母
int g,m,x;
for(g=1;g<33;g++)
for(m=1;m<50;m++)
{
x=100-g-m;
if((g*3+m*2+x/2)==100 && x%2==0)
printf("%d %d %d\n",g,m,x);
}
數組:
定義數組: type typename[size];
例: int a[5]
定義了一個數組a,數組里面有5個元素,每個元素都是int 類型
訪問數組中的每個元素:通過下標,
a[0]:第一個元素,
a[1]:第二個元素
....
a[n-1]; int a[n] ; 每個元素的下標號從0~n-1
特點:
1.各個元素在內存里面是緊緊相鄰的。內存的最小單位是字節,一個字節一個地址。
- 能夠通過下標號去快速訪問數組里面的任何一個元素。
給數組賦值:
1.在定義的時候給它賦值(初始化)
例: int a[5]={1,2,3,4,5}
也可以不完全賦值
例: int a[5]={1,2,3} 這樣,只會給數組里面的前3個元素賦值,后面沒有賦到值的默認為0.
如果只定義了數組,但沒有賦值,如果該數組是放在函數里面的,則該數組中的每個元素都是隨機值。如果是放在函數外面的,則都是0。
int a[]={1,2,3,4,5}; 通過判斷后面初始化元素的個數來確定數組的長度。
2.先定義,后賦值。
用過一個for循環來給一個數組賦值。
例: int a[n]
for(int i=0;i<n;i++)
a[i]=i;
注:1.對于數組,只能在定義它的時候通過初始化的方式整體訪問它,其他任何時候都不能夠整體訪問一個數組,只能通過訪問它的每一個元素去訪問它。
2.在定義數組的時候,數組里面的元素的個數必須是個確定的值,不能是個變量。
練習:輸出一個數組里面的最大值和最小值
#include <stdio.h>
void main()
{
int a[10];
for(int i=0;i<10;i++)
scanf("%d",&a[i]);
int max,min;
max=a[0];
min=a[0];
for(int i=1;i<10;i++)
{
if(max<a[i])
max=a[i];
if(min>a[i])
min=a[i];
}
printf("max:%d min:%d\n",max,min);
}
練習:輸入10個數,保存在一個數組里,在數組中查找某個數,如果找到,就給出該數在數組中的位置,沒有找到就輸出“沒有找到”。
#include <stdio.h>
void main()
{
int a[10],search,flag=0;
for(int i=0;i<10;i++)
scanf("%d",&a[i]);
printf("請輸入要查找的值:");
scanf("%d",&search);
for(int i=0;i<10;i++)
{
if(search==a[i])
{
printf("找到了,位置是:%d\n",i+1);
flag++;
}
}
if(flag==0)
{
printf("沒有找到!\n");
}
}
練習:定義一個6個長度的數組,里面有序排好了5個數(升序),現在插入一個數,使插入之后的數組依然有序(升序)。
#include <stdio.h>
void main()
{
int a[6],i,j,in;
//輸入有序的5個數
for(i=0;i<5;i++)
scanf("%d",&a[i]);
printf("請輸入要插入的數:");
scanf("%d",&in);
//確定插入的位置 =>i
for(i=0;i<5;i++)
if(a[i]>in)
break;
//把i后的數往后挪一個位置,空出i的位置
for(j=5;j>i;j--)
a[j]=a[j-1];
//插入in到i
a[i]=in;
//輸出整個數組
for(i=0;i<6;i++)
printf("%d",a[i]);
printf("\n");
}
二維數組:
int a[2][3]
a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]
定義一個二維數組: int a[行數][列數]; 每一個元素的下標號分為行坐標和列坐標,都是從0開始遞增,
賦值
1.在定義的時候賦值(初始化)
a. int a[2][3]={1,2,3,4,5};
b. int a[2][3]={{1,2},{3,4,5}};
2.先定義再賦值。
#include <stdio.h>
void main()
{
int a[2][3],i,j;
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
printf("%d",a[i][j]);
}
}
printf("\n");
}
練習:輸入3行4列的整型矩陣,輸出最大值和對應的下標號
#include <stdio.h>
void main()
{
int a[3][4]={{1,2,3,4},{5,6,12,8},{9,10,11,1}};
int c,r,i,j,max=a[0][0];
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
if(max<a[i][j])
{
max=a[i][j];
c=i;
r=j;
}
}
}
printf("%d %d %d\n",max,c,r);
}
基本數據:
常量
變量
數據的存在形式:%d %f %c
怎么操作基本數據:順序結構 , 條件結構, 循環結構。
數組:
一維數組:
數據的存在形式: 基本數據
怎么去操作數組:基本數據的操作過程
=>
二維數組:
一維數組的另一種形式
int a=1;
基本數據與指針的關系、
#include <stdio.h>
void main()
{
int a=10;
*(&a)=20; //& :獲取a的地址 *:表示該地址里面的值
printf("%d\n",a);
}
指針變量:定義一個變量用來接收一個地址。
例:定義一個變量,接收整型變量的地址
int a=10;
int *p=&a;
指針<=>地址
定義一個變量,接收字符型變量的地址
char c='a';
char *p=&c;
一維數組與指針的關系
1.要明白指針不僅要知道它的值,還要知道它指向的對象
2.數組名表示該數組首元素的首地址,指向的對象是數組里面的元素。
#include <stdio.h>
void main()
{
int a[7]={1,2,3,4,5,6,7};
printf("%p %p %p\n",a,&a[0],&a);
printf("%p %p %p\n",a+1,&a[0]+1,&a+1);
}
/*
a:表示數組的首元素的首地址,作為一個指針,指向的對象是數組里面的元素。+1,指針向后偏移一個所指對象的長度,一個元素,所以a+1,指向的是a[1].
&a:表示的是整個數組的地址,作為一個指針,指向的對象是整個數組.+1.指針向后偏移一個所指對象的長度,一個數組,所以,&a+1,指向數組結尾
*/
#include <stdio.h>
void main()
{
int a[5]={1,2,3,4,5};
// printf("%p %d\n",*(&a),**(&a));
// int *p//p是一個指針變量,接收一個int型數據的地址,作為一個指針,指向的對象是一個int型數據
int *p1=a;
int *p2=(int *)&a;
printf("%p %p\n",p1+1,p2+1);
}
// * :只有在定義一個變量的時候表示指針,其它任何時候都表示取地址里面的值。
下面的幾個int定義只有寫在代碼框才能讓星號正常顯示
int p:定義了一個整型變量
int *p:定義了一個指向整型變量的指針,接收的是整型變量的地址
指針數組:指針的數組
int *p[5]:定義了一個含有5元素的數組,每個元素都是int *型,作為指針指向int 型的變量
數組指針:數組的指針
int (*p)[5]:定義了指針p。指向的是一個含有5個int型元素的數組
二維數組與指針的關系:
#include <stdio.h>
void main()
{
int a[4][5]={1,2,3,4,5,
6,7,8,9,10,
11,12,13,14,15,
16,17,18,19,20};
int (*p)[5]=a; //a作為指針指向數組的首元素的首地址,二維數組的元素是一維數組,所以,a指向第一行,停在第一行的第一個元素處,1的位置。
printf("a=%p a+1=%p\n",a,a+1); //a+1指向這個數組的第二行,指針停在6的位置
printf("*a=%p *(a+1)=%p\n",*a,*(a+1));//*a,作為一個指針,指向的是第一行里面的元素,停在1的位置,*a+1,作為指針,指向第一行的第二個元素,2, **a,就是取*a作為一個指針所指向的對象的值,即1.
printf("&(*a+1)=%p &(*a+1)+1=%p\n",&(*a),&(*a)+1);
printf("**(&(*a+1))=%d **(&(*a+1)+1)=%d\n",**(&(*a)),**(&(*a)+1));
printf("*a+1=%p *(a+1)+1=%p\n",*a+1,*(a+1)+1);
printf("**a=%d **(a+1)=%d\n",**a,**(a+1));
printf("*(*a+1)=%d *(*(a+1)+1)=%d\n",*(*a+1),*(*(a+1)+1));
printf("&a=%p &a+1=%p\n",&a,&a+1);
int (*p1)[3]=(int (*)[3])a;
printf("p1=%p p1+1=%p\n",p1,p1+1);
printf("**p1=%d **(p1+1)=%d\n",**p1,**(p1+1));
}
/*
1.一個指向行的指針前面加個*,就表示成指向列的指針。一個指向列的指針前面加個&就變成了指向行的指針。
2.二維數組是按行存儲,先存第一行,然后依次存下一行,它的元素是行,每個元素在內存中相鄰存放。
*/
函數
函數與指針的關系
字符串
上面三點估計是老師想講但是沒來得及講的,畢竟數組和指針放一起還是有點搞頭的,只能讓我們消化一下等到明天再講了。