2018第一次作业

一:PTA

1.计算两数的和与差

(1).设计思路

主要描述题目算法

第一步:观察函数定义
第二步:进行加减运算过程

(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).遇到的问题及解决方法

开始指针忘记加*,加上后答案正确。

2.拆分实数的整数与小数部分

(1).设计思路

主要描述题目算法

第一步:观察函数定义。
第二步:将整数部分赋值给int型传入数据,之后用float型传入数据减去整数部分得出小数部分。

(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 = x;
*fracpart=x - *intpart;
}
`

(3).遇到的问题及解决方法

本题没有遇到问题。

3.在数组中查找指定元素

(1).设计思路

1).主要描述题目算法

第一步:观察函数定义。
第二步:判断遍历数字是否与查找数字相同,如果相同index=i,并跳出循环,不相同则等于-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,index;
for(i=0;i<n;i++)
{
if(list[i]==x){
index = i;
break;
}else{
index = -1;
}
}
return index;
}
`

(3).遇到的问题及解决方法

开始将return放进了循环中导致程序不能结束,改正后答案正确。

4.找最大值及其下标

(1).设计思路

1).主要描述题目算法

第一步:观察函数定义。
第二步:用if语句判断遍历数与a[i]的大小,如果a[i]小于遍历数则把a[i]赋值给max,其下标存到指针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; for(i=0;i<n;i++){ if(a[i]>*a){ *a = a[i]; *b = i; } }return *a; }

(3).遇到的问题及解决方法

本题没有问题。

5.最小数放前最大数放后

(1).设计思路

1).主要描述题目算法

第一步:观察函数定义。
第二步:用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).遇到的问题及解决方法

arr[i]与arr[idx]比较大小时符号错误,改正后答案正确。

6.指针选择法排序

(1).设计思路

1).主要描述题目算法

第一步:观察函数定义。
第二步:用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).遇到的问题及解决方法

本题没有问题。

7.判断回文字符串

(1).设计思路

1).主要描述题目算法

第一步:观察函数定义。
第二步:用for循环便利数组,用if语句判断相应字符是否相等,若相等则k加一,否则返回false,之后判断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).遇到的问题及解决方法

开始误将k与n的比较放入for循环中,导致程序错误,放到循环外后答案正确。

8.使用函数实现字符串部分复制

(1).设计思路

1).主要描述题目算法

第一步:观察函数定义。
第二步:先求出长度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语句条件开始写错,且‘\0’表示错误,修改后正确。

9.额外加题3

(1).设计思路

1).主要描述题目算法

第一步:获取字符串并传入函数。
第二步:用for语句遍历,用if语句判断遍历字符是否为y,z,若不是则码值加二,若是则分别变为a,b。

2).流程图

3).运行结果

(2).实验代码

#include<stdio.h> #define max 100 void jiami(char *); int main() { char name[max]; gets(name); jiami(name); printf("%s",name); return 0; } void jiami (char *s) { for(;*s!='\0';s++) { if(*s=='z'){ *s='b'; }else if(*s=='y'){ *s='a'; }else{ *s=*s+2; } } }

(3).遇到的问题及解决方法

本题没有问题。

二:学习总结和进度

1.学习内容

这两周所学知识对我来说比较困难,目前只了解了指针和字符串的基本知识,对这部分的知识还需要花费时间去练习。

2.git

https://coding.net/u/q807443119/p/zuoye/git/commit/ee2eff4fcacf5e380ffed10735d6d02a7ffe31bb?public=true

3.点评

丰大为 http://www.cnblogs.com/DavidPark/p/8551402.html
高立彬 http://www.cnblogs.com/gao628526/p/8551285.html
班庆泽 http://www.cnblogs.com/wsbqz/p/8641741.html

4.学习进度

posted @ 2018-03-25 20:39  顾家玮  阅读(375)  评论(8)    收藏  举报