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.圖表