C語言期末複習資料

努力成長發表於2021-01-02

FIGHTING!
ALL BELIEVE,and,NEVER GIVE UP!

C語言的期末考試已經過去了,
20道選擇題全對,
4道程式對了三道,
第一道就是讓用指標和字串編函式,但是這塊自己壓根都沒看,老師之前也說不用指標都能做,為了計算機證寒假再補一補吧,下面是自己在考前整理的一些知識點,感覺梳理一下。自己心裡會踏實不少,全都拿出來分享給大家吧,也沒排版,大家湊合看吧

1.求質數

#include<stdio.h> 
#include<math.h>
int  main()
{
int m,n,i;
scanf("%d",&m);
n=sqrt(m);
for(i=2;i<=n;i++)
{
if(m%i==0)
break; 
}
if(i>n)
printf("素數");
else
printf("不是素數"); 
}

2.最大公約數 最小公倍數

#include<stdio.h> 
int main()
{
int m,n;
scanf("%d%d",&m,&n);
int k;
k=m<n?m:n;
while(m%k!=0||n%k!=0)
k--;
printf("最大公約數%d\n",k);
int p;
p=m*n/k;
printf("最小公倍數%d\n",p);
}

3.斐波拉契數列

#include<stdio.h> 
int main()
{
 int a[20]={1,1};
 int i;
 for(i=2;i<20;i++)  
   a[i]=a[i-2]+a[i-1];
   for(i=0;i<20;i++)
  {
 printf("%10d",a[i]);
   if((i+1)%5==0)
   printf("\n"); 
  }

You can be the winner always!
JUST NEVER GIVE UP!
4.水仙花數

#include<stdio.h> 
int main()
{ int i,j,k,l;
for(i=100;i<1000;i++)
{j=i/100;
 k=i%10;
 l=i/10%10;
 if(i==j*j*j+k*k*k+l*l*l)
 printf("%5d",i);
 } 

}

5.同構數

#include <stdio.h>
int main()
{   int i;
	for(i=1; i<100; i++)
	{   if(i*i%10==i||i*i%100==i)
		{	printf("%-4d",i);
		}
	}
	return 0;
}

6.判斷完數

int isPerfectNum(int n)//判斷n是否為完數,如果是,則返回1,否則返回0
{
int i,s=0for(i=1;i<n;i++)//遍歷小於n的整數
if(n%i==0)//可以整除,為真因子
s+=i;//累加每個真因子到s上 
if(s==n)//如果符合完數條件,返回1
return 1;
else //如果不是完數,返回0
Return 0;
}

PART B 陣列
1.找最大值及其下標
#include <stdio.h>
int main()
{ int a[10]={0};
int i;
int k=0;
for(i=0;i<10;i++)
{scanf("%d",&a[i]);
if(a[i]>a[k])
a[k]=a[i];
k=i;
}
printf(“a[%d]=%d”,k,a[k]);

}
2.找指定數
if找就0k啦
3.排序
從小到大排
氣泡排序
for(i=0;i<n-1;i++)
for(j=0;j<n-i-1;j++)
If(a[j]>a[j+1])
{ t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
選擇排序
for(k=0;k<n-1;k++)
{ index=k;
For(i=k+1;i<n;i++;)
If( a[i]<a[index])
Index=i;
t=a[index];
A[index]=a[k];
A[k]=t;
}


字串的排序問題
#include<stdio.h>
#include<string.h>
#define N 80
int main()
{ char s[5][4]={“mat”,“app”,“cam”,“b”,“hyg”}; 5行5個數 最長4個空間
char t[4];
int i,j;
for(i=0;i<4;i++)
for(j=i+1;j<5;j++)
if(strcmp(s[i],s[j])>0)
{ strcpy(t,s[i]);
strcpy(s[i],s[j]);
strcpy(s[j],t);
}
for(i=0;i<5;i++)
puts(s[i]);
}

行列轉置
輸入一個 2 行 3 列的整數陣列,將其進行轉置(行和列元素交換)並輸出

#include<stdio.h>
int main()
{
int a[2][3],b[3][2];
int i,j;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
{
scanf("%d",&a[i][j]);
b[j][i]=a[i][j];
}
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
printf("%d",b[i][j]);
printf("\n");
}
}

二維陣列 n行n列
主對角線 i==j ↘
主對角線以上 i<=j
副對角線 ↙ i+j=n-1;

增刪改查

字串
“”括起來

結束標誌’\0’ 佔用一個位元組,但不計入長度

字元陣列 s【i】i過大的話,之後都自動賦值‘\0’

Char ch[6]=”china”; char ch[ ]={“china”}; 6個元素 5個字元
字元陣列的長度至少比字串中字元數多1

函式
長度 strlen(str)

#include<stdio.h>
int main()
{ int i=0;
char str[10];
gets(str);
while(str[i]!=0)
{
i++;
}
Return i;
}

………………………………………………………………………………………

比較函式
Strcmp(str1,str2) 返回正值則str1大

#include<stdio.h>
#include<string.h>
#define N 80
int main()
{ char s1[N],s2[N];
int num=0;
int i;
gets(s1);
gets(s2);
for(i=0;s1[i]!=’\0’||s2[i]!=’\0’;i++)
{ num=num+s1[i]-s2[i];
}
printf("%d",num);
}

*****…………………………………………………………………………………
字串複製 strcpy (str1;str2)相當於把2給1;
#include<stdio.h>
#define N 80
int main()
{ char str1[N],str2[N];
gets(str1);
int i=0;
for(i=0;str1[i];i++)
str2[i]=str1[i];
str2[i]=’\0’;
puts(str2);
}
……………………………………
字串連線函式
Strcat
#include<stdio.h>
#include<string.h>
#define N 80
int main()
{ char str1[N],str2[N];
gets(str1);
gets(str2);
int m,n;
m=strlen(str1);
n=strlen(str2);
int i=1;
for(i=1;i<=n;i++)
str1[m-1+i]=str2[i-1];
str1[m+n]=’\0’;
puts(str1);
}

Scanf gets

賦值

  • 逐個輸入字元
    Scanf(“%c%c%c”,&a[0],&a[1],&a[2]);
    For(i=0;i<3;i++)
    Printf(“%c”,a[i]);

For(i=0;i<3;i++)
Ch[i]=getchar();

For(i=0;i<3;i++)
Ch[i]=putchar();

*字串的輸入輸出
Gets(str1);讀段落
Puts(str1);puts(“abc”); 換行 一次輸一個

Scanf(“%s%s”,str2,str3); 讀單詞
Printf(“%s%s”,str2,str3); 不換行 可同時輸出

逆序
一個數
Sum=0;
While(n!=0)
{
sum=sum*10+n/10;
N=n/10;
}

迴文

1.執行下面程式碼段,選擇出 i的正確結果_______。
int i;
char ﹡s=“a\045+045\tb”;
for ( i=0;*(s++);i++) ;
c語言中“\”代表轉義字元“’”代表“’”表示一個字元
“\045”表示轉義“045”,以0開頭的數字是八進位制,即“\045”表示十進位制的37,以字串格式輸出則是“%”,也代表一個字元。所以“*s”則是由8個字元組成,即是“a%+045’b”。
可知for(j=0;*s++;j++)語句迴圈8次,“*s”由8個字元組成,到第9位的時候則為假了,語句終止。
2.
int i, j , p=&i ;則下面語句中與i =j;等價的語句是_______。
A、p=&j
3、char s[ ]= “china”;
char p;
p=s;
則下列敘述正確的是_______。
A、s和p完全相同
B、陣列s中的內容和指標變數p中的內容相等
C、s陣列長度和p所指向的字串長度相等
D、﹡p與s[0]相等 √
4、對a陣列元素的正確引用是_______。
int a[5], p=a;
A、
(++a)
B、a+2
C、
(p+5) 越界
D、
(a+2) √

p->m 或(*p).m

4.若使指標p1指向dt中的m域, p1=&dt.m
5.已有定義int k=2, *ptr1,*ptr2;且ptr1和ptr2均已指向同一個變數k,下面不正確執行的賦值語句是_______。
A、k=*ptr1+*ptr2 ;
B、ptr2=k; √
C、ptr1=ptr2;
D、k=ptr1(*ptr2);

6.若有說明:
int *p,m=5,n;
以下正確的程式段是_______。
A、p=&n; scanf("%d",&p);
B、p=&n; scanf("%d",*p);
C、scanf("%d",&n); p=n;
D、p=&n; *p=m; √
7.若有以下定義,則對a陣列元素地址的正確引用是_______。
int a[5], *p=a;
A、p+5 地址引用 &a[i] &p[i] 元素 a[i] p[i]
 a+i p+i *(a+i) *(p+i)
B、﹡a+1
C、&a+1
D、&a[0] √
8.char *s;s=“Olympic”; 指標和字串

9.結構體變數三種定義
struct student
{
int num;
char name[10];
char sex;
};

struct student stu1,stu2;
2,struct student
{
int num;
char name[10];
char sex;
} stu1, stu2;

3,struct
{
int num;
char name[10];
char sex;
} stu1,stu2;

相關文章