一.代碼:
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).流程圖:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SM5MjMzYTM00CMzUjMwAjMxEDNyMDM4EDMy0SOzUzNzITMvw1MwgTMwIzLclzM1czMyEzLcd2bsJ2Lc12bj5ycn9Gbi52YugTMwIzcldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
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.拆分實數的整數與小數部分:
第二步:先寫出函數,将傳入資料變為int型并指派給整數部分的值,最後用傳入的資料減去整數部分得到小數部分并指派給小數部分。
`
#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;
}
`
未遇到問題。
4. 在數組中查找指定元素:
第一步:觀察題中給了主函數和函數接口的定義,可以看到傳出的資料有所需排序的數組,需要查找的數字和元素個數。
第二步:先寫出函數運用一個for語句對數組進行周遊,在周遊的過程中運用一個if語句,if語句需要判斷所周遊到的數字是否和要查找的數字相同,如果相同令index = i并用break跳出for循環,如果不相同index則仍等于-1,直到循環結束。最後傳回index的值即可。
`
#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;
}
`
5.找最大值及其下标:
第一步:觀察題中給了主函數和函數接口的定義,可以看到傳入的數組,下标,數組所含元素個數。
第二步:先寫出函數運用一個for語句對數組進行周遊,在周遊的過程中運用一個if語句,if語句需要判斷所周遊到的數與a[i]的大小,如果a[i]小于所周遊到的數則将a[I]指派給max,并将其下标指派給p。最後下标存到指針b所指的變量裡,函數傳回最大值。
`
#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;
}`
6.最小數放前最大數放後:
第一步:觀察題中給了主函數和函數接口的定義,可以看到題中共需要三個函數,其中第一個和最後一個函數隻需要周遊數組便可錄入資料和傳出排序後資料,第二個函數傳入了數組,和數組所含資料個數需将最小數放前最大數放後。
第二步:首先需要一個for循環周遊數組在數組中設立if語句比較目前資料和最小值的大小,如果大于最大值則将目前數組的下标賦給idx,周遊過後判斷idx是否等于0,如果不等于0将a[idx]與a[0]數值互相調換。最小值與之相反。
`
#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));
}
}`
7.指針選擇法排序:
第一步:觀察題中給了主函數和函數接口的定義,其中a為傳入的指針數組,n為數組中所含元素個數。
第二步:先用一個for循環表示所需的趟數,再用一個for循環周遊整個數組,其中用一個if語句判斷周遊的數和後一個數哪個大,如果後一個數大則将兩個數交換。
`
#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;}
}`
最開始的時候将最大最小數放反,後來将大于号改成小于号。
8. 判斷回文字元串:
第一步:觀察題中給了主函數和函數接口的定義, 函數隻傳入了字元。
第二步:先用strlen将字元長度指派給n,用一個for循環周遊數組,并在for循環中用一個if語句判斷回文相應的字元是否相等,如果相等則将k加一,否則傳回false。for循環後判斷k與n是否相等,如果相等則傳回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 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;
}
}
`
9使用函數實作字元串部分複制:
第一步:函數傳入了數組t,所藥截斷的位數m,最後截斷的數組s;
第二步:先用 strlen(t)求出其長度n,再判斷m和n的大小,如果m大于n則直接傳回空的數組,否則進入for語句進行周遊在周遊的過程中需要将數組t的第m個開始的元素數值賦給s數組,并在周遊後将最後一個位址填入'\0';
`#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';
}
}
`
在if語句中最開始隻寫了m<n導緻pta上出現兩個錯誤。
還有在周遊後沒有寫*(s + n) = '\0'導緻一個錯誤。
這兩個錯誤都是咨詢同學後改正的。
10.加密:
第一步:擷取字元串,将字元串傳入函數中。
第二步:函數中先用for語句周遊字元串,其中用if語句判斷所周遊的字元是否為y,z如果不是則相應的字元碼值加2,如果是則相應變為a,b。
`#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位址