2018第一次作業


一.代碼:

1.證明P++等價於(p)++還是等價於*(p++)?

`        
 #include <stdio.h>

int main()
{
	int *p ,a = 5;
	p = &a;
	
	printf("*p = %d\n",*p);          	 // *p = 5   
    printf("p = %d\n",p);    			 //p = 6487620    
    printf("p++ = %d\n",p++);			 //p++ = 6487620
	a = 5 ,p = &a;       
    printf("(p)++ = %d\n",(p)++);	   	 //(p)++ = 6487620 
	a = 5 ,p = &a;      
    printf("*(p++) = %d\n",*(p++)); 	 //*(p++) = 5    

 } `

2.計算兩數和與差:

1).設計思路:

(1).文字描述:

第一步:觀察題中給了主函數和函數接口的定義,可以看出傳出的是指針數據,所以只需寫出運算過程即可。
第二步:先寫出函數,寫出加減的運算過程。

(2).流程圖:

2).實驗代碼:

`        
 #include <stdio.h>

void sum_diff( float op1, float op2, float *psum, float *pdiff );`

int main()
{
float a, b, sum, diff;

scanf("%f %f", &a, &b);
sum_diff(a, b, &sum, &diff);
printf("The sum is %.2f\nThe diff is %.2f\n", sum, diff);

return 0; 
}

void sum_diff( float op1, float op2, float *psum, float *pdiff )
{
*psum = op1 + op2;
*pdiff = op1 - op2;  


}
`

3).遇到的問題:

在開始的時候比較疑惑為什么主函數上面給了函數接口還讓在下面寫函數。
后來經過翻閱上學期的書籍發現只是聲明了一個函數。

3.拆分實數的整數與小數部分:

1).設計思路:

(1).文字描述:

第一步:觀察題中給了主函數和函數接口的定義,可以看出傳出的是指針數據,所以只需寫出運算過程即可。
第二步:先寫出函數,將傳入數據變為int型並賦值給整數部分的值,最后用傳入的數據減去整數部分得到小數部分並賦值給小數部分。

(2).流程圖:

2).實驗代碼:

`
#include <stdio.h>

void splitfloat( float x, int *intpart, float *fracpart );

int main()
{
float x, fracpart;
int intpart;

scanf("%f", &x);
splitfloat(x, &intpart, &fracpart);
printf("The integer part is %d\n", intpart);
printf("The fractional part is %g\n", fracpart);

return 0;
}

void splitfloat( float x, int *intpart, float *fracpart )
{
*intpart =  (int)x;
*fracpart = x - *intpart;


}
   `

3).遇到的問題:

未遇到問題。

4. 在數組中查找指定元素:

1).設計思路:

(1).文字描述:

第一步:觀察題中給了主函數和函數接口的定義,可以看到傳出的數據有所需排序的數組,需要查找的數字和元素個數。
第二步:先寫出函數運用一個for語句對數組進行遍歷,在遍歷的過程中運用一個if語句,if語句需要判斷所遍歷到的數字是否和要查找的數字相同,如果相同令index = i並用break跳出for循環,如果不相同index則仍等於-1,直到循環結束。最后返回index的值即可。

(2).流程圖:

2).實驗代碼:

`
#include <stdio.h>
#define MAXN 10

int search( int list[], int n, int x );

int main()
{
    int i, index, n, x;
    int a[MAXN];

    scanf("%d", &n);
    for( i = 0; i < n; i++ )
        scanf("%d", &a[i]);
    scanf("%d", &x);
    index = search( a, n, x );
    if( index != -1 )
        printf("index = %d\n", index);
    else
        printf("Not found\n");

    return 0;
}

int search( int list[], int n, int x )
{
	int i;
	int index;
	for(i = 0;i < n;i++){
		if(list[i] == x){
			index = i;
			break;
		}else{
			index = -1;
		}
	} 
	return index;

} 
`

3).遇到的問題:

未遇到問題。

5.找最大值及其下標:

1).設計思路:

(1).文字描述:

第一步:觀察題中給了主函數和函數接口的定義,可以看到傳入的數組,下標,數組所含元素個數。
第二步:先寫出函數運用一個for語句對數組進行遍歷,在遍歷的過程中運用一個if語句,if語句需要判斷所遍歷到的數與a[i]的大小,如果a[i]小於所遍歷到的數則將a[I]賦值給max,並將其下標賦值給p。最后下標存到指針b所指的變量里,函數返回最大值。

(2).流程圖:

2).實驗代碼:

`
#include<stdio.h>
#define N 10
int fun(int *a,int *b,int n);
int main()
{ int a[N],i,max,p=0;
for(i=0;i<N;i++) scanf("%d",&a[i]);
 max=fun(a,&p,N);
 printf("max=%d,position=%d\n",max,p);
 return 0;
}

int fun(int *a,int *b,int n)
{
	int i;
	int max,p;
	max = a[0];
	p = 0;
	for(i = 1;i < N;i ++){
		if(a[i] > a[i-1]){
			max = a[i];
			p = i;
		}
	}
	*b = p;
	return max;
}`

3).遇到的問題:

未遇到問題。

6.最小數放前最大數放后:

1).設計思路:

(1).文字描述:

第一步:觀察題中給了主函數和函數接口的定義,可以看到題中共需要三個函數,其中第一個和最后一個函數只需要遍歷數組便可錄入數據和傳出排序后數據,第二個函數傳入了數組,和數組所含數據個數需將最小數放前最大數放后。
第二步:首先需要一個for循環遍歷數組在數組中設立if語句比較當前數據和最小值的大小,如果大於最大值則將當前數組的下標賦給idx,遍歷過后判斷idx是否等於0,如果不等於0將a[idx]與a[0]數值相互調換。最小值與之相反。

(2).流程圖:

2).實驗代碼:

`
#include<stdio.h>
void input(int *arr,int n);
void max_min(int *arr,int n);
void output(int *arr,int n);
int main()
{ int a[10];
input(a,10);
 max_min(a,10);
 output(a,10);
 return 0;
}

void input(int *arr,int n)
{
	int i;
	for(i = 0;i < n;i++){
		scanf("%d",& *(arr + i));
	} 
} 

void max_min(int *arr,int n)
{
	int idx=0,i,t;
  	for ( i = 0; i < n; i++ ) 
  	{ 
  		 if ( arr[i] < arr[idx] )
		{ 
          idx=i; } 		
	} 	
	   
	if(idx!=0){
		t=arr[0];arr[0]=arr[idx];arr[idx]=t;
	}
	idx=0;
	for ( i = 0; i < n; i++ ) 
  	{ 
  		 if ( arr[i] > arr[idx] )
		{ 
           idx=i;} 		
	} 
	
	if(idx!=(n-1)){
	    t=arr[n-1];
		arr[n-1]=arr[idx];
		arr[idx]=t;}
}

void output(int *arr,int n)
{
	int i;
	for(i = 0;i < n;i++){
		printf("%3d",*(arr + i));
	} 	
}`

3).遇到的問題:

未遇到問題。

7.指針選擇法排序:

1).設計思路:

(1).文字描述:

第一步:觀察題中給了主函數和函數接口的定義,其中a為傳入的指針數組,n為數組中所含元素個數。
第二步:先用一個for循環表示所需的趟數,再用一個for循環遍歷整個數組,其中用一個if語句判斷遍歷的數和后一個數哪個大,如果后一個數大則將兩個數交換。

(2).流程圖:

2).實驗代碼:

 `
#include<stdio.h>
void sort(int *x,int n);
int main ( )
{int *p,i,a[10];
 p=a;
 for (i=0;i<10;i++)  scanf("%d",p++);
 p=a;
 sort(a,10);
 for(i=0;i<10;i++)  printf("%4d",*p++);
 printf("\n");
 return 0;
 }
 
 void sort(int *x,int n)
 {
 	int j,i,t;
 	for(j=1;j<=n-1;j++)
       for(i=0;i<=n-j-1;i++)
          if(x[i]<x[i+1])
         {t=x[i]; x[i]=x[i+1]; x[i+1]=t;}
 }`

3).遇到的問題:

最開始的時候將最大最小數放反,后來將大於號改成小於號。

8. 判斷回文字符串:

1).設計思路:

(1).文字描述:

第一步:觀察題中給了主函數和函數接口的定義, 函數只傳入了字符。
第二步:先用strlen將字符長度賦值給n,用一個for循環遍歷數組,並在for循環中用一個if語句判斷回文相應的字符是否相等,如果相等則將k加一,否則返回false。for循環后判斷k與n是否相等,如果相等則返回true。

(2).流程圖:

2).實驗代碼:

 `
#include <stdio.h>
#include <string.h>

#define MAXN 20
typedef enum {false, true} bool;

bool palindrome( char *s );

int main()
{
char s[MAXN];

scanf("%s", s);
if ( palindrome(s)==true )
    printf("Yes\n");
else
    printf("No\n");
printf("%s\n", s);

return 0;
}
  bool palindrome( char *s )
  {
int n = strlen(s);
int i , j , k = 0;
for(i = 0 ,j = n - 1;i < n; i ++,j --)
{
	if(*(s + i) == *(s + j)){
		k ++;
	}else{
		return false;
	}
}

 if(k == n){
 	return true;
 }

  }
 		 `

3).遇到的問題:

9使用函數實現字符串部分復制:

1).設計思路:

(1).文字描述:

第一步:函數傳入了數組t,所葯截斷的位數m,最后截斷的數組s;
第二步:先用 strlen(t)求出其長度n,再判斷m和n的大小,如果m大於n則直接返回空的數組,否則進入for語句進行遍歷在遍歷的過程中需要將數組t的第m個開始的元素數值賦給s數組,並在遍歷后將最后一個地址填入'\0';

(2).流程圖:

2).實驗代碼:

 `#include <stdio.h>
#define MAXN 20

void strmcpy( char *t, int m, char *s );
void ReadString( char s[] ); /* 由裁判實現,略去不表 */

int main()
{
char t[MAXN], s[MAXN];
int m;

scanf("%d\n", &m);
ReadString(t);
strmcpy( t, m, s );
printf("%s\n", s);

    return 0;
}
  void strmcpy( char *t, int m, char *s )
  {
int n = strlen(t);
int i;
if(m <= n){
	for(i = 0;*(t + i) != '\0';i ++){
		*(s+i) = *(t + m - 1 + i);
		
	}
	*(s + n) = '\0';
}else{
	*s = '\0';
}
  }
 `

3).遇到的問題:

在if語句中最開始只寫了m<n導致pta上出現兩個錯誤。
還有在遍歷后沒有寫*(s + n) = '\0'導致一個錯誤。
這兩個錯誤都是咨詢同學后改正的。

10.加密:

1).設計思路:

(1).文字描述:

第一步:獲取字符串,將字符串傳入函數中。
第二步:函數中先用for語句遍歷字符串,其中用if語句判斷所遍歷的字符是否為y,z如果不是則相應的字符碼值加2,如果是則相應變為a,b。

(2).流程圖:

2).實驗代碼:

   `#include<stdio.h>
#define max 100

void jm( char *);

int main()
{
	char name[max];
	
	gets(name);
	
	jm(name);
	
	printf("%s",name);
	
	return 0;
	
}

void jm (char *s)
{
	for(;*s != '\0';s++)
	{
		if(*s == 'z'){
			*s = 'b';
		}else if(*s == 'y'){
			*s = 'a';
		}else{
			*s = *s + 2;
		}
	}
}  `

3).運行結果:

二,學習總結和進度:

1.近期所學知識點:

近期主要學習的便是指針的相關知識點了,第一堂課老師講了指針的概念和定義指針,地址和指針的關系。之后學到了指針的相關運算,例如(p)++和(p++),以及賦值運算其中需要注意指針不能進行乘除運算。再之后學到了數組和指針的相關知識,主要需要記住a[i]和*(a+i)相等。再之后學了指針與字符串的運用,在做題的時候運用到了strcpy(str1,str2)字符串復制,strcat(str1,str2)字符串連接,strcmp(str1,str2)字符串比較,strlen(str)字符長度。

2.Git:


git地址

3.學習進度:

1).表格:

2).折線圖:

4.作業互評:

1,點評同學作業:

1).高立彬;

2).班慶澤;

3).於耀松;

1,邀請同學點評作業:

1).高立彬;

2).趙寅勝;

3).於耀松;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM