C語言——第一次作業(2)


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
        //printf("(p)++ = %d\n",(p)++);        //(p)++ = 6487620
	//printf("*p++ = %d\n",*p++);        //*p++ = 5
	//printf("*(p++) = %d\n",*(p++));        //*(p++) = 5
 } 

題目

題目1.計算兩數的和與差(函數題)

1.設計思路

- (1)算法

第一步:調用題目中定義的函數。

第二步:通過局部變量op1,op2進行加減運算,計算psum、pdiff的值。

第三步:函數調用結束,結果返回主函數。

- (2)流程圖

2.實驗代碼

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

完整代碼

#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.本題調試過程碰到問題及解決辦法

本題未遇到問題。

題目2.拆分實數的整數與小數部分(函數題)

1.設計思路

- (1)算法

第一步:調用題目中定義的函數。

第二步:將x除以1,所得值為x的整數部分,將其賦值給*intpart。

第三步:將x減去其整數部分intpart,所得值為x的小數部分,將其賦值給fracpart。

第四步:函數調用結束,結果返回主函數。

- (2)流程圖

2.實驗代碼

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

完整代碼

#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 = x / 1;
	*fracpart = x - *intpart;
}

3.本題調試過程碰到問題及解決辦法

錯誤信息:

錯誤原因:*fracpart是浮點型數據,(x/1)的運算沒有作用。

改正方法:將*fracpart = x - (x / 1)改為 *fracpart = x - *intpart。

題目3.在數組中查找指定元素(函數題)

1.設計思路

- (1)算法

第一步:調用題目中定義的函數。

第二步:定義i,使用for循環結構,在數組元素范圍內,當存在數組元素等於所查找的數據時,返回主函數此元素下標;當循環結束時未查找到,則返回主函數-1。

第三步:函數調用結束。

- (2)流程圖


2.實驗代碼

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

完整代碼

#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;
    for (i = 0 ; i < n ; i++)
    {
        if (list[i] == x)
        {
            return i ;
        }
    }
    return -1;
}

3.本題調試過程碰到問題及解決辦法

本題未遇到問題。

題目4.找最大值及其下標(函數題)

1.設計思路

- (1)算法

第一步:調用題目中定義的函數。

第二步:定義i,max=*a(使max初始值為數組a首元素地址),使用for循環結構,在數組元素范圍內,將數組a中數值最大的元素存於max,將a的下標存於b。

第三步:函數調用結束,結果返回主函數。

- (2)流程圖

2.實驗代碼

int fun(int *a,int *b,int n)
{
	int i,max=*a;
	for(i = 0 ; i < n ; i++)
	{
		if(*(a+i) > max)
		{
			max = *(a+i);
			*b = i;
		}
	}
	return (max);
}

完整代碼

#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,max=*a;
	for(i = 0 ; i < n ; i++)
	{
		if(*(a+i) > max)
		{
			max = *(a+i);
			*b = i;
		}
	}
	return (max);
}

3.本題調試過程碰到問題及解決辦法

本題未遇到問題。

題目5.最小數放前最大數放后(函數題)

1.設計思路

- (1)算法

第一步:調用題目中定義的input(int *arr,int n)函數,定義i,使用for循環結構,當i小於元素個數n時,輸入arr數據。函數調用結束。

第二步:調用題目中定義的max_min(int arr,int n)函數。定義 j,s=0,t,x=0,首先使用for循環結構,在循環中判斷(arr+j)與(arr+s)的大小關系,當(arr+j)<*(arr+s) 時,將j賦值給s,若s不等於0,做交換,可得最小值;同理,可得最大值。函數調用結束。

第三步:調用題目中定義的output(int *arr,int n)函數。定義k,使用循環結構,輸出結果。函數調用結束。

- (2)流程圖




2.實驗代碼

void input(int *arr,int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		scanf("%d",arr++);
	}
}
void max_min(int *arr,int n)
{
	int j,s=0,x=0;
	int t;
	for(j=1;j<n;j++)
	{
		if(*(arr+j)<*(arr+s))  
			s=j;
	}
	if(s!=0)
	{
		t=*arr;
        *arr=*(arr+s);
        *(arr+s)=t;
	}
	for(j=1;j<n;j++)
	{
		if(*(arr+j)>*(arr+x))  
			x=j;
	}
	if(x!=0)
	{
		t=*(arr+n-1);
        *(arr+n-1)=*(arr+x);
        *(arr+x)=t;
	}
}
void output(int *arr,int n)
{
	int k;
	for(k=0;k<n;k++,arr++)
	{
		printf("%3d",*arr);
	}
}

完整代碼

#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++);
	}
}
void max_min(int *arr,int n)
{
	int j,s=0,x=0;
	int t;
	for(j=1;j<n;j++)
	{
		if(*(arr+j)<*(arr+s))  
			s=j;
	}
	if(s!=0)
	{
		t=*arr;
        *arr=*(arr+s);
        *(arr+s)=t;
	}
	for(j=1;j<n;j++)
	{
		if(*(arr+j)>*(arr+x))  
			x=j;
	}
	if(x!=0)
	{
		t=*(arr+n-1);
        *(arr+n-1)=*(arr+x);
        *(arr+x)=t;
	}
}
void output(int *arr,int n)
{
	int k;
	for(k=0;k<n;k++,arr++)
	{
		printf("%3d",*arr);
	}
}

3.本題調試過程碰到問題及解決辦法

本題出現了格式錯誤,題目中要求每個元素輸出占3列,但是我並沒有在代碼中表現出這一點。修改輸出格式即為正確答案。

題目6.指針選擇法排(函數題)

1.設計思路

- (1)算法

第一步:調用題目中定義的函數。

第二步:定義i,t,k,j,使用雙重for循環結構(即使用選擇排序法排序)。

第三步:函數調用結束。

- (2)流程圖


2.實驗代碼


void sort(int *x,int n)
{
	int i;
	for(i=0;i<(n-1);i++)
	{
		int k,j;
		k=i;
		for(j=i+1;j<n;j++)
		{
			if(*(x+j)>*(x+k))
			{
				k=j;
			}
		}
		if(i!=k)
		{
			int t; 
			t=*(x+i); 
			*(x+i)=*(x+k); 
			*(x+k)=t;
		}
	 } 
} 

完整代碼

#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 i;
	for(i=0;i<(n-1);i++)
	{
		int k,j;
		k=i;
		for(j=i+1;j<n;j++)
		{
			if(*(x+j)>*(x+k))
			{
				k=j;
			}
		}
		if(i!=k)
		{
			int t; 
			t=*(x+i); 
			*(x+i)=*(x+k); 
			*(x+k)=t;
		}
	 } 
} 

3.本題調試過程碰到問題及解決辦法

本題未遇到問題。

題目7.判斷回文字符串(函數題)

1.設計思路

- (1)算法

第一步:調用題目中定義的函數。

第二步:確定輸入字符串的長度,定義i,j,(i為首元素下角標,j為末元素下角標)使用循環結構,判斷在數組元素內是s[i]與s[j]是否相等。若是,則返回true;若不是則返回false。

第三步:函數調用結束。

- (2)流程圖


2.實驗代碼

bool palindrome( char *s )
{
	int a = strlen(s);  
  	int i, j;  
  	for(i=0,j=a-1 ; i <= j ; i++, j--)
	{  
   		if(s[i] == s[j]);  
   		return false;  
 	}  
  	return true;  
}

完整代碼

#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 a = strlen(s);  
  	int i, j;  
  	for(i=0,j=a-1 ; i <= j ; i++, j--)
	{  
   		if(s[i] == s[j]);   
		return false;  
 	}  
  	return true;  
}

3.本題調試過程碰到問題及解決辦法

本題未遇到問題。

題目8.使用函數實現字符串部分復制(函數題)

1.設計思路

- (1)算法

第一步:調用題目中定義的函數。

第二步:先使用字符串復制函數,判斷字符串長度。使用雙重for循環結構,利用指針進行復制,注意最后的'\0'結束符。

第三步:函數調用結束,結果返回主函數。

- (2)流程圖


2.實驗代碼

void strmcpy(char *t, int m, char *s)  
{  
    int i,j,a;  
    strcpy(s,t);
    a = strlen(s);  
    for (i = m - 1 ; i > 0 ; i--) 
	{  
        for (j = i ; j < a + 1 ; j++)
            *(s + j - 1) = *(s + j);
    }  
    *(s + a - m + 1) = '\0';
    return;
}

完整代碼

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

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);
    gets(t);
    strmcpy( t, m, s );
    printf("%s\n", s);

    return 0;
}

void strmcpy(char *t, int m, char *s)  
{  
    int i,j,a;  
    strcpy(s,t);
    a = strlen(s);  
    for (i = m - 1 ; i > 0 ; i--) 
	{  
        for (j = i ; j < a + 1 ; j++)
            *(s + j - 1) = *(s + j);
    }  
    *(s + a - m + 1) = '\0';
    return;
}

3.本題調試過程碰到問題及解決辦法

本題原函數中存在一個“由裁判實現,略去不表”的函數,使得原代碼在編譯器中無法通過編譯。不過修改也很簡單,自行編寫讀入字符串的函數就好。

額外加題

為了防止信息被別人輕易盜取,需要把電碼明文通過加密方式變換成為密文。變換規則如下:小寫字母y變換為a,小寫字母z變換為b,其他字母變換成為該字母ASCII碼順序后2為字幕,比如o變換成q。要求給出你的姓名全拼加密后的結果。

1.設計思路

- (1)算法

第一步:定義數組,獲取字符串。

第二步:在字符不是'\0'的情況下使用循環結構,在循環中進行判斷輸出。

第三步:返回,結束。

- (2)流程圖

2.實驗代碼

#include <stdio.h>
#define N 10001

int main()
{
	char a[N];
	gets(a);
	int i = 0; 
	while(a[i] != '\0')
	{
		if(a[i] == 'y')
			printf("%c",'a');
		else if(a[i] == 'z')
			printf("%c",'b');
		else if(a[i] >= 'a' && a[i] <= 'x')	
			printf("%c",a[i]+2);
		else;
		i++;
	}	
	return 0;
} 

3.本題調試過程碰到問題及解決辦法

本題題目中未說明除小寫字母外其它字符的變換規則,所以我將除小寫字母外其他字母都當成默認不顯示字符,未進行打印輸出。

學習總結和進度

1.知識點

1.使用指針變量做函數參數。

2.數組與指針的結合使用。

3.指針字符串的使用。

學會了以上知識點。由於熟練程度有所欠缺,還不太習慣使用指針,解題總是習慣性地使用以前的思路,接下來解題會盡可能思考指針方法,提高熟練度。

2.我的git地址

3.點評鏈接

鏈接一

鏈接二

鏈接三

4.圖表




免責聲明!

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



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