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
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