一.代码:
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)字符长度。