计算机二级C语言-C程序设计题
原文链接:https://blog.csdn.net/weixin_43323830/article/details/106317383
/*
Author: Boohey
QQ: 3487267017
Date: June 8,2020
Version:
V1.0 初版
V1.1 部分答案格式的修改
*/
文章目录
- **计算机二级C语言-C程序设计题**
- 1 取整与取模
- 2【素数】
- 3 【排列】
- 4 因子
- 5 【字符游戏】【对称】
- 6 奇数偶数
- 7【寻寻觅觅】
- 8. 数组重拍列
- 9【字符串处理】
- 10【删除】
- 10-1.【删除】除了尾部的*号之外,串中其他 *号全部删除(删除中间、尾部*号)
- 10-2.【删除】除了字符串前导的*号之外,串中其他 *号全部删除(删除中间、尾部*号)
- 10-3.【删除】除了字符串中间的*号之外,串中其他 *号全部删除(删除头部、尾部*号)
- 10-4.【删除】将字符串头部的*号全部删除,保留其他
- 10-5.【删除】将字符串尾部的*号全部删除,保留其他
- 10-6.【删除】将字符串中的*号删除,保留其他
- 10-7.【删除】使字符串中间部的*号不多于n个
- 10-8. 【删除】使字符串前导*号不多于n个
- 10-9.【删除】删除一维数组中所有相同的数
- 10-10.【删除】删除一个字符串中指定下标的字符
- 10-11【删除】删除字符串中所有空格
- 10-12【删除】从字符串中删除指定的字符
- 11【胜者为王 吃肉 败者为寇 渣都没得】
- 12 【教务处】
- 12-1 【教务处】高于等于平均分的学生数据
- 12-2 【教务处】将低于平均分的人数作为函数值返回(数组)
- 12-3【教务处】【排序】【冒泡法】按分数降序排列
- 12-4【教务处】 低于平均分的学生数据
- 12-5【教务处】找出成绩最低的学生记录,通过形参返回主函数
- 12-6 【教务处】函数返回分数最低的学生人数
- 12-7 【教务处】去掉一个最高分和一个最低分,然后求平均值 8.6875
- 12-8【教务处】指定分数范围内
- 12-9 【教务处】N名学生的成绩已在主函数中放入一个带头结点的链表结构中78.625
- 12-10【教务处】找出成绩最高的学生记录
- 12-11【教务处】学生的平均分78.875
- 12-12 【教务处】n门课程的平均分71.08
- 12-13【教务处】把分数最高的学生数据
- 12-14 【教务处】分数最低的学生数据
- 12-15【教务处】链表结构 求出平均分
- 12-16 【教务处】链表结构 找出学生的最高分
- 12-17 【教务处】返回该学号的学生数据
- 14【计算】
- 14-1【计算】并输出如下多项式的值...n输入15,则输出为sn=1.718
- 14-2【计算】级数和 1.349859
- 14-3【计算】log函数 6.506583
- 14-4【计算】1+1/(1+2) 1.83333
- 14-5【计算】 m=12,n=8时,运行结果是495.0000
- 14-6【计算】 n个幂数之和 154.0000
- 14-7【计算】 当n=10时,函数值为0.909
- 14-8【计算】Fibonacci数列
- 14-9 【计算】3.140578
- 14-10【计算】534.188
- 14-10 【计算】 1.718282
- 14-11 【计算】 1.10000
- 14-12 【计算】 方差11.73
- 14-13【计算】每相邻两个元素的平均值的平方根之和
- 14-14 【计算】 0.6628
- 14-15 【计算】 1.718282
- 14-16 【计算】迭代方法
- 15 【人生能有几回搏】
- 16 数组寻寻觅觅
1 取整与取模
1-1 两位数的正整数a、b合并成一个整数
#include <stdio.h>
void fun(int a, int b, long *c)
{
int qian, bai, shi, ge;
qian = a % 10;
bai = b % 10;
shi = a / 10;
ge = b / 10;
*c = qian * 1000 + bai * 100 + shi * 10 + ge;
}
void main()
{ int a,b; long c;void NONO ();
printf("Input a, b:");
scanf("%d%d", &a, &b);
fun(a, b, &c);
printf("The result is: %ld\n", c);
NONO();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *rf, *wf ;
int i, a,b ; long c ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(rf, "%d,%d", &a, &b) ;
fun(a, b, &c) ;
fprintf(wf, "a=%d,b=%d,c=%ld\n", a, b, c) ;
}
fclose(rf) ;
fclose(wf) ;
}
考察知识点:
/相除取整数部分,%是取模,即取除法的余数。
1-2 很奇怪的车牌号 1369
正儿八经
#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable:4996)
struct BITS { int m3, m2, m1, m0; };
struct BITS fun(int n)
{
struct BITS res;
/* 在这里将函数代码补充完整 */
res.m0 = n % 10;
res.m1 = n / 10 %10;
res.m2 = n /100% 10;
res.m3 = n / 1000;
return res;
}
main( )
{ struct BITS a;
void NONO();
int i=0, n=0;
for (i=32; i<100; i++)
{ n = i * i;
a= fun(n);
if (a.m3 < a.m2 && a.m2 < a.m1 && a.m1 < a.m0)
printf("No. is %d\n", n);
}
NONO();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
struct BITS a;
FILE *fp ;
int i=0, n=0;
fp = fopen("out.dat","w") ;
for (i=32; i<100; i++)
{ n = i * i;
a= fun(n);
if (a.m3 < a.m2 && a.m2 < a.m1 && a.m1 < a.m0)
fprintf(fp, "No. is %d\n", n);
}
fclose(fp);
}
难度等级:☆☆☆☆☆
学点啥
1-3 统计各年龄段人数
考察知识点:
分段函数
#include <stdio.h>
# define N 50
# define M 11
void fun(int *a, int *b)
{
int i, j = 0;
/*对b中元素进行赋值,
避免其初始值不可预测出现错误*/
for (i = 0; i < M; i++)
{
b[i] = 0;
}
///*第一反应,稍繁琐*/
//for (j = 0; j < N; j++)
//{
// switch (a[j] / 10)
// {
// case 0: b[0]++; break;
// case 1: b[1]++; break;
// case 2: b[2]++; break;
// case 3: b[3]++; break;
// case 4: b[4]++; break;
// case 5: b[5]++; break;
// case 6: b[6]++; break;
// case 7: b[7]++; break;
// case 8: b[8]++; break;
// case 9: b[9]++; break;
// default:b[10]++;
// }
//}
/*对上述进行优化,简化写法*/
for (j = 0; j < N; j++)
{
if (a[j] >= 100)
{
b[10]++;
}
else
{
b[a[j] / 10]++;
}
}
}
double rnd()
{
static int t = 29, c = 217, m = 1024, r = 0;
r = (r*t + c) % m;
return((double)r / m);
}
void main()
{
FILE *wf;
int age[N], i, d[M];
int b[N] = { 32,45,15,12,86,49,97,3,44,52,17,95,63 };
for (i = 0; i < N; i++)
age[i] = (int)(115 * rnd()); /*产生一个随机的年龄数组*/
printf("The original data :\n");
for (i = 0; i < N; i++)
printf((i + 1) % 10 == 0 ? "%4d\n" : "%4d", age[i]); /*每行输出10个数*/
printf("\n\n");
fun(age, d);
for (i = 0; i < 10; i++)
printf("%4d---%4d :%4d\n", i * 10, i * 10 + 9, d[i]);
printf("Over 100 : %4d\n", d[10]);
/******************************/
wf = fopen("out.dat", "w");
fun(b, d);
for (i = 0; i < 10; i++)
fprintf(wf, "%4d---%4d :%4d\n", i * 10, i * 10 + 9, d[i]);
fprintf(wf, "Over 100 : %4d", d[10]);
fclose(wf);
/*****************************/
}
1-4 互不相同且无重复数字的三位数
正儿八经
#include <stdio.h>
#define max 100
int fun(int xxx[])
{
/*思路:无重复数字min123~max432*/
int i,k=0,ge,shi,bai;
for(i = 0; i < max; i++)
xxx[i] = 0;
for (i = 123; i <= 432; i++)
{
ge = i % 10;
shi = i / 10 % 10;
bai = i / 100;
/*数字均不相同,且由1-4组成*/
if (ge != shi && ge != bai && shi != bai&&1<=ge&&ge <=4 && 1 <= shi&&shi <= 4 && 1 <= bai &&bai<= 4)
{
printf("%4d", i);
xxx[k++] = i;
}
}
return k;
}
int main()
{
int xx[max],cnt;
void NONO(int xx[], int cnt);
cnt = fun(xx);
printf("符合条件的个数=%d\n", cnt);
NONO(xx, cnt);
return 0;
}
void NONO(int xx[], int cnt)
{
int i;
FILE *fp;
fp = fopen("out.dat", "w");
fprintf(fp, "%d\n", cnt);
for(i=0;i<cnt;i++)
fprintf(fp, "%d\n", xx[i]);
fclose(fp);
}
难度等级:☆☆☆☆☆
学点啥
1-5.四叶玫瑰树
#include<stdio.h>
#pragma warning (disable:4996)
int fun(int n, int result[])
{
int i,j,k=0, ge, shi, bai,qian;
for (i = 1000; i < n; i++)
{
ge = i % 10;
shi = i / 10 % 10;
bai = i / 100 % 10;
qian = i / 1000;
//for (j = 0; j < 4; j++)
//{
// ge *= ge;
// shi *= shi;
// bai *= bai;
// qian *= qian;
//}
if (i == (ge*ge*ge*ge + shi* shi*shi*shi + bai* bai*bai*bai + qian* qian*qian*))
{
result[k++] = i;
}
}
return k;
}
main( )
{
int result[10], n, i;
void NONO(int result[], int n);
n = fun(9999, result);
for(i=0; i<n; i++) printf("%d\n", result[i]);
NONO(result, n);
}
void NONO(int result[], int n)
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp ;
int i;
fp = fopen("out.dat","w") ;
fprintf(fp, "%d\n", n);
for(i=0; i<n; i++) fprintf(fp, "%d\n", result[i]);
fclose(fp);
}
难度等级:★★★★★☆☆☆☆
学点啥
注意:如下解法有误
int fun(int n, int result[])
{
int i,j,k=0, ge, shi, bai,qian;
for (i = 1000; i < n; i++)
{
ge = i % 10;
shi = i / 10 % 10;
bai = i / 100 % 10;
qian = i / 1000;
for (j = 0; j < 4; j++)
{
ge *= ge;
shi *= shi;
bai *= bai;
qian *= qian;
}
if (i == (ge + shi + bai + qian))
result[k++] = i;
}
return k;
}
错误原因:ge*ge*ge*ge
表达有误
五星数
int fun(int n, int result[])
{
int i,j,k=0, ge, shi, bai,qian,wan;
for (i = 10000; i < n; i++)
{
ge = i % 10;
shi = i / 10 % 10;
bai = i / 100 % 10;
qian = i / 1000%10;
wan = i / 10000;
j = ge*ge*ge*ge*ge + shi*shi*shi*shi*shi + bai*bai*bai*bai*bai + qian*qian*qian*qian*qian;
if (i == j)
{
result[k++] = i;
}
}
return k;
}
三叶草数
int fun(int n, int result[])
{
int i,j,k=0, ge, shi, bai,qian,wan;
for (i = 100; i < n; i++)
{
ge = i % 10;
shi = i / 10 % 10;
bai = i / 100;
j = ge*ge*ge +shi*shi*shi + bai*bai*bai;
if (i == j)
result[k++] = i;
}
return k;
}
1-6 能被e整除的元素个数 110
正儿八经
#include <stdio.h>
#pragma warning (disable:4996)
#define N 10
int fun(int x[], int e, int *sum)
{
int i,k=0;
*sum = 0;
for (i = 0; i<N; i++)
{
if (x[i] % e == 0)
k++;
else
(*sum) += x[i];
}
return k;
}
main()
{
void NONO();
int x[N] = {1, 7, 8, 6, 10, 15, 11, 13, 29, 31}, e = 3, n, sum;
n=fun(x, e, &sum);
printf("n=%d,sum=%d\n", n, sum);
NONO();
}
void NONO()
{
/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
输出数据,关闭文件。 */
int i, j, x[10], n, e, sum;
FILE *rf, *wf ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i=0; i<5; i++) {
for(j=0; j<10; j++) fscanf(rf, "%d ", &x[j]); fscanf(rf, "%d", &e);
n = fun( x, e, &sum );
fprintf(wf, "%d, %d\n", n, sum);
}
fclose(rf) ;
fclose(wf) ;
}
难度等级:☆☆☆☆☆
学点啥
1-7 被e整除
正儿八经
#include <stdio.h>
#pragma warning(disable:4996)
int fun(int x[], int n, int e, int *num)
{
int i, sum = 0.0;
*num = 0;
for (i = 0; i < n; i++)
{
if (x[i] % e == 0)
{
(*num)++;
sum += x[i];
}
}
return sum;
}
int main()
{
void NONO();
int x[] = {1, 9, 8, 6, 12}, num=0, sum;
sum = fun(x, 5, 3, &num);
printf("sum=%d,num=%d\n", sum, num);
NONO();
return 0;
}
void NONO( )
{
int x[100] = {1, 9, 8, 6, 12}, num, sum, i, j, count, e;
FILE *rf, *wf;
rf = fopen("in.dat","r");
wf = fopen("out.dat","w");
for(i=0;i<10;i++) {
num = 0;
sum = 0;
fscanf(rf, "%d,", &count);
for(j=0;j<count;j++)
fscanf(rf,"%d,",&x[j]);
fscanf(rf, "%d,", &e);
sum = fun(x, count, e, &num);
fprintf(wf, "sum=%d,num=%d\n", sum, num);
}
fclose(rf);
fclose(wf);
}
1-8 判断形参n中的正整数是几位数
雕虫小技
正儿八经
#include <stdio.h>
void NONO();
int fun(int n)
{
int k=1;
while (n / 10 > 0)
{
k++;
n /= 10;
}
return k;
}
void main()
{ int n, place ;
do{
printf("请输入一个4位以内的正整数: ");
scanf("%d", &n);
} while (n<0 || n>9999);
place = fun(n);
printf( "输入的数字是%d位\n", place );
NONO();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i, n, place ;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for( i=0; i<10; i++ )
{
fscanf(fp, "%d ", &n);
place = fun(n);
fprintf(wf, "%d\n", place);
}
fclose(fp) ;
fclose(wf) ;
}
难度等级:☆☆☆☆☆
学点啥
1-9 保留两位小数,并对第三位进行四舍五入
雕虫小技*
正儿八经
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
float fun (float h )
{
float y, result;
int x,jc, bl, qy;
y = h * 1000;//1234.56789
x = (int) y;//强制转换1234567
jc = x % 10;//四舍五入检测位 7
bl = x / 10 % 10;//保留位6
qy = x / 100;//其余12345
if (jc > 4)
bl++;
result = (qy * 10 + bl) / 100.0;
return result;
}
void main()
{
FILE *wf;
float a;
system("CLS");
printf("Enter a: ");
scanf ("%f",&a);
printf("The original data is : ");
printf("%f\n\n", a);
printf("The result : %f\n", fun(a));
/******************************/
wf=fopen("out.dat","w");
fprintf(wf,"%f",fun(8.32533));
fclose(wf);
/*****************************/
}
输出结果
为何错了?
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
float fun (float h )
{
/*单精度*1000+5,相当于对lg1000也即第3位
进行四舍五入,/10赋给长整型可截去第三位后小数点*/
int tmp = (int)(h*1000+5)/10;
/*/100,保留两位小数*/
return (float)tmp / 100.0;
}
void main()
{
FILE *wf;
float a;
system("CLS");
printf("Enter a: ");
scanf ("%f",&a);
printf("The original data is : ");
printf("%f\n\n", a);
printf("The result : %f\n", fun(a));
/******************************/
wf=fopen("out.dat","w");
fprintf(wf,"%f",fun(8.32533));
fclose(wf);
/*****************************/
}
难度等级:★★★★★☆☆☆☆
学点啥
1-10 整数部分和小数部分
正儿八经
#include <stdio.h>
#pragma warning (disable:4996)
void fun( double aa, int *x, double *y )
{
*x = (int)aa;
*y = aa - *x;
}
main()
{ void NONO();
double aa, b; int a;
printf("请输入一个双精度数: ");scanf("%lf",&aa);
fun( aa, &a, &b );
printf( "%f的整数部分是: %d 小数部分是%f\n", aa,a,b );
NONO();
}
void NONO()
{
FILE *in, *out ;
double aa, b; int a;
int i ;
in = fopen("in.dat","r") ;
out = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(in, "%lf", &aa) ;
fun( aa, &a, &b );
fprintf(out, "%f的整数部分是: %d 小数部分是%f\n", aa,a,b );
}
fclose(in) ;
fclose(out) ;
}
难度等级:☆☆☆☆☆
学点啥
1-11. w是一个大于10的无符号整数
雕虫小技
正儿八经
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
unsigned fun(unsigned w)
{
int i, n = 1, high = 1,t=w;
while (t / 10 > 0)
{
t /= 10;
n++;//确定n位数 例5923四位数
}
for (i = 0; i < n-1; i++)//10^(n-1)
high *= 10;
/*5923-5923/1000*1000*/
return w%high;
}
void main()
{
FILE *wf;
unsigned x;
system("CLS");
printf("Enter a unsigned integer number: ");
scanf ("%u",&x);
printf("The original data is:%u\n",x);
if(x<10)
printf("Data error! ");
else
printf ("The result :%u\n", fun(x));
/******************************/
wf=fopen("out.dat","w");
fprintf(wf,"%u",fun(5923));
fclose(wf);
/*****************************/
}
难度等级:★★★★★☆☆☆☆
学点啥
2【素数】
2-1【素数】将大于整数m且紧靠m的k个素数存入
思路1:
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
void fun(int m,int k,int xx[])
{
int i,j,n;
for (i = m + 1, n = 0; n < k; i++)//找出k个数字
{
for (j = 2; j < i; j++)//判断是否素数
{
if (i%j == 0)//非素数,跳出循环
break;
}
if (j >= i)//素数,则存入
xx[n++] = i;
}
}
void main()
{
FILE *wf;
int m,n,zz[1000];
system("CLS");
printf("\nPlease enter two integers: ");
scanf("%d%d",&m,&n);
fun(m, n, zz);
for(m=0;m<n;m++)
printf("%d ",zz[m]);
printf("\n ");
/******************************/
wf=fopen("out.dat","w");
fun(17,5,zz);
for(m=0;m<5;m++)
fprintf(wf,"%d ",zz[m]);
fclose(wf);
/*****************************/
}
输出结果:
思路2:
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
void fun(int m, int k, int xx[])
{
int i, j, n,temp;
for (i = m + 1, n = 0; n < k; i++)//找出k个数字
{
temp = sqrt(i);
for (j = 2; j < temp; j++)//判断是否素数
{
if (i%j == 0)//非素数,跳出循环
break;
}
if (j >= i)//素数,则存入
xx[n++] = i;
}
}
void main()
{
FILE *wf;
int m, n, zz[1000];
system("CLS");
printf("\nPlease enter two integers: ");
scanf("%d%d", &m, &n);
fun(m, n, zz);
for (m = 0; m < n; m++)
printf("%d ", zz[m]);
printf("\n ");
/******************************/
wf = fopen("out.dat", "w");
fun(17, 5, zz);
for (m = 0; m < 5; m++)
fprintf(wf, "%d ", zz[m]);
fclose(wf);
/*****************************/
}
输出结果:
学点啥:
如何判断素数?关键代码如下:
for (j = 2; j < i; j++)//判断是否素数
{
if (i%j == 0)//非素数,跳出循环
break;
}
/*遍历仍无除了2与本身的其他因子,则为素数,则存入*/
if (j >= i)
xx[n++] = i;
对代码具体分析如下:
判断i是否为素数,j自增,若i%j == 0
也即中途跳出循环,j必然未增至i;若j遍历从2增至到i仍无因子j >= i
,则i为素数,xx[n++] = i;
将其存入。
修改:将大于整数m且紧靠m的k个非素数存入
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
void fun(int m,int k,int xx[],int yy[])
{
int i,j,n;
for (i = m + 1, n = 0; n < k; i++)//找出k个数字
{
for (j = 2; j < i; j++)//判断是否素数
{
if (i%j == 0)//非素数,则存入
{
xx[n++] = i;
break;
}
}
//if (j >= i)//素数
// yy[n++] = i;
}
}
void main()
{
FILE *wf;
int m,n,zz[1000];
system("CLS");
printf("\nPlease enter two integers: ");
scanf("%d%d",&m,&n);
fun(m, n, zz);
for(m=0;m<n;m++)
printf("%d ",zz[m]);
printf("\n ");
/******************************/
wf=fopen("out.dat","w");
fun(17,5,zz);
for(m=0;m<5;m++)
fprintf(wf,"%d ",zz[m]);
fclose(wf);
/*****************************/
}
2-2【素数】3~n之间所有素数的平方根之和
#include <stdio.h>
#include <math.h>
double fun(int n)
{
int i,j,k;
double SumAve = 0.0;
for (i = 3; i <= n; i++)
{
k = sqrt(i);
for (j = 2; j <= k; j++)
if (i%j == 0)
break;
if (j >= k+1)
SumAve += sqrt(i);
}
return SumAve;
}
void main()
{int n;
double sum;
FILE *out;
printf("Input N=");
scanf("%d",&n);
sum=fun(n);
printf("\n\nsum=%f\n\n",sum);
/******************************/
out=fopen("out.dat","w");
fprintf(out,"%f\n",fun(180));
fclose(out);
/******************************/
}
学点啥
素数判断两种方法
素数又称质数。所谓素数是指除了 1 和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被 2~16 的任一整数整除。
**思路1):**因此判断一个整数m是否是素数,只需把 m 被 2 ~ m-1 之间的每一个整数去除,如果都不能被整除,那么 m 就是一个素数。
**思路2):**另外判断方法还可以简化。m 不必被 2 ~ m-1 之间的每一个整数去除,只需被 2 ~ 之间的每一个整数去除就可以了。如果 m 不能被 2 ~ 间任一整数整除,m 必定是素数。例如判别 17 是是否为素数,只需使 17 被 2~4 之间的每一个整数去除,由于都不能整除,可以判定 17 是素数。
**原因:**因为如果 m 能被 2 ~ m-1 之间任一整数整除,其二个因子必定有一个小于或等于 ,另一个大于或等于 。例如 16 能被 2、4、8 整除,16=2*8,2 小于 4,8 大于 4,16=4*4,4=√16
,因此只需判定在 2~4 之间有无因子即可。
两种思路的代码请看解析。
思路1
#include <stdio.h>
int main(){
int a=0; // 素数的个数
int num=0; // 输入的整数
printf("输入一个整数:");
scanf("%d",&num);
for(int i=2;i<num;i++){
if(num%i==0){
a++; // 素数个数加1
}
}
if(a==0){
printf("%d是素数。\n", num);
}else{
printf("%d不是素数。\n", num);
}
return 0;
}
思路2
#include <stdio.h>
#include <math.h>
void main(){
int m; // 输入的整数
int i; // 循环次数
int k; // m 的平方根
printf("输入一个整数:");
scanf("%d",&m);
// 求平方根,注意sqrt()的参数为 double 类型,这里要强制转换m的类型
k=(int)sqrt( (double)m );
for(i=2;i<=k;i++)
if(m%i==0)
break;
// 如果完成所有循环,那么m为素数
// 注意最后一次循环,会执行i++,此时 i=k+1,所以有i>k
if(i>k)
printf("%d是素数。\n",m);
else
printf("%d不是素数。\n",m);
return 0;
}
2-3【素数】求出小于或等于lim的所有素数
雕虫小技
直接F5运行,如下出现错误
原因 int fun(int lim, int aa[MAX]){ }
函数中无返回值。
修改如下:
int fun(int lim, int aa[MAX])
{
return 15;
}
正儿八经
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
int fun(int lim, int aa[MAX])
{
int i, j, k = 0;//素数个数初始化并幅值
for (i=2;i<=lim;i++)
{
for (j = 2; j < i; j++)
{
if (i%j == 0)
break;
}
if (j >= i)
aa[k++] = i;
}
return k;
}
void main()
{
FILE *wf;
int limit,i,sum;
int aa[MAX];
system("CLS");
printf("输入一个整数:");
scanf("%d",&limit);
sum=fun(limit,aa);
for(i=0;i<sum;i++)
{
if(i%10==0&&i!=0) /*每行输出10个数*/
printf("\n ");
printf("%5d ",aa[i]);
}
/******************************/
wf=fopen("out.dat","w");
sum=fun(15,aa);
for(i=0;i<sum;i++)
{
if(i%10==0&&i!=0) /*每行输出10个数*/
fprintf(wf,"\n");
fprintf(wf,"%5d ",aa[i]);
}
fclose(wf);
/*****************************/
}
难度等级:★★★★★☆☆☆☆
学点啥
2-4【素数】小于整数m的非素数存入xx所指数组中
雕虫小技
正儿八经
#include <stdio.h>
void fun( int m, int *k, int xx[] )
{
int i, j,*k=0;
for (i = 4; i < m; i++)
{
for (j = 2; j <= i; j++)
{
if (i%j == 0)
break;
}
if(i<j)
xx[(*k)++] = i;
}
}
void main()
{
int m, n, zz[100];
void NONO ( );
printf( "\nPlease enter an integer number between 10 and 100: " );
scanf( "%d", &n );
fun( n, &m, zz );
printf( "\n\nThere are %d non-prime numbers less than %d:", m, n );
for( n = 0; n < m; n++ )
printf( "\n %4d", zz[n] );
NONO();
}
void NONO()
{
/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
输出数据,关闭文件。 */
int m, n, zz[100];
FILE *rf, *wf ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
fscanf( rf, "%d", &n );
fun( n, &m, zz );
fprintf(wf, "%d\n%d\n", m, n );
for( n = 0; n < m; n++ )
fprintf(wf, "%d\n", zz[n] );
fclose(rf) ;
fclose(wf) ;
}
难度等级:★★★★★☆☆☆☆
学点啥
2-5 是否可以分解成两个素数相乘
正儿八经
#include<stdio.h>
#include<math.h>
int prime(int m)
{
int k,flag=1;
for(k=2;k<(int)sqrt((double)m);k++)
if(m%k==0)
flag=0;
return flag;
}
int fun(int n,int *x,int *y)
{
int k,flag=0;
for (k = 2; k < n; k++)// 优化 for (k = 2; k <=sqrt(n); k++)
if (n%k == 0)
{
*x = k;
*y = n / k;
if (prime(*x) && prime(*y))
{
flag = 1;
break;
}
}
return flag;
}
main()
{
int a,b;FILE *out ;
out = fopen("out.dat","w") ;
if(fun(111,&a,&b)) {
printf("111=%d*%d\n",a,b);
fprintf(out, "111=%d*%d\n",a,b);
}
if(fun(11111,&a,&b)) {
printf("11111=%d*%d\n",a,b);
fprintf(out, "11111=%d*%d\n",a,b);
}
if(fun(1111111,&a,&b)) {
printf("1111111=%d*%d\n",a,b);
fprintf(out,"1111111=%d*%d\n",a,b);
}
fclose(out);
getchar();
}
难度等级:☆☆☆☆☆
学点啥
判断是否素数代码
int prime(int m)
{
int k,flag=1;
for(k=2;k<(int)sqrt((double)m);k++)
if(m%k==0)
flag=0;
return flag;
}
2-6 哥德巴赫猜想
正儿八经
#include<stdio.h>
#include<math.h>
#pragma warning(disable:4996)
int prime(int n)
{ int k,flag=1;
for (k=2; k<=(int)sqrt((double)n); k++)
if (n%k == 0)
flag=0;
return flag;
}
int fun(int m, int a[])
{
int k, s, count, i=0;
for(k=6; k<=m; k+=2)
{ count = 0;
/* 请在此处填写代码 */
for (s = 2; s <= k / 2; s++)
{
if (prime(s) == 1 && prime(k - s) == 1)
count++;
}
/* 代码结束 */
if (count == 10) {
printf("%d\n", k);
a[i++] = k;
}
}
return i;
}
main( )
{ int count, a[100];
void NONO(int count, int a[]);
count = fun(999, a);
NONO(count, a);
}
void NONO(int count, int a[])
{
FILE *fp;
int i;
fp = fopen("out.dat","w") ;
for(i=0; i<count; i++)
fprintf(fp, "%d\n", a[i]);
fclose(fp);
}
难度等级:☆☆☆☆☆
学点啥
2-6. 能整除x且不是偶数的各整数
雕虫小技
正儿八经
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
void fun (int x, int pp[], int *n)
{
int i,k=0;
for (i=1;i<x;i++)
{
if (x%i == 0 && i%2 == 1)
{
pp[k++] = i;
}
}
*n = k;
return *n;
}
void main ()
{
FILE *wf;
int x,aa[1000], n, i ;
system("CLS");
printf("\nPlease enter an integer number : \n ") ;
scanf ("%d", &x) ;
fun (x, aa, &n) ;
for (i=0 ; i<n ; i++)
printf ("%d ", aa [i]);
printf ("\n ") ;
/******************************/
wf=fopen("out.dat","w");
fun (30, aa, &n) ;
for (i=0 ; i<n ; i++)
fprintf (wf,"%d ", aa [i]);
fclose(wf);
/*****************************/
}
难度等级:★☆☆☆☆
优化
void fun (int x, int pp[], int *n)
{
int i,k=0;
for (i=1;i<x;i=i+2)
{
if (x%i == 0)
pp[k++] = i;
}
*n = k;
return *n;
}
学点啥
3 【排列】
3-1 连续递增字母序列
#include <stdio.h>
#include <string.h>
void NONO();
int fun( char *t )
{
/********1*******/
//int flag = 1;
//char old_ch = t[0];
//char new_ch;
//int len = strlen(t);
//if (len < 2)
// return 0;
//for (int i = 1; t[i] != '\0'; i++)
//{
// new_ch = t[i];
// if (new_ch - old_ch!=1)
// {
// flag = 0;
// break;
// }
// old_ch = new_ch;
//}
//return flag;
/********2*******/
int flag = 1;
int len = strlen(t);
if (len < 2)
return 0;
while (*(t + 1))
{
if ((*(t + 1) - *t) != 1)
{
flag = 0;
}
t++;
}
return flag;
}
void main()
{ char s[26];
printf("请输入一个字母组成的字符串 : "); gets(s);
if( fun(s) ) printf("%s 是由连续字母组成的字符串.\n", s );
else printf("%s 不是由连续字母组成的字符串!\n", s );
NONO();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i;
char s[26], *p;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fgets(s, 26, fp);
p=strchr(s,'\n');
if(p) *p=0;
if (fun(s)) fprintf(wf, "%s\n", s+2);
else fprintf(wf, "%s\n", strrev(s));
}
fclose(fp) ;
fclose(wf) ;
}
学点啥
3-2 【排列】【冒泡法】其余5个字符按ASCII码降序排列
雕虫小技
正儿八经
#include <stdio.h>
#include <ctype.h>
#include <string.h>
void fun(char *s,int num)
{
int i,j;
char temp;
for (i = 1; i <= 5; i++)
{
for (j = i+1; j <=5; j++)
if (*(s+i) < *(s + j))
{
temp = *(s + j);
*(s + j) = *(s + i);
*(s + i) = temp;
}
}
}
void main()
{
void NONO( );
char s[10];
printf("输入7个字符的字符串:");
gets(s);
fun(s,7);
printf("\n%s",s);
NONO();
}
void NONO()
{
/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
输出数据,关闭文件。 */
char s[10] ;
FILE *rf, *wf ;
int i = 0 ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
while(i < 10) {
fgets(s,10,rf) ;
s[7] = 0 ;
fun(s,7);
fprintf(wf, "%s\n", s) ;
i++ ;
}
fclose(rf) ;
fclose(wf) ;
}
难度等级:★★☆☆☆
学点啥
4 因子
4-1.能被7或11整除
错误答案
#include <stdio.h>
void fun (int *a, int *n)
{
int i,j = 0;
for (i = 1; i <= 1000; i++)
{
if ((i % 7 == 0) || (i % 11 == 0) && (i % 77 != 0))
a[j++] = i;
}
return j;
}
void main( )
{ int aa[1000], n, k ;
void NONO ( );
fun ( aa, &n ) ;
for ( k = 0 ; k < n ; k++ )
if((k + 1) % 10 == 0) printf("\n") ;
else printf("%5d", aa[k]) ;
NONO( );
}
void NONO ( )
{/* 本函数用于打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/
int aa[1000], n, k ;
FILE *fp ;
fp = fopen("out.dat","w") ;
fun ( aa, &n ) ;
for ( k = 0 ; k < n ; k++ )
if((k + 1) % 10 == 0) fprintf(fp, "\n") ;
else fprintf(fp, "%5d", aa[k]) ;
fclose(fp) ;
}
原因分析
函数fun类型为void,无法返回值;而且并未利用给的n
正确答案
#include <stdio.h>
void fun (int *a, int *n)
{
int i,j = 0;
for (i = 1; i <= 1000; i++)
{
if ((i % 7 == 0) || (i % 11 == 0) && (i % 77 != 0))
a[j++] = i;
}
*n = j;
}
void main( )
{ int aa[1000], n, k ;
void NONO ( );
fun ( aa, &n ) ;
for ( k = 0 ; k < n ; k++ )
if((k + 1) % 10 == 0) printf("\n") ;
else printf("%5d", aa[k]) ;
NONO( );
}
void NONO ( )
{/* 本函数用于打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/
int aa[1000], n, k ;
FILE *fp ;
fp = fopen("out.dat","w") ;
fun ( aa, &n ) ;
for ( k = 0 ; k < n ; k++ )
if((k + 1) % 10 == 0) fprintf(fp, "\n") ;
else fprintf(fp, "%5d", aa[k]) ;
fclose(fp) ;
}
学点啥
4-2. 同时能被3与7整除的所有自然数之和
雕虫小技
正儿八经
#include <math.h>
#include <stdio.h>
double fun( int n)
{
int i,sum=0;
for (i = 0; i < n; i++)
{
if (i % 3 == 0 && i % 7 == 0)
sum += i;
}
return sqrt(sum);
}
void main() /* 主函数 */
{ void NONO ();
printf("s =%f\n", fun ( 1000) );
NONO();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i, n ;
double s;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(fp, "%d", &n) ;
s = fun(n) ;
fprintf(wf, "%f\n", s) ;
}
fclose(fp) ;
fclose(wf) ;
}
4-3 能被5或9整除 0.583333
雕虫小技
正儿八经
#include <stdio.h>
double fun(int n)
{
int i;
double sum = 0.0;
for (i = 1; i <= n; i++)
{
if (i % 5 == 0 || i % 9 == 0)
sum += 1.0 / i;
}
return sum;
}
void main()
{
int n;
double s;
FILE *out;
printf("\nInput n:");
scanf("%d",&n);
s=fun(n);
printf("\n\ns=%f\n",s);
/******************************/
out=fopen("out.dat","w");
fprintf(out,"%f\n",fun(30));
fclose(out);
/******************************/
}
难度等级:★★★★★☆☆☆☆
学点啥
double a = 4/3
double b = 4.0/3.0
前一个是按照整型计算 所以a是1.0
后一个是按照浮点型计算 所以 b是 1.333333
double fun(int n)
{
int i;
double sum = 0.0;
for (i = 1; i <= n; i++)
{
if (i % 5 == 0 || i % 9 == 0)
sum += 1 / i;//此处修改
}
return sum;
}
4-4 给定整数n的所有因子
雕虫小技
正儿八经
#include <stdio.h>
int fun(int n)
{
int i,j,sum=0;
for (i = 2; i < n; i++)
if (n%i == 0)
sum += i;
return sum;
}
void main()
{
int n,sum;
FILE *out;
printf("Input n:");
scanf("%d", &n);
sum=fun(n);
printf("sum=%d\n", sum);
/******************************/
out=fopen("out.dat","w");
fprintf(out,"%d\n",fun(123));
fprintf(out,"%d\n",fun(456));
fprintf(out,"%d\n",fun(789));
fprintf(out,"%d\n",fun(147));
fprintf(out,"%d",fun(258));
fclose(out);
/******************************/
}
难度等级:★★☆☆☆
学点啥
5 【字符游戏】【对称】
5-1 把1~m个字符,平移到字符串的最后(循环移动) ABCDEFGHIJK
#include <stdio.h>
#include <string.h>
#define N 80
void fun (char *w,int m)
{
int i, j;
char temp;
for (i = 1; i <= m; i++)
{
temp = w[0];
for (j = 1; w[j] != '\0'; j++)
{
w[j - 1] = w[j];
}
w[j - 1] = temp;
}
}
void main()
{
FILE *wf;
char a[N]= "ABCDEFGHIJK",b[N]= "ABCDEFGHIJK";
int m;
printf("The origina string :\n");
puts(a);
printf("\n\nEnter m: ");
scanf("%d",&m);
fun(a,m);
printf("\nThe string after moving :\n");
puts(a);
printf("\n\n");
/******************************/
wf=fopen("out.dat","w");
fun(b,3);
fprintf(wf,"%s",b);
fclose(wf);
/*****************************/
}
学点啥
经典的循环左移算法,多层嵌套用于控制移动的字符个数,也即需要进行循环的次数;
内层循环将第2个字符(含)以后的每个字符向前移动一个位置,然后将第一各字符放置到最后一个字符中。
换一种写法
#include <stdio.h>
#include <string.h>
#define N 80
void fun (char *w,int m)
{
int i, j;
char temp;
for (i = 0; i < m; i++)
{
temp = w[0];
for (j = 0; w[j] != '\0'; j++)
{
w[j] = w[j+1];
}
w[j] = temp;//代码错误行 ,修改前
}
}
void main()
{
FILE *wf;
char a[N]= "ABCDEFGHIJK",b[N]= "ABCDEFGHIJK";
int m;
printf("The origina string :\n");
puts(a);
printf("\n\nEnter m: ");
scanf("%d",&m);
fun(a,m);
printf("\nThe string after moving :\n");
puts(a);
printf("\n\n");
/******************************/
wf=fopen("out.dat","w");
fun(b,3);
fprintf(wf,"%s",b);
fclose(wf);
/*****************************/
}
输出结果(有误 )
应为DEFGHIJKABC,但输出是为DEFGHIJK
错误原因
故w[j] = temp;//代码错误行 ,修改前
表示将temp置于w[5],且并未显示。
#include <stdio.h>
#include <string.h>
#define N 80
void fun (char *w,int m)
{
int i, j;
char temp;
for (i = 0; i < m; i++)
{
temp = w[0];
for (j = 0; w[j] != '\0'; j++)
{
w[j] = w[j+1];
}
w[j-1] = temp; //代码错误行,修改后
}
}
void main()
{
FILE *wf;
char a[N]= "ABCDEFGHIJK",b[N]= "ABCDEFGHIJK";
int m;
printf("The origina string :\n");
puts(a);
printf("\n\nEnter m: ");
scanf("%d",&m);
fun(a,m);
printf("\nThe string after moving :\n");
puts(a);
printf("\n\n");
/******************************/
wf=fopen("out.dat","w");
fun(b,3);
fprintf(wf,"%s",b);
fclose(wf);
/*****************************/
}
运行结果
5-2 字符串中原有的字符串为"abcdefg",则调用该函数后,串中的内容"gfedCba"
@使用VC++201打开考生文件夹下progl中的解决方案◊此解决方案的顶目中包含一个源程序文件progl.c。在此程序中,例如,
字符串中原有的字符串为"abcdefg",则调用该函数后,串中的内容"gfedCba"
注意:部分源程序在文件pmgl.c中。
请勿改动主函数main和其他函数中的任何内容,仅在函数firn的花括号中填入你编写的若干语句。
#include <string.h>
#include <conio.h>
#include <stdio.h>
#define N 81
void fun(char*s)
{
char temp;
int m, n,i = 0;
m = n = strlen(s) - 1;
for (i=0;i < (n + 1) / 2;i++)
{
temp = s[i];
s[i] = s[m];
s[m] = temp;
m--;
}
}
void main()
{
char a[N];
FILE *out;
printf("Enter a string:");
gets(a);
printf("The original string is:");
puts(a);
fun(a);
printf("\n");
printf("The string after modified:");
puts(a);
strcpy(a,"Hello World!");
fun(a);
/******************************/
out=fopen("out.dat","w");
fprintf(out,"%s",a);
fclose(out);
/******************************/
}
学点啥
字符串倒写,思路是将第一各与最后一个交换,第二个遇到书第二个交换,直至中间字符;长度为n的交换n/2次,如长度6或者7都是交换3次。
再学点啥
写了一个新程序void leftMove(char*s,int leftMove)
,功能如下:将字符串s左移n位,左移溢出的移至末尾。如输入s为abcdefg,n=2,输出cdefgab。
//V。0 新建
//V1.1 增加输入左移位数
#include <string.h>
#include <conio.h>
#include <stdio.h>
#define N 81
void fun(char*s)
{
int i, j,temp,len;
//len = strlen(s);
//printf('%d',len);
for (i=0;i<6;i++)
{
//if (s[i + 1] != '\0')
temp = s[0];
for (j=0;j<6;j++)
{
if(s[j+1]!='\0')
s[j] = s[j + 1];
}
s[j] = temp;
}
}
void leftMove(char*s,int leftMove)
{
int i, j, temp, len;
for (i = 0; i < leftMove; i++)
{
//if (s[i + 1] != '\0')
temp = s[0];
for (j = 0; j < leftMove; j++)
{
if (s[j + 1] != '\0')
s[j] = s[j + 1];
}
s[j] = temp;
}
}
void main()
{
char a[N];
FILE *out;
printf("Enter a string:");
gets(a);
printf("The original string is:");
puts(a);
//fun(a);
leftMove(a, 1);
printf("\n");
printf("The string after modified:");
puts(a);
//strcpy(a,"Hello World!");
//fun(a);
/******************************/
out=fopen("out.dat","w");
fprintf(out,"%s",a);
fclose(out);
/******************************/
}
输出结果
a~f一共7个字母,输入大于等于7的数字会出错,如下:
期望:输入数字7k+i,i=0~6等同输入7,也即取模
//V。0 新建
//V1.1 新增输入左移位数输入
//V1.2 输入数字7k+i,i=0~6等同输入7,也即取模;
// 修复了之前版本显示数据有误的bug;
#include <string.h>
#include <conio.h>
#include <stdio.h>
#define N 81
void fun(char*s)
{
int i, j,temp,len;
//len = strlen(s);
//printf('%d',len);
for (i=0;i<6;i++)
{
//if (s[i + 1] != '\0')
temp = s[0];
for (j=0;j<6;j++)
{
if(s[j+1]!='\0')
s[j] = s[j + 1];
}
s[j] = temp;
}
}
void leftMove(char*s,int leftMove)
{
int i, j, temp, len,ModeLeftMove;
ModeLeftMove = leftMove % 7;
for (i = 0; i < ModeLeftMove; i++)
{
//if (s[i + 1] != '\0')
temp = s[0];
for (j = 0; j < 6/*len-1*/; j++)
{
if (s[j + 1] != '\0')
s[j] = s[j + 1];
}
s[j] = temp;
}
}
void main()
{
char a[N];
int M;
FILE *out;
printf("Enter a string:");
gets(a);
printf("LeftMove Number is:");
scanf("%d", &M);
printf("The original string is:");
puts(a);
//fun(a);
leftMove(a, M);
printf("\n");
printf("The string after modified:");
puts(a);
//strcpy(a,"Hello World!");
//fun(a);
/******************************/
out=fopen("out.dat","w");
fprintf(out,"%s",a);
fclose(out);
/******************************/
}
5-3 前导*号全部移到字符串的尾部
雕虫小技
正儿八经
#include <stdio.h>
void fun( char *a )
{
}
void main()
{ char s[81]; int n=0; void NONO ();
printf("Enter a string:\n");gets(s);
fun( s );
printf("The string after moveing:\n");puts(s);
NONO();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *in, *out ;
int i ; char s[81] ;
in = fopen("in.dat","r") ;
out = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(in, "%s", s) ;
fun(s) ;
fprintf(out, "%s\n", s) ;
}
fclose(in) ;
fclose(out) ;
}
编写:
思路1:首先统计前导*个数k,然后利用贪吃蛇模型左移k
void fun( char *a )
{
/*思路:循环左移,直到非*也即字母为止*/
int i,j,k=0;
char temp;
for (i = 0; a[i] == '*'; i++)
if (a[i] == '*')
k++;// star个数
for (i = 0; i < k; i++)
{
temp = a[0];
for (j = 1; a[j] != '\0'; j++)
a[j - 1] = a[j];
a[j - 1] = temp;
}
}
思路2:首先统计前导个数k,然后前导后的字符输出,再前导*输出
void fun(char *a)
{
int i=0, k = 0;
char *p;
p = a;
while (*p == '*')
{
k++;// count star number
p++;//pointer
}
/*前导*后的字符输出*/
while (*p)
{
a[i] = *p;
i++;
p++;
}
/*前导*输出*/
while (k > 0)
{
a[i] = '*';
i++;
k--;
}
/*结束符*/
a[i] = '\0';
}
难度等级:★★☆☆☆
学点啥
5-4.回文
雕虫小技
正儿八经
#include <stdio.h>
#define N 80
int fun(char *str)
{
}
void main()
{
char s[N];
FILE *out;
char *test[]={"1234321","123421","123321","abcdCBA"};
int i;
printf("Enter a string : ");
gets(s);
printf("\n\n");
puts(s);
if(fun(s))
printf("YES\n");
else
printf("NO\n");
/************************************/
out=fopen("out.dat","w");
for(i=0;i<4;i++)
if(fun(test[i]))
fprintf(out,"YES\n");
else
fprintf(out,"NO\n");
fclose(out);
/************************************/
}
思路1:
int fun(char *str)
{
int i = 0, k=0,flag=1;
char *t;
t = str;
while (*t)
{
t++;
k++;
}
for (i = 0; i < k / 2; i++)
{
if (str[i] == str[k - 1 - i])
;
else
{
flag = 0;
break;
}
}
return flag;
}
思路2:
int fun(char *str)
{
char *f, *t;
f = str;
t = str + strlen(str) - 1;
while ((*f == *t) && (f < t)) {
f++; t--;
};
if (f < t) return 0;
else return 1;
}
难度等级:★★★★★☆☆☆☆
学点啥
5-6. 数组元素平移到数组的最后
雕虫小技
正儿八经
#include <stdio.h>
#define N 80
void fun(int *w, int p, int n)
{
int i,j,temp;
for (i = 0; i <= p; i++)
{
temp = w[0];
for(j=1;j<n;j++)
w[j-1] = w[j];
w[n - 1] = temp;
}
}
void main()
{ int a[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int i,p,n=15;void NONO ();
printf("The original data:\n");
for(i=0; i<n; i++)printf("%3d",a[i]);
printf("\n\nEnter p: ");scanf("%d",&p);
fun(a,p,n);
printf("\nThe data after moving:\n");
for(i=0; i<n; i++)printf("%3d",a[i]);
printf("\n\n");
NONO();
}
void NONO ()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE *rf,*wf ; int a[N], i, j, p, n ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 5 ; i++) {
fscanf(rf, "%d %d", &n, &p) ;
for(j = 0 ; j < n ; j++) fscanf(rf, "%d", &a[j]) ;
fun(a, p, n) ;
for(j = 0 ; j < n ; j++) fprintf(wf, "%3d", a[j]) ; fprintf(wf, "\n") ;
}
fclose(rf) ; fclose(wf) ;
}
难度等级:★★★★★☆☆☆☆
学点啥
6 奇数偶数
6-1 s所指字符串中下标为偶数同时ASCII值为奇数的字符删除
#include <stdio.h>
#include <string.h>
void fun(char *s, char t[])
{
int i,j=0;
for (i=0;i<100;i++)
{
if (s[i] % 2 == 0)//even
{
t[j++] = s[i];
}
}
}
void main()
{
char s[100], t[100];void NONO ();
printf("\nPlease enter string S:"); scanf("%s", s);
fun(s, t);
printf("\nThe result is: %s\n", t);
NONO();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
char s[100], t[100] ;
FILE *rf, *wf ;
int i ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(rf, "%s", s) ;
fun(s, t) ;
fprintf(wf, "%s\n", t) ;
}
fclose(rf) ;
fclose(wf) ;
}
学点啥
6-2. ASCII码值为偶数的字符删除
雕虫小技
正儿八经
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
void fun(char *s, char t[])
{
int i,j=0;
for (i = 0; s[i] != '\0'; i++)
{
if (s[i] % 2 != 0)
t[j++] = s[i];
}
t[j] = 0;
}
void main()
{
FILE *wf;
char s[100],t[100];
system("CLS");
printf("\nPlease enter string S: ");
scanf("%s",s);
fun(s,t);
printf("\nThe result is :%s\n",t);
/******************************/
wf=fopen("out.dat","w");
fun("ABCDEFG12345",t);
fprintf(wf,"%s",t);
fclose(wf);
/*****************************/
}
难度等级:★★★★★☆☆☆☆
学点啥
写法2:
void fun(char *s, char t[])
{
int j=0;
for (; *s != '\0'; s++)
{
if (*s % 2 != 0)
t[j++] = *s;
}
t[j] = 0;//t[j] = '\0';
}
6-3 ss所指字符串中所有下标为奇数位置的字母转化为大写
雕虫小技
正儿八经
#include<conio.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void fun(char *ss)
{
int i;
for (i = 0; ss[i]!='\0'; i++)
{
if (i % 2 == 1&&'a'<=ss[i]<='z')
ss[i] = ss[i]-32;
}
}
void main()
{
FILE *wf;
char tt[81],s[81]="abc4Efg";
system("CLS");
printf("\nPlease enter an string within 80 characters:\n");
gets(tt);
printf("\n\nAfter changing, the string\n %s",tt);
fun(tt);
printf("\nbecomes\n %s\n",tt);
/******************************/
wf=fopen("out.dat","w");
fun(s);
fprintf (wf,"%s",s);
fclose(wf);
/*****************************/
}
6-4 统计出这些数的奇数、偶数个数
#include <stdio.h>
#pragma warning (disable:4996)
#define N 11
double fun( int xx[], int *yy )
{
int i, odd_count = 0, even_count = 0;
double even_total = 0.0, odd_total = 0.0,ave;
for (i=0;i<N;i++)
{
if (xx[i] % 2 == 0)
{
even_count++;
even_total += xx[i];
}
else
{
odd_count++;
odd_total += xx[i];
}
if (even_count > odd_count)
{
*yy = even_count;
ave = even_total / even;
}
else
{
*yy = odd_count;
ave = odd_total / odd;
}
}
return ave;
}
main()
{
int yy, xx[N]={1101,1202,1303,1404,1505,2611,2712,2813,2914,3202,4222};
double pjz ;
void NONO();
pjz = fun( xx, &yy );
printf("yy=%d, pjz=%.2lf\n", yy, pjz);
NONO();
}
void NONO()
{
/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
输出数据,关闭文件。 */
int i, j, xx[N], yy;
double pjz;
FILE *rf, *wf ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i=0; i<10; i++) {
for(j=0; j<N; j++) fscanf(rf, "%d ", &xx[j]);
pjz = fun( xx, &yy );
fprintf(wf, "%d, %.2lf\n", yy, pjz);
}
fclose(rf) ;
fclose(wf) ;
}
学点啥
对于函数fun而言,yy为指针变量,可以传递数值
//代码不全
double fun( int xx[], int *yy )
{
//
return ave;
}
且由输出可得,yy为个数,pjz为平均值
pjz = fun( xx, &yy );
printf("yy=%d, pjz=%.2lf\n", yy, pjz);
故而有
//代码不全
if (even_count > odd_count)
{
*yy = even_count;
ave = even_total / even_count;
}
else
{
*yy = odd_count;
ave = odd_total / odd_count;
}
}
return ave;
yy传递地址, pjz = fun( xx, &yy );
读取yy地址,即可得所求个数;
平均值由fun返回。
优化
double fun( int xx[], int *yy )
{
int i, j, num_odd = 0, num_even = 0;
double sum_odd = 0.0, sum_even = 0.0, sum = 0.0;
for (i = 0; i<N; i++)
{
if (xx[i] % 2 == 0)//even
{
sum_even += xx[i];
num_even++;
}
else //odd
{
sum_odd += xx[i];
num_odd++;
}
}
sum = sum_even > sum_odd ? sum_even : sum_odd;
*yy = num_even > num_odd ? num_even : num_odd;
return sum / (*yy);
//if (sum_even > sum_odd)
//{
// *yy = num_even;
// return sum_even / (*yy);
//}
//else
//{
// *yy = num_odd;
// return sum_odd / (*yy);
//}
}
难度等级:★★★★★☆☆☆☆
学点啥
6-5 数组中偶数的个数
雕虫小技
正儿八经
#include <stdio.h>
#pragma warning (disable:4996)
#define N 8
int fun(int x[],double *ave)
{
int i, k = 0;
double sum = 0.0;
for (i=0;i<N;i++)
{
if (x[i] % 2 == 0)
{
k++;
sum += x[i];
}
}
*ave = sum / k;
return k;
}
main()
{ int x[N]={ 12,5,9,8,23,4,7,21 }, n;
double ave;
void NONO();
n=fun(x,&ave);
printf("n=%d,ave=%lf\n",n,ave);
NONO();
}
void NONO ()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE *in, *out ;
int i,j, x[N], n ;
double ave;
in = fopen("in.dat","r") ;
out = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
for(j=0 ; j < N; j++) fscanf(in, "%d,", &x[j]) ;
n=fun(x,&ave);
fprintf(out, "n=%d,ave=%lf\n",n,ave);
}
fclose(in) ;
fclose(out) ;
}
难度等级:★★★★★☆☆☆☆
学点啥
7【寻寻觅觅】
7-1 【寻寻觅觅】统计一行字符串中单词的个数
正儿八经
#include<string.h>
#include<stdio.h>
#define N 80
int fun(char *s)
{
}
void main()
{
FILE *wf;
char line[N];
int num=0;
printf("Enter a string:\n ");
gets(line);
num=fun(line);
printf("The number of word is:%d\n\n ",num);
/******************************/
wf=fopen("out.dat","w");
fprintf(wf,"%d",fun("a big car"));
fclose(wf);
/*****************************/
}
函数编写
/*错误原因:以下函数实际计算的是空格数,+1即为单词数*/
//int fun(char *s)
//{
// /*错误原因:以下函数实际计算的是空格数,+1即为单词数
// 输入a big car 2个空格判定单词数为3 正确
// 输入a big car 3个空格误判单词数为4 错误
// 输入 a big car 3个空格误判单词数为4 错误
// */
//
// int i, k=1;
//
// for (i = 0; s[i] != '\0'; i++)
// {
// if (s[i] == ' ')
// k++;
// }
// return k;
//}
正解
int fun(char *s)
{
int i, k=1;
for (i = 0; s[i] != '\0'; i++)
{
/*当前为字母且下一个字符为空格或者结束符,判定为单词*/
if (s[i] != ' '&&(s[i+] == ' '|| s[i + ] == '\0'))
k++;
}
return k;
}
难度等级:★★★★★☆☆☆☆
学点啥
int fun(char *s)
{
int k = 0, flag = 0;
while (*s != '\0')
{
if (*s != ' ' && flag == 0)
{
k++; flag = 1;
}
if (*s == ' ')
flag = 0;
s++;
}
return k;
}
单词非空格且flag为0(flag初始值为0)时断定发现新单词,计数+1,flag置1;直至遇到下一个空格,flag清0
7-2 【寻寻觅觅】二维数组中字母A和C的个数
#include <stdio.h>
#include <stdlib.h>
#define M 14
void NONO();
void fun( char (*t)[M], int *a ,int *c)
{
int i,j;
*a = 0; *c = 0;
for (i=0;i<M;i++)
{
for (j = 0; j < M; j++)
{
if (t[i][j]== 'A')
(*a)++;
if (t[i][j] == 'C')
(*c)++;
}
}
}
void get( char (*s)[M] )
{ int i, j;
for( i=0; i<M; i++ )
{ for( j=0; j<M; j++)
{ s[i][j]=65+rand()%12; printf( "%c ",s[i][j]); }
printf("\n");
}
}
void main()
{ char a[M][M];
int x, y;
get (a);
fun ( a, &x,&y );
printf("A = %d C = %d\n",x,y);
NONO();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i, j, x, y ;
char a[M][M];
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for( i=0; i<M; i++ )
{ for( j=0; j<M; j++)
{ fscanf(fp, "%c ", &a[i][j]); }
}
fun ( a, &x,&y );
fprintf(wf, "A=%d\n", x) ;
fprintf(wf, "C=%d\n", y) ;
fclose(fp) ;
fclose(wf) ;
}
学点啥
7-3 查找x在s所指数组中下标的位置(数组)
#include <stdio.h>
#include <stdlib.h>
#define N 15
void NONO();
int fun( int *s, int x)
{
int i;
for (i=0;i<N;i++)
{
if (s[i] == x)
return i;
}
return -1;
}
void main()
{ int a[N]={ 29,13,5,22,10,9,3,18,22,25,14,15,2,7,27},i,x,index;
printf("a数组中的数据 :\n");
for(i=0; i<N; i++) printf("%4d",a[i]); printf("\n");
printf("给x输入待查找的数 : "); scanf("%d",&x);
index=fun( a, x );
printf("index=%d\n",index);
NONO();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i, j, a[10], x, index;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
for(j = 0 ; j < 10 ; j++) {
fscanf(fp, "%d ", &a[j]);
}
fscanf(fp, "%d", &x);
index = fun(a, x);
fprintf(wf, "%d\n", index);
}
fclose(fp);
fclose(wf);
}
学点啥
7-4 求出数组的最大元素在数组中的下标(数组)
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
int fun(int *s,int t,int *k)
{
int i,max;
*k = 0;
for (i = 0; i < t; i++)
{
if (s[*k] < s[i])
{
*k = i;
}
}
return s[*k];
}
void main()
{
FILE *wf;
int a[10]={ 876,675,896,101,301,401,980,431,451,777},k;
system("CLS");
fun(a, 10, &k);
printf("%d, %d\n ", k, a[k]);
/******************************/
wf=fopen("out.dat","w");
fprintf (wf,"%d, %d", k, a[k]);
fclose(wf);
/*****************************/
}
学点啥
8. 数组重拍列
8-1.二维数组中的数据,按照列的顺序依次放到一维数组中
#include <stdio.h>
void fun (int (*s)[10], int *b, int *n,int mm, int nn)
{
int i, j, k=0;
for (j = 0; j <nn ;j++)
{
for (i = 0; i <mm ;i++)
{
b[*n] = *(*(s+i)+j);
(*n)++;
}
}
}
void main()
{
int w[10][10]={{33,33,33,33},{44,44,44,44},{55,55,55,55}}, i, j;
int a[100]={0},n=0 ;
FILE *out;
printf("The matrix:\n");
for (i=0; i<3; i++)
{for (j=0;j<4;j++)
printf("%3d",w[i][j]);
printf("\n");
}
fun(w,a,&n,3,4);
/******************************/
out=fopen("out.dat","w");
printf("The A array:\n");
for(i=0; i<n; i++)
{ printf("%3d",a[i]);
fprintf(out,"%d ",a[i]);
}
printf("\n\n");
fclose(out);
/******************************/
}
学点啥
**摘选**
int *(p1[5]); //指针数组,可以去掉括号直接写作 int *p1[5];
int (*p2)[5]; //二维数组指针,不能去掉括号
指针数组和二维数组指针有着本质上的区别:指针数组是一个数组,只是每个元素保存的都是指针,以上面的 p1 为例,在32位环境下它占用 4×5 = 20 个字节的内存。二维数组指针是一个指针,它指向一个二维数组,以上面的 p2 为例,它占用 4 个字节的内存。
…
3) *(p+1)+1表示第 1 行第 1 个元素的地址。如何理解呢?
*(p+1)单独使用时表示的是第 1 行数据,放在表达式中会被转换为第 1 行数据的首地址,也就是第 1 行第 0 个元素的地址,因为使用整行数据没有实际的含义,编译器遇到这种情况都会转换为指向该行第 0 个元素的指针;就像一维数组的名字,在定义时或者和 sizeof、& 一起使用时才表示整个数组,出现在表达式中就会被转换为指向数组第 0 个元素的指针。
- ((p+1)+1)表示第 1 行第 1 个元素的值。很明显,增加一个 * 表示取地址上的数据。
举一反三 二维数组中的数据,按照行的顺序依次放到一维数组中。
#include <stdio.h>
void fun (int (*s)[10], int *b, int *n,int mm, int nn)
{
int i, j;
for (i = 0; i <mm ;i++)//行下标控制
{
for (j = 0; j <nn ;j++)//列下标控制
{
b[*n] = *(*(s+j)+i);
(*n)++;//通过指针返回元素个数
}
}
}
void main()
{
int w[10][10]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}, i, j;
int a[100]={0},n=0 ;
FILE *out;
printf("The matrix:\n");
for (i=0; i<3; i++)
{for (j=0;j<4;j++)
printf("%3d",w[i][j]);
printf("\n");
}
fun(w,a,&n,3,4);
/******************************/
out=fopen("out.dat","w");
printf("The A array:\n");
for(i=0; i<n; i++)
{ printf("%3d",a[i]);
fprintf(out,"%d ",a[i]);
}
printf("\n\n\n\n");
fclose(out);
/******************************/
}
运行结果:有误
原因分析:
for (i = 0; i <mm/*mm=3;ROW*/ ;i++)//行下标控制
{
for (j = 0; j <nn /*nn=4;COLUMN*/;j++)//列下标控制
{
b[*n] = *(*(s+j)+i);
(*n)++;//通过指针返回元素个数
}
}
由于第3行未赋值,默认为0
/***************************************/
时间线发散-关于数组赋值:
如果赋值了一项其余就是0,如果是int a[10]={1}其余各项就是0;如果只有int a[10]那么就是随机数。
#include <stdio.h>
void main()
{
int s1[10] = { 1 }, s2[10];
printf("s1[0]=%d,s1[1]=%d\n", s1[0], s1[1]);
printf("s2[0]=%d,s2[1]=%d\n", s2[0], s2[1]);
}
输出结果
/***************************************/
修改后
#include <stdio.h>
void fun (int (*s)[10], int *b, int *n,int mm, int nn)
{
int i, j;
for (i = 0; i <mm ;i++)//行下标控制
{
for (j = 0; j <nn ;j++)//列下标控制
{
b[*n] = *(*(s+i)+j);
(*n)++;//通过指针返回元素个数
}
}
}
void main()
{
int w[10][10]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}, i, j;
int a[100]={0},n=0 ;
FILE *out;
printf("The matrix:\n");
for (i=0; i<3; i++)
{for (j=0;j<4;j++)
printf("%3d",w[i][j]);
printf("\n");
}
fun(w,a,&n,3,4);
/******************************/
out=fopen("out.dat","w");
printf("The A array:\n");
for(i=0; i<n; i++)
{ printf("%3d",a[i]);
fprintf(out,"%d ",a[i]);
}
printf("\n\n\n\n");
fclose(out);
/******************************/
}
关键代码为:
for (i = 0; i <mm/*mm=ROW*/ ;i++)//行下标控制
{
for (j = 0; j <nn/*nn=COLUMN*/ ;j++)//列下标控制
{
b[*n] = *(*(s+i)+j);
(*n)++;//通过指针返回元素个数
}
输出结果为:
8-2. 按顺序合并成一个新的字符串
雕虫小技
正儿八经
#include <stdio.h>
#include <conio.h>
#define M 3
#define N 20
void fun(char a[M][N],char *b)
{
int i, j,k=0;
for(i=0;i<M;i++)
for (j = 0; a[i][j]!='\0'; j++)
b[k++] = a[i][j];
b[k] = '\0';
}
void main()
{
FILE *wf;
char w[M][N]={"AAAA", "BBBBBBB", "CC"},i;
char a[100]={ " ##############################"};
printf("The string:\n ");
for(i=0;i<M;i++)
puts(w[i]);
printf("\n ");
fun(w,a);
printf("The A string:\n ");
printf("%s ",a);
printf("\n\n ");
/******************************/
wf=fopen("out.dat","w");
fprintf(wf,"%s",a);
fclose(wf);
/*****************************/
}
难度等级:★★★★★☆☆☆☆
学点啥
如下代码输出结果为:
void fun(char a[M][N],char *b)
{
int i, j,k=0;
for(i=0;i<M;i++)
for (j = 0; j < N; j++)//区别
b[k++] = a[i][j];
b[k] = '\0';
}
为何会失误呢?
#define N 20
//
char w[M][N]={"AAAA", "BBBBBBB", "CC"},i;
故会遇到结束符’\0’
#include <stdio.h>
void fun(char p1[], char p2[])
{
int i, j,len1,len2;
for (i = 0; p1[i] != 0; i++)
;
for (j = 0; p2[j] != 0; j++)
p1[i++] = p2[j];
p1[i] = 0;
}
void main()
{ char s1[80], s2[40] ;void NONO ();
printf("Enter s1 and s2:\n") ;
scanf("%s%s", s1, s2) ;
printf("s1=%s\n", s1) ;
printf("s2=%s\n", s2) ;
printf("Invoke fun(s1,s2):\n") ;
fun(s1, s2) ;
printf("After invoking:\n") ;
printf("%s\n", s1) ;
NONO() ;
}
void NONO ()
{/* 本函数用于打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/
int i ;
FILE *rf, *wf ;
char s1[80], s2[40] ;
rf = fopen(“in.dat”,“r”) ;
wf = fopen(“out.dat”,“w”) ;
for(i = 0 ; i < 10 ; i++) {
fscanf(rf, “%s”, s1) ;
fscanf(rf, “%s”, s2) ;
fun(s1, s2) ;
fprintf(wf, “%s\n”, s1) ;
}
fclose(rf) ;
fclose(wf) ;
}
8-3. 按列的顺序依次放到一个字符串中
雕虫小技
正儿八经
#include<stdio.h>
#define M 3
#define N 4
void fun(char (*s)[N],char *b)
{
int i, j, k=0;
for (j = 0; j < N; j++)
for (i = 0; i < M; i++)
b[k++] = s[i][j];
b[k] = '\0';
}
void main()
{
FILE *wf;
char a[100],w[M][N]={{ 'W', 'W', 'W', 'W'},{'S', 'S', 'S', 'S'},{'H', 'H', 'H', 'H'}};
int i,j;
printf("The matrix:\n");
for(i=0;i<M;i++)
{ for(j=0;j<N;j++)
printf("%3c",w[i][j]);
printf("\n");
}
fun(w,a);
printf("The A string:\n");
puts(a);
printf("\n\n");
/******************************/
wf=fopen("out.dat","w");
fprintf(wf,"%s",a);
fclose(wf);
/*****************************/
}
难度等级:★★★★★☆☆☆☆
学点啥
8-4 实现两个字符串的连接
雕虫小技
正儿八经
#include <stdio.h>
void fun(char p1[], char p2[])
{
int i, j,len1,len2;
for (i = 0; p1[i] != 0; i++)
;
for (j = 0; p2[j] != 0; j++)
p1[i++] = p2[j];
p1[i] = 0;
}
void main()
{ char s1[80], s2[40] ;void NONO ();
printf("Enter s1 and s2:\n") ;
scanf("%s%s", s1, s2) ;
printf("s1=%s\n", s1) ;
printf("s2=%s\n", s2) ;
printf("Invoke fun(s1,s2):\n") ;
fun(s1, s2) ;
printf("After invoking:\n") ;
printf("%s\n", s1) ;
NONO() ;
}
void NONO ()
{/* 本函数用于打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/
int i ;
FILE *rf, *wf ;
char s1[80], s2[40] ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(rf, "%s", s1) ;
fscanf(rf, "%s", s2) ;
fun(s1, s2) ;
fprintf(wf, "%s\n", s1) ;
}
fclose(rf) ;
fclose(wf) ;
}
难度等级:★★★★★☆☆☆☆
学点啥
9【字符串处理】
9-1 将数字字符串转换成与其面值相同的长整型整数 2354210
#include <stdio.h>
#include <string.h>
void NONO();
long fun( char *s )
{
int i,sum=0,len;
len = strlen(s);
for (i = 0; i < len; i++)
{
sum = sum * 10 + *s-48;
s++;
}
return sum;
}
void main()
{ char s[10]; long r;
printf("请输入一个长度不超过9个字符的数字字符串 : "); gets(s);
r = fun( s );
printf(" r = %ld\n" , r );
NONO();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i; long r;
char s[10], *p;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fgets(s, 10, fp);
p = strchr(s, '\n');
if (p) *p = 0;
r = fun(s);
fprintf(wf, "%ld\n", r);
}
fclose(fp) ;
fclose(wf) ;
}
学点啥
数字字符串转化为相应的数字,需要ASCII码-48,不知道这个数字也无所谓,可以输入一个数字如1,显示49试出来
9-2. 数字字符串转换为一个整数
雕虫小技
正儿八经
#include <stdio.h>
#include <string.h>
long fun ( char *p)
{
int np=1;//判定正负数
long rst=0;
if (*p == '-')
{
np = -1;
p++;
}
else if (*p == '+')
p++;
while (*p != '\0')
{
rst = rst * 10 + *p - '0';
p++;
}
return rst*np;
}
void main() /* 主函数 */
{ char s[6];void NONO ();
long n;
printf("Enter a string:\n") ;
gets(s);
n = fun(s);
printf("%ld\n",n);
NONO ( );
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i ;
char s[20] ;
long n ;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(fp, "%s", s) ;
n = fun(s);
fprintf(wf, "%ld\n", n) ;
}
fclose(fp) ;
fclose(wf) ;
}
难度等级:★★★★★☆☆☆☆
学点啥
9-3 比较字符串的长度
雕虫小技
正儿八经
#include <stdio.h>
char *fun ( char *s, char *t)
{
}
void main ( )
{ char a[20],b[20];
void NONO ( );
printf("Input 1th string:");
gets( a);
printf("Input 2th string:");
gets( b);
printf("%s\n",fun (a, b));
NONO ();
}
void NONO ( )
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf;
int i ;
char a[20], b[20];
fp = fopen("in.dat","r");
wf = fopen("out.dat","w");
for(i = 0 ; i < 10 ; i++) {
fscanf(fp, "%s %s", a, b);
fprintf(wf, "%s\n", fun(a, b));
}
fclose(fp);
fclose(wf);
}
解答
解答1:
char *fun ( char *s, char *t)
{
return strlen(s) < strlen(t) ? t : s;
}
解答2:
char *fun ( char *s, char *t)
{
int i, j;
for (i = 0; s[i]; i++);
for (j = 0; s[j]; j++);
return i < j ? t : s;
}
难度等级:★★☆☆☆
学点啥
9-4 形参s所指字符串放入形参a所指的字符串中
难度等级:★★☆☆☆
#include <stdio.h>
#define N 20
void NONO();
void fun( char *a , char *s)
{
int i=0;
while (*s != '\0')
{
*a = *s;
a++;
s++;
}
*a = '\0';
}
void main()
{ char s1[N], *s2="abcdefghijk";
fun( s1,s2);
printf("%s\n", s1);
printf("%s\n", s2);
NONO();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i;
char s1[256], s2[256];
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fgets(s2, 255, fp);
fun(s1,s2);
fprintf(wf, "%s", s1);
}
fclose(fp) ;
fclose(wf) ;
}
学点啥
注意程序要求不能使用字符串函数,故应使用指针
10【删除】
10-1.【删除】除了尾部的*号之外,串中其他 号全部删除(删除中间、尾部号)
#include <stdio.h>
void fun( char *a, char *p )
{
int i = 0,j = 0;
char *pt;
pt = a;
/* p之前删除* */
while(pt<p)
{
if (*pt != '*')
{
*(a+i) = *pt;
i++;
}
pt++;
}
/*p之后不变*/
while (*(p+j))
{
*(a+i) = *(p+j);
i++;
p++;
}
/*增加结束符*/
*(a+i) = '\0';
}
void main()
{ char s[81],*t;
void NONO ( );
printf("Enter a string:\n");gets(s);
t=s;
while(*t)t++;
t--;
while(*t=='*')t--;
fun( s , t );
printf("The string after deleted:\n");puts(s);
NONO();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *in, *out ;
int i ; char s[81],*t ;
in = fopen("in.dat","r") ;
out = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(in, "%s", s) ;
t=s;
while(*t)t++;
t--;
while(*t=='*')t--;
fun(s,t) ;
fprintf(out, "%s\n", s) ;
}
fclose(in) ;
fclose(out) ;
}
难度等级:★★☆☆☆
学点啥
使用void fun( char *a)方式参见多种*删除方式
10-2.【删除】除了字符串前导的*号之外,串中其他 号全部删除(删除中间、尾部号)
#include <stdio.h>
void fun( char *a )
{
int i=0;
/*定义临时指针P,初始指向原串首地址*/
char *p = a;
/*利用循环语句把字符串中字母前的*copy到原串*/
while (*p&&(*p == '*'))
{
a[i] = *p;
i++;
p++;
}
/*继续移动指针
把串中和串尾的非*号宇符拷贝到原串*/
while (*p)
{
if (*p != '*')
{
a[i] = *p;
i++;
}
p++;
}
/*修改后的宇符串赋结束宇符_\0_*/
a[i] = '\0';
}
void main()
{ char s[81];void NONO ();
printf("Enter a string:\n");gets(s);
fun( s );
printf("The string after deleted:\n");puts(s);
NONO();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *in, *out ;
int i ; char s[81] ;
in = fopen("in.dat","r") ;
out = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(in, "%s", s) ;
fun(s) ;
fprintf(out, "%s\n", s) ;
}
fclose(in) ;
fclose(out) ;
}
输出结果
难度等级:★★★☆☆
学点啥
函数fun的功能:除了宇符串前导的号之外,将串中其他号全部 删 除 。 解 答 本 题 : ( 1 ) 定 义临 时 指 针P, 初始指向原串首地址 :( 2)利用循环语句把宇符串前导贝到原串(3)继续移动指针,把串中和串尾的非*号宇符拷贝到原串:⑷为修改后 的宇符串赋结束宇符_\0_。
[解题宝典]
要删除宇符串中的指定宇符,我们通常果用保留非指定宇符的 方法。可以将^指定宇符保留在原串,即搏需要保留的宇符从
原串的 起 始 位 置 重 新 赋值:也可以保留到新串,即新建符串,存放要保留的宇符。
10-3.【删除】除了字符串中间的*号之外,串中其他 号全部删除(删除头部、尾部号)
问题:假设输入的字符串为ABCDEFG****,删除串中的号后,字符串变为ABCDEFG
思路:(1)按照删除尾部号思路,在最后一个字母下一位放置结束符\0;(2)按照删除头部*号思路,寻找到第一位字母;(3)因新的结束符放好了,无需多言,完工。
#include <stdio.h>
void fun( char *a )
{
//新增
char *t = a;
/*遍历,指针a指向\0也即*/
while (*t != '\0')//while(*t)
t++;
/*指针a指向最后一个字母*/
t--;
/*指针a指向为*时指针a--,
直至遇到字母也即非*为止.
指针t指向字符串中最后字符*/
while (*t == '*')
t--;
/*字符串后移一位,加上结束标志符*/
*(t + 1) = '\0';
//
int i = 0;
/*定义临时指针P,初始指向原串首地址*/
char *p = a;
/*遍历,直至找到第一个字母.
指针f指向字符串中第一个字符*/
while (*p == '*')
p++;
/*继续移动指针,字符拷贝到原串
直至遇到结束字符\0*/
while (*p)
{
if (*p != '\0')
{
a[i] = *p;
i++;
}
p++;
}
}
void main()
{ char s[81];void NONO ();
printf("Enter a string:\n");gets(s);
fun( s );
printf("The string after deleted:\n");puts(s);
NONO();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *in, *out ;
int i ; char s[81] ;
in = fopen("in.dat","r") ;
out = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(in, "%s", s) ;
fun(s) ;
fprintf(out, "%s\n", s) ;
}
fclose(in) ;
fclose(out) ;
}
10-4.【删除】将字符串头部的*号全部删除,保留其他
问题:假设输入的字符串为ABCDEFG****,删除串中的号后,字符串变为ABCDEF*G********
#include <stdio.h>
void fun( char *a )
{
int i = 0;
/*定义临时指针P,初始指向原串首地址*/
char *p = a;
/*遍历,直至找到第一个字母*/
while (*p && (*p == '*'))
p++;
/*继续移动指针,字符拷贝到原串
直至遇到结束字符\0*/
while (*p)
{
if (*p != '\0')
{
a[i] = *p;
i++;
}
p++;
}
}
void main()
{ char s[81];void NONO ();
printf("Enter a string:\n");gets(s);
fun( s );
printf("The string after deleted:\n");puts(s);
NONO();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *in, *out ;
int i ; char s[81] ;
in = fopen("in.dat","r") ;
out = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(in, "%s", s) ;
fun(s) ;
fprintf(out, "%s\n", s) ;
}
fclose(in) ;
fclose(out) ;
}
输出结果
难度等级:★☆☆☆☆
学点啥
思路2:
void fun(char *a)
{
char *p = a;
while (*p == '*')//p指向第一个字母
p++;
for (; *p != '\0'; p++.a++)//第一各字母后字符放入
*a = *p;
*a = '\0';
}
思路3:
void fun(char *a)
{
char *p = a;
while (*p == '*')//p指向第一个字母
p++;
strcpy(a, p);
}
char a[10],b[]={"COPY"};
//定义字符数组a,b
strcpy(a,b);
//将b中的COPY复制到a中
10-5.【删除】将字符串尾部的*号全部删除,保留其他
问题:假设输入的字符串为ABCDEFG****,删除串中的号后,字符串变为*ABCDEFG
#include <stdio.h>
void fun( char *a )
{
/*遍历,指针a指向\0也即*/
while (*a != '\0')
a++;
/*指针a指向最后一个字母*/
a--;
/*指针a指向为*时指针a--,
直至遇到字母也即非*为止*/
while (*a == '*')
a--;
/*字符串后移一位,加上结束标志符*/
*(a + 1) = '\0';
}
void main()
{ char s[81];void NONO ();
printf("Enter a string:\n");gets(s);
fun( s );
printf("The string after deleted:\n");puts(s);
NONO();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *in, *out ;
int i ; char s[81] ;
in = fopen("in.dat","r") ;
out = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(in, "%s", s) ;
fun(s) ;
fprintf(out, "%s\n", s) ;
}
fclose(in) ;
fclose(out) ;
}
输出结果
难度等级:★★★☆☆
学点啥
‘\0’ 是字符串的结束符,任何字符串之后都会自动加上’\0’。如果字符串末尾少了‘\0’转义字符,则其在输出时可能会出现乱码问题。
‘\0’转义字符在ASCII表中并不表示阿拉伯数字0,阿拉伯数字0的ASCII码为48,‘\0’转义字符的ASCII码值为0,它表示的是ASCII控制字符中空字符的含义。
**思路:**将字符串尾部*号删除,如下图,指针首先增加至\0(20),再往回走,遇到字母(17)后,将(18)放置\0即可。
void fun( char *a )
{
/*遍历,指针a指向\0也即*/
while (*a != '\0')
a++;
/*指针a指向最后一个字母*/
a--;
/*指针a指向为*时指针a--,
直至遇到字母也即非*为止*/
while (*a == '*')
a--;
/*字符串后移一位,加上结束标志符*/
*(a + 1) = '\0';
}
10-6.【删除】将字符串中的*号删除,保留其他
转载[https://blog.csdn.net/qq_36955347/article/details/73511589(https://blog.csdn.net/qq_36955347/article/details/73511589)
问题:假设输入的字符串为ABCDEFG****,删除串中的号后,字符串变为****ABDEFG********
设置两个指向字符的指针变量t和f。先使用循环语句让t指针指向字符串中最后一个字符,而f指针指向字符串中第一个字符;再判断t和f指向的字符是否为“”,如果为“”,则t指针自减,f指针自增,直到遇到第一个不是的字符为止。
再定义一个函数fun()用于删除字符串中的“”号,同时保留字符串前后的“”号。
#include <stdio.h>
int fun(char *a, char *h, char *p)
{
int i, j;
/*删除指针h与p之间的所有“*”*/
for(i=0,j=0; &h[i]<p; i++)
if(h[i]!='*')
h[j++]=h[i];
/*将指针p至字符串尾部的所有字符前移*/
for(i=0; p[i]; i++,j++)
h[j]=p[i];
h[j]='\0'; /*在字符串尾部添加结束标志*/
return 0;
}
int main( )
{
char s[81], *t, *f;
printf("Enter a string :\n");
gets(s); /*输入字符串*/
t=f=s; /*用字符指针t、f指向串s*/
while(*t)
t++;
t--; /*将指针t定位到字符串中最后一个字符*/
while(*t == '*') /*指针t指向字符串中最后一个字符*/
t--;
while (*f == '*') /*指针f指向字符串中第一个字符*/
f++;
fun(s, f, t);
printf("The string after deleted:\n"); /*输出结果*/
puts(s);
return 0;
}
输出结果
难度等级:★★★★☆
学点啥
参考上述,自写函数如下:
void StarDelM(char *a) //010
{
char *f, *t;
f = t = a;
while (*t)
t++;
t--; /*将指针t定位到字符串中最后一个字符*/
while (*t == '*') /*指针t指向字符串中最后一个字符*/
t--;
while (*f == '*') /*指针f指向字符串中第一个字符*/
f++;
int i, j;
/*删除指针f与t之间的所有“*”*/
for (i = 0,j = 0; f + i < t; i++)
if (*(f + i) != '*')
{
*(f + j) = *(f + i);//
j++;
}
/*将指针t至字符串尾部的所有字符前移*/
for (i = 0; *(t + i); i++, j++)
*(f + j) = *(t + i);
*(f + j) = '\0'; /*在字符串尾部添加结束标志*/
}
10-7.【删除】使字符串中间部的*号不多于n个
思路:
(1)指针t++,找到结束符\0,回溯并计个数k;
(2)比较个数k与要求值n,若k大,则只保留n个*;否则无需操作
#include <stdio.h>
void fun( char *a,int n )
{
int i = 0,k = 0;
char *p,*t;
p = t = a;
while (*t)
t++;
t--;
while (*t == '*')
{
t--;//指针-1
k++;//计数+1
}
if (k > n)
{
while (/*p&&*/p < t + n + 1)
{
*(a+i) = *p;
i++;
p++;
}
*(a + i) = '\0';
}
}
void main()
{ char s[81]; int n;
void NONO ( );
printf("Enter a string:\n");gets(s);
printf("Enter n : ");scanf("%d",&n);
fun( s,n );
printf("The string after deleted:\n");puts(s);
NONO();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *in, *out ;
int i, n ; char s[81] ;
in = fopen("in.dat","r") ;
out = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(in, "%s", s) ;
fscanf(in, "%d", &n) ;
fun(s,n) ;
fprintf(out, "%s\n", s) ;
}
fclose(in) ;
fclose(out) ;
}
输出结果
难度等级:★★★☆☆
学点啥
10-8. 【删除】使字符串前导*号不多于n个
雕虫小技
正儿八经
#include <stdio.h>
void fun( char *a, int n )
{
int i = 0, k = 0;
char *p, *f;
p = f = a;
/*统计前导*个数*/
while (*f == '*')
{
k++;
f++;
}
/*k大于n,则使p前导保留n个*
例:*****ABC若n=2,p指向*(p+5-2)
*/
if (k > n)
{
for (; *p; i++, p++)
a[i] = *(p + k - n);
}
a[i] = 0;
}
void main()
{ char s[81]; int n;void NONO ();
printf("Enter a string:\n");gets(s);
printf("Enter n : ");scanf("%d",&n);
fun( s,n );
printf("The string after deleted:\n");puts(s);
NONO();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *in, *out ;
int i, n ; char s[81] ;
in = fopen("in.dat","r") ;
out = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(in, "%s", s) ;
fscanf(in, "%d", &n) ;
fun(s,n) ;
fprintf(out, "%s\n", s) ;
}
fclose(in) ;
fclose(out) ;
}
难度等级:★★★★★☆☆☆☆
学点啥
10-9.【删除】删除一维数组中所有相同的数
雕虫小技
正儿八经
#include <stdio.h>
#define N 80
int fun(int a[], int n)
{
int i = 1, j = 1;
for (i = 1; i < n; i++)
{
if (a[j-1] != a[i])
a[j++] = a[i];
}
return j;
}
void main()
{
FILE *wf;
int a[N]={ 2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10}, i, n=20;
printf("The original data :\n");
for(i=0; i<n; i++)
printf("%3d",a[i]);
n=fun(a,n);
printf("\n\nThe data after deleted :\n");
for(i=0; i<n; i++)
printf("%3d",a[i]);
printf("\n\n");
/******************************/
wf=fopen("out.dat","w");
for(i=0; i<n; i++)
fprintf(wf,"%3d",a[i]);
fclose(wf);
/*****************************/
}
难度等级:★★★★★☆☆☆☆
学点啥
10-10.【删除】删除一个字符串中指定下标的字符
#include <stdio.h>
#include <string.h>
#define LEN 20
void fun (char a[], char b[], int n)
{
int i = 0, j = 0;
for(; *(a + i);i++)
if (i != n)
b[j++] = a[i];
//*(b + j) = '\0';//结束标识 方法1
//b[j] = '\0';//结束标识 方法2
b[j] = 0;//结束标识 方法2
}
void main( )
{ char str1[LEN], str2[LEN] ;
int n ;
void NONO ( );
printf("Enter the string:\n") ;
gets(str1) ;
printf("Enter the position of the string deleted:") ;
scanf("%d", &n) ;
fun(str1, str2, n) ;
printf("The new string is: %s\n", str2) ;
NONO() ;
}
void NONO ( )
{/* 本函数用于打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/
char str1[LEN], str2[LEN] ;
int i, n ;
FILE *rf, *wf ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(rf, "%s %d", str1, &n) ;
fun(str1, str2, n) ;
fprintf(wf, "%s\n", str2) ;
}
fclose(rf) ;
fclose(wf) ;
}
输出结果
难度等级:★★★★★☆☆☆☆
学点啥
10-11【删除】删除字符串中所有空格
雕虫小技
结合函数功能以及main函数,可得只需修改
`char Msg[]="Input a string:";
//
fun(Msg);
fprintf(out,"%s",Msg);
即可
void main()
{
char str[81];
char Msg[]="Input a string:";
int n;
FILE *out;
printf(Msg);
gets(str);
puts(str);
fun(str);
printf("*** str: %s\n",str);
/******************************/
out=fopen("out.dat","w");
fun(Msg);
fprintf(out,"%s",Msg);
fclose(out);
/******************************/
}
输出结果
step1: 打开程序>直接运行(F5快捷键);
step2:随便输入,关闭之
step3:按照格式修改out.dat文件并保存;注意找main函数中最后一次调用函数对应的部分:
step4:
case 考场:本题做完了;break;
case 模拟;交卷体验下满分快感;break;
正儿八经
#include <stdio.h>
#include <ctype.h>
#include <conio.h>
#include <stdlib.h>
void fun (char *str)
{
int i = 0;
char *p = str;
for (;*p;p++)
{
if (*p != ' ')
str[i++] = *p;
}
*(str + i) = '\0';
}
void main()
{
char str[81];
char Msg[]="Input a string:";
int n;
FILE *out;
printf(Msg);
gets(str);
puts(str);
fun(str);
printf("*** str: %s\n",str);
/******************************/
out=fopen("out.dat","w");
fun(Msg);
fprintf(out,"%s",Msg);
fclose(out);
/******************************/
}
输出结果
难度等级:★☆☆☆☆
学点啥
类似删除*号题目,不要错误认为不可以再用’\0’判定结尾 。
实际上空格与结束符的ASCII码不同,回车、换行、空格的ASCII码值—(附ASCII码表)
回车、换行、空格的ASCII码值
回车,ASCII码13
换行,ASCII码10
空格,ASCII码32
A,ASCII码65
a,ASCII码97
中间差一个空格 ASCII码32
结束符’\0’ASCII码0
而’\0’为结束符,其ASCII码表为0,也正因为此,输入结束符可以使用*(str + i) = '\0';//*(str + i) = 0;
均可
10-12【删除】从字符串中删除指定的字符
#include <string.h>
#include <stdio.h>
void fun( char s[],int c)
{
}
void main()
{
static char str[]="turbo c and borland c++";
char ch;
FILE *out;
printf ("原始字符串:%s\n ",str);
printf("输入一个字符串:\n");
scanf("%c",&ch);
fun(str,ch);
printf("str[]=%s\n",str);
strcpy(str,"turbo c and borland c++");
fun(str,'a');
/******************************/
out=fopen("out.dat","w");
fprintf(out,"%s",str);
fclose(out);
/******************************/
}
雕虫小技
注意到
以及 fun(str,‘a’);
可知 只需将out.dat文件中a消除即可
修改前
修改后
#include <string.h>
#include <stdio.h>
void fun( char s[],int c)
{
int i = 0;
char *p;
p = s;
while (*p)
{
if (*p != c)
{
s[i++] = *p;//不同指向直接输出
}
p++;//相同指向下一个字符
}
s[i] = '\0';
}
void main()
{
static char str[]="turbo c and borland c++";
char ch;
FILE *out;
printf ("原始字符串:%s\n ",str);
printf("输入一个字符串:\n");
scanf("%c",&ch);
fun(str,ch);
printf("str[]=%s\n",str);
strcpy(str,"turbo c and borland c++");
fun(str,'a');
/******************************/
out=fopen("out.dat","w");
fprintf(out,"%s",str);
fclose(out);
/******************************/
}
输出结果
难度等级:★☆☆☆☆
学点啥
11【胜者为王 吃肉 败者为寇 渣都没得】
11-1.数组中的最小值或最大值,并与其第1个元素交换
#include <stdio.h>
#include <stdlib.h>
#define N 10
#pragma warning (disable:4996)
void NONO(FILE *fp, int pd[], int n);
void fun (int *dp,int n,int upordown)
{
}
void display(int pd[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%4d",pd[i]);
printf("\n");
}
void main()
{
int data[N],i,n=N;
FILE *out ;
out = fopen("out.dat","w") ;
for(i=0;i<N;i++)
data[i]=rand()%90+10;
for(i=0;i<N-1;i++)
fun(data+i,n-i,0);
display(data,n);
NONO(out, data, n);
for(i=0;i<N;i++)
data[i]=rand()%90+10;
for(i=0;i<N-1;i++)
fun(data+i,n-i,1);
display(data,n);
NONO(out, data, n);
fclose(out);
}
void NONO(FILE *fp, int pd[], int n)
{
int i;
for(i=0;i<n;i++)
fprintf(fp, "%4d", pd[i]);
fprintf(fp, "\n");
}
尝试1:
void fun (int *dp,int n,int upordown)
{
int i, j, temp;
switch (upordown)
{
case 0:
for (i = 0; i < n; i++)
{
if (*dp < *(dp + i))
{
temp = *dp;
*dp = *(dp + i);
*(dp + i) = temp;
}
}
break;
case 1:
for (i = 0; i < n; i++)
{
if (*dp < *(dp + i))
{
temp = *dp;
*dp = *(dp + i);
*(dp + i) = temp;
}
}
break;
}
}
错误原因:尝试使用冒泡法思路,错误理解题意。
**思路:**遍历数组,找到最值的下标(upordown==0时找最小值,upordown=1时找最大值);然后与下标为0的元素交换(与冒泡法相比,仅交换一次)
void fun (int *dp,int n,int upordown)
{
int temp, index = 0, i;
switch (upordown)
{
case 0:
for (i = 0; i < n; i++)
{
if (dp[index] > dp[i])
index = i;
};
break;
case 1:
for (i = 0; i < n; i++)
{
if (dp[index] < dp[i])
index = i;
};
break;
default: break;
}
temp = dp[index];
dp[index] = dp[0];
dp[0] = temp;
}
输出结果
优化
1、index初值为0,i大可不必从0开始,dp[0]>dp[0]必为false;从1 开始即可。
2、增设如下代码,若index为0,不必交换
if (index != 0)
{
temp = dp[index];
dp[index] = dp[0];
dp[0] = temp;
}
完整代码:
#include <stdio.h>
#include <stdlib.h>
#define N 10
#pragma warning (disable:4996)
void NONO(FILE *fp, int pd[], int n);
void fun (int *dp,int n,int upordown)
{
int temp, index = 0, i;
switch (upordown)
{
case 0:
for (i = 1; i < n; i++)
{
if (dp[index] > dp[i])
index = i;
};
break;
case 1:
for (i = 1; i < n; i++)
{
if (dp[index] < dp[i])
index = i;
};
break;
default: break;
}
if (index != 0)
{
temp = dp[index];
dp[index] = dp[0];
dp[0] = temp;
}
}
void display(int pd[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%4d",pd[i]);
printf("\n");
}
void main()
{
int data[N],i,n=N;
FILE *out ;
out = fopen("out.dat","w") ;
for(i=0;i<N;i++)
data[i]=rand()%90+10;
for(i=0;i<N-1;i++)
fun(data+i,n-i,0);
display(data,n);
NONO(out, data, n);
for(i=0;i<N;i++)
data[i]=rand()%90+10;
for(i=0;i<N-1;i++)
fun(data+i,n-i,1);
display(data,n);
NONO(out, data, n);
fclose(out);
}
void NONO(FILE *fp, int pd[], int n)
{
int i;
for(i=0;i<n;i++)
fprintf(fp, "%4d", pd[i]);
fprintf(fp, "\n");
}
11-2 整数中找出最大值和最小值
雕虫小技
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i, a, b, c, d ;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for( i=0; i<5; i++ )
{
fscanf(fp, "%d %d %d %d", &a, &b, &c, &d);
fun(&a,&b,&c,&d);
fprintf(wf, "a=%d,d=%d\n", a, d);
}
fclose(fp) ;
fclose(wf) ;
}
F5运行、打开、手动out.dat
正儿八经
#include <stdio.h>
void NONO();
void fun(int *a, int *b, int *c, int *d)
{
int max=*a, min=*a;
if (max < *b)
max = *b;
if (min > *b)
min = *b;
if (max < *c)
max = *c;
if (min > *c)
min = *c;
if (max < *d)
max = *d;
if (min > *d)
min = *d;
*a = max;
*d = min;
}
void main()
{ int a, b, c, d;
printf("请输入4个整数: "); scanf("%d%d%d%d", &a,&b,&c,&d);
printf("原始顺序: %d,%d,%d,%d\n", a, b, c, d);
fun(&a,&b,&c,&d);
printf("处理后: %d,%d,%d,%d\n", a, b, c, d);
NONO();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i, a, b, c, d ;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for( i=0; i<5; i++ )
{
fscanf(fp, "%d %d %d %d", &a, &b, &c, &d);
fun(&a,&b,&c,&d);
fprintf(wf, "a=%d,d=%d\n", a, d);
}
fclose(fp) ;
fclose(wf) ;
}
难度等级:★☆☆☆☆
学点啥
优化
void fun(int *a, int *b, int *c, int *d)
{
int max=*a, min=*a;
max = *a > *b ? *a : *b;
max = max > *c ? max : *c;
max = max > *d ? max : *d;
min = *a > *b ? *b : *a;
min = min > *c ? *c : min;
min = min > *d ? *d : min;
*a = max;
*d = min;
}
函数这么写能保证ad位置正确,但是bc数据有误
难度等级:★★★★★☆☆☆☆
学点啥
11-3 找出最长的一个字符串
雕虫小技
正儿八经
#include<conio.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char *fun(char (*a)[81], int num, char *max)
{
}
void main()
{
FILE *wf;
char ss[10][81],*ps=NULL;
char s[3][81]={"abcd","deg","diegns"},*p=NULL;
int i=0,n;
system("CLS");
printf("输入若干个字符串:");
gets(ss[i]);
puts(ss[i]);
while(!strcmp(ss[i], "****")==0) /*用4个星号作为结束输入的标志*/
{
i++;
gets(ss[i]);
puts(ss[i]);
}
n=i;
ps=fun(ss,n,ps);
printf("\nmax=%s\n",ps);
/******************************/
wf=fopen("out.dat","w");
p=fun(s,3,p);
fprintf(wf,"%s",p);
fclose(wf);
/*****************************/
}
编写:
char *fun(char (*a)[81], int num, char *max)
{
int i = 0;
max = a[0];
for (i = 0; i < num; i++)
{
if (strlen(max) < strlen(a[i]))
max = a[i];
}
return max;
}
难度等级:★☆☆☆☆
学点啥
11-4 求出数组的最大元素在数组中的下标
雕虫小技
正儿八经
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
int fun(int *s,int t,int *k)
{
int i;
*k = 0;
for (i = 0; i < t; i++)
if (s[*k] < s[i])
*k=i;
return s[*k];
}
void main()
{
FILE *wf;
int a[10]={ 876,675,896,101,301,401,980,431,451,777},k;
system("CLS");
fun(a, 10, &k);
printf("%d, %d\n ", k, a[k]);
/******************************/
wf=fopen("out.dat","w");
fprintf (wf,"%d, %d", k, a[k]);
fclose(wf);
/*****************************/
}
难度等级:★★★★★☆☆☆☆
学点啥
11-5.最大的值及其所在的下标
雕虫小技
正儿八经
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
void fun(int a[],int n, int *max, int *d)
{
int i;
*max = a[0];
for (i = 0; i < n; i++)
{
if (*max < a[i])
{
*max = a[i];
*d = i;
}
}
}
void main()
{
FILE *wf;
int i, x[20], max, index, n=10;
int y[20]={4,2,6,8,11,5};
srand((unsigned)time(NULL));
for(i=0;i<n;i++)
{
x[i]=rand()%50;
printf("%4d",x[i]); /*输出一个随机数组*/
}
printf("\n");
fun(x,n,&max,&index);
printf("Max=%5d,Index=%4d\n",max,index);
/******************************/
wf=fopen("out.dat","w");
fun(y,6,&max,&index);
fprintf(wf,"Max=%5d,Index=%4d",max,index);
fclose(wf);
/*****************************/
}
难度等级:★★★★★☆☆☆☆
学点啥
11-6. 找出dp所指数组中的最小或最大值
雕虫小技
正儿八经
#include <stdio.h>
#include <stdlib.h>
#define N 10
#pragma warning (disable:4996)
void NONO(FILE *fp, int pd[], int n);
void fun (int *dp,int n,int upordown)
{
int i, temp, index=0;
if (n == 0) return;
for (i = 1; i < n; i++)
{
if ((upordown == 0 && dp[i]<dp[index]) || (upordown == 1 && dp[i] > dp[index]))
/*if (upordown == 0 && dp[i] < dp[index] || upordown == 1 && dp[i] > dp[index])
C语言中逻辑运算符“与”“或”“非”优先级:非>与>或
*/
index = i;//index存储目标元素
}
if (index != 0)
{
temp = dp[index];
dp[index] = dp[0];
dp[0] = temp;
}
}
void display(int pd[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%4d",pd[i]);
printf("\n");
}
void main()
{
int data[N],i,n=N;
FILE *out ;
out = fopen("out.dat","w") ;
for(i=0;i<N;i++)
data[i]=rand()%90+10;
for(i=0;i<N-1;i++)
fun(data+i,n-i,0);
display(data,n);
NONO(out, data, n);
for(i=0;i<N;i++)
data[i]=rand()%90+10;
for(i=0;i<N-1;i++)
fun(data+i,n-i,1);
display(data,n);
NONO(out, data, n);
fclose(out);
}
void NONO(FILE *fp, int pd[], int n)
{
int i;
for(i=0;i<n;i++)
fprintf(fp, "%4d", pd[i]);
fprintf(fp, "\n");
}
难度等级:★★☆☆☆
学点啥
C语言中逻辑运算符“与”“或”“非”优先级是怎样的?非>与>或
12 【教务处】
12-1 【教务处】高于等于平均分的学生数据
尝试1
double fun( STREC *a, STREC *b, int *n )
{
double ave = 0.0;
int i, j = 0, len;
*n = 0;
/*find average*/
for (i=0;i<N;i++)
{
ave +=a[i].s/N;
}
/*store higher grade*/
for (i = 0; i < N; i++)
{
if (a[i].s>ave)
{
b[j++] = a[i];
(*n)++;
}
}
return ave;
}
输出结果
优化
#include <stdio.h>
#define N 12
typedef struct
{ char num[10];
double s;
} STREC;
double fun( STREC *a, STREC *b, int *n )
{
double ave = 0.0;
int i;
*n = 0;
/*find average*/
for (i=0;i<N;i++)
{
ave +=a[i].s/N;
}
/*store higher grade*/
for (i = 0; i < N; i++)
{
if (a[i].s>ave)
{
b[(*n)++] = a[i];
}
}
return ave;
}
void main()
{ STREC s[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85},
{"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87},
{"GA09",60},{"GA11",79},{"GA12",73},{"GA10",90}};
STREC h[N], t;FILE *out ;
int i,j,n; double ave;
ave=fun( s,h,&n );
printf("The %d student data which is higher than %7.3f:\n",n,ave);
for(i=0;i<n; i++)
printf("%s %4.1f\n",h[i].num,h[i].s);
printf("\n");
out = fopen("out.dat","w") ;
fprintf(out, "%d\n%7.3f\n", n, ave);
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(h[i].s<h[j].s) {t=h[i] ;h[i]=h[j]; h[j]=t;}
for(i=0;i<n; i++)
fprintf(out,"%4.1f\n",h[i].s);
fclose(out);
}
输出结果
难度等级:★★★★★☆☆☆☆
学点啥
12-2 【教务处】将低于平均分的人数作为函数值返回(数组)
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int fun(int score[],int m, int below[])
{
float Ave = 0.0;
int i,j = 0;
for (i=0;i<m;i++)
{
Ave += score[i]/m;
}
for (i = 0; i < m; i++)
{
if (score[i] < Ave)
{
below[j++] = score[i];
}
}
return j;
}
void main()
{
FILE *wf;
int i, n, below[9];
int score[9]={10,20,30,40,50,60,70,80,90};
system("CLS");
n=fun(score, 9, below);
printf("\nBelow the average score are: ");
for(i=0;i<n;i++)
printf("%d ",below[i]);
/******************************/
wf=fopen("out.dat","w");
for(i=0;i<n;i++)
fprintf(wf,"%d ",below[i]);
fclose(wf);
/*****************************/
}
学点啥
12-3【教务处】【排序】【冒泡法】按分数降序排列
#include <stdio.h>
#define N 16
typedef struct
{ char num[10];
int s;
} STREC;
void fun( STREC a[] )
{
int i,j,len;
STREC temp;;
for (i=0;i<N;i++)
{
for (j = 0; j < N-1; j++)
{
if (a[j].s < a[j + 1].s)
{
temp = a[j];
a[j] = a[j+1];
a[j + 1] = temp;
}
}
}
}
void main()
{ STREC s[N]={{"GA005",85},{"GA003",76},{"GA002",69},{"GA004",85},
{"GA001",91},{"GA007",72},{"GA008",64},{"GA006",87},
{"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},
{"GA011",66},{"GA017",64},{"GA018",64},{"GA016",72}};
int i;FILE *out ;
fun( s );
printf("The data after sorted :\n");
for(i=0;i<N; i++)
{ if( (i)%4==0 )printf("\n");
printf("%s %4d ",s[i].num,s[i].s);
}
printf("\n");
out = fopen("out.dat","w") ;
for(i=0;i<N; i++)
{ if( (i)%4==0 && i) fprintf(out, "\n");
fprintf(out, "%4d ",s[i].s);
}
fprintf(out,"\n");
fclose(out) ;
}
输出结果
难度等级:★★★☆☆
学点啥
经典的冒泡法:双层循环+if判断,外层循环控制比较轮数,内层循环控制两两比较。
for (j = 0; j < N-1; j++)
{
if (a[j].s < a[j + 1].s)
{
temp = a[j];
a[j] = a[j+1];
a[j + 1] = temp;
}
}
从头到尾比较:1轮结束后,最值在最后,2轮结束后,次最值(倒数第2最值)在倒数第2…i轮结束后,倒数第i最值在倒数第i,注意第i轮比较只需要比较到N-i-1即可。
if (a[j].s < a[j + 1].s)//冒泡后,最小值在最后
//if (a[j].s > a[j + 1].s)//冒泡后,最大值在最后
最大值在后,排序结果
在这里插入代码片
输出结果
难度等级:★★★★★☆☆☆☆
学点啥
12-4【教务处】 低于平均分的学生数据
雕虫小技
正儿八经
#include <stdio.h>
#define N 8
typedef struct
{ char num[10];
double s;
} STREC;
double fun( STREC *a, STREC *b, int *n )
{
int i;
double ave = 0.0;
*n = 0;
for (i = 0; i < 8; i++)
ave += a[i].s / 8;
for (i = 0; i < 8; i++)
{
if (a[i].s <ave)
b[(*n)++] = a[i];
}
return ave;
}
void main()
{ STREC s[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85},
{"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87}};
STREC h[N],t;FILE *out ;
int i,j,n; double ave;
ave=fun( s,h,&n );
printf("The %d student data which is lower than %7.3f:\n",n,ave);
for(i=0;i<n; i++)
printf("%s %4.1f\n",h[i].num,h[i].s);
printf("\n");
out = fopen("out.dat","w") ;
fprintf(out, "%d\n%7.3f\n", n, ave);
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(h[i].s>h[j].s) {t=h[i] ;h[i]=h[j]; h[j]=t;}
for(i=0;i<n; i++)
fprintf(out,"%4.1f\n",h[i].s);
fclose(out);
}
难度等级:★★★★★☆☆☆☆
学点啥
12-5【教务处】找出成绩最低的学生记录,通过形参返回主函数
雕虫小技
正儿八经
题目:
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
#define N 10
typedef struct ss
{ char num[10];
int s;
} STU;
void fun(STU a[], STU *s)
{
}
void main()
{
FILE *wf;
STU a[N]={{ "A01",81},{ "A02",89},{ "A03",66},{ "A04",87},{ "A05",77},
{ "A06",90},{ "A07",79},{ "A08",61},{ "A09",80},{ "A10",71}},m;
int i;
system("CLS");
printf("*****The original data*****\n");
for(i=0;i<N;i++)
printf("No=%s Mark=%d\n", a[i].num,a[i].s);
fun(a,&m);
printf("*****THE RESULT*****\n");
printf("The lowest :%s, %d\n",m.num,m.s);
/******************************/
wf=fopen("out.dat","w");
fprintf(wf,"%s, %d",m.num,m.s);
fclose(wf);
/*****************************/
}
解答:
void fun(STU a[], STU *s)
{
int i,k=0,min;
*s = a[0];
for (i = 0; i < N; i++)
{
if (a[i].s < s->s)
*s = a[i];
}
}
难度等级:★★★★★☆☆☆☆
学点啥
指向结构体成员运算符 : (->) 从外部看是包含了一个解指针(*)所以要对指针进行操作
例如:
typedef struct
{
int data[];
int length;
}Sqlist;
Sqlist *L;
L->lenth; //得到L中length的值
结构体成员运算符 : ( . )直接调用结构体中的某个成员
例如:
typedef struct
{
int data[];
int length;
}Sqlist;
Sqlist L;
L.length; //直接调用L中length的值
L.data[];
12-6 【教务处】函数返回分数最低的学生人数
#include <stdio.h>
#define N 16
typedef struct
{ char num[10];
int s;
} STREC;
int fun( STREC *a, STREC *b )
{
int i, j = 0, min = a[0].s;
for (i=0; i < N; i++)
{
if (min > a[i].s)
min = a[i].s;
}
for (i = 0; i < N; i++)
{
if (min == a[i].s)
b[j++] = a[i];
}
return j;
}
void main()
{ STREC s[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85},
{"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87},
{"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},
{"GA011",91},{"GA017",64},{"GA018",64},{"GA016",72}};
STREC h[N];
int i,n;FILE *out ;
n=fun( s,h );
printf("The %d lowest score :\n",n);
for(i=0;i<n; i++)
printf("%s %4d\n",h[i].num,h[i].s);
printf("\n");
out = fopen("out.dat","w") ;
fprintf(out, "%d\n",n);
for(i=0;i<n; i++)
fprintf(out, "%4d\n",h[i].s);
fclose(out);
}
学点啥
第一次循环,遍历,求出最低分数;
第二次循环,遍历,求出最小分数人数并将其存入。
12-7 【教务处】去掉一个最高分和一个最低分,然后求平均值 8.6875
雕虫小技
正儿八经
#include <stdio.h>
void NONO();
double fun(double a[ ] , int n)
{
int i;
double max = a[0], min = a[0], sum = 0.0;
for (i = 0; i < n; i++)//find sum
sum += a[i];
for (i = 1; i < n; i++)//find max,min
{
max = max > a[i] ? max : a[i];
min = min < a[i] ? min : a[i];
}
return (double)(sum - max - min) / (n - 2);
}
void main()
{ double b[10], r; int i;
printf("输入10个分数放入b数组中 : ");
for (i=0; i<10; i++) scanf("%lf",&b[i]);
printf("输入的10个分数是 : ");
for (i=0; i<10; i++) printf("%4.1lf ",b[i]); printf("\n");
r = fun(b, 10);
printf("去掉最高分和最低分后的平均分 : %f\n", r );
NONO();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i, j ;
double b[10], r ;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
for(j = 0 ; j < 10 ; j++) {
fscanf(fp, "%lf ", &b[j]) ;
}
r = fun(b, 10) ;
fprintf(wf, "%f\n", r) ;
}
fclose(fp) ;
fclose(wf) ;
}
优化
double fun(double a[ ] , int n)
{
int i;
double max = a[0], min = a[0], sum = 0.0;
for (i = 0; i < n; i++)//find max,min
{
sum += a[i];
max = max > a[i] ? max : a[i];
min = min < a[i] ? min : a[i];
}
return (double)(sum - max - min) / (n - 2);
}
难度等级:★☆☆☆☆
学点啥
12-8【教务处】指定分数范围内
雕虫小技
正儿八经
#include <stdio.h>
#define N 16
typedef struct
{ char num[10];
int s;
} STREC;
int fun( STREC *a,STREC *b,int l, int h )
{
int i,j=0;
for(i=0;i<N;i++)
if (l <= a[i].s <= h)
b[j++] = a[i];
return j;
}
void main()
{ STREC s[N]={{"GA005",85},{"GA003",76},{"GA002",69},{"GA004",85},
{"GA001",96},{"GA007",72},{"GA008",64},{"GA006",87},
{"GA015",85},{"GA013",94},{"GA012",64},{"GA014",91},
{"GA011",90},{"GA017",64},{"GA018",64},{"GA016",72}};
STREC h[N],tt;FILE *out ;
int i,j,n,low,heigh,t;
printf("Enter 2 integer number low & heigh : ");
scanf("%d%d", &low,&heigh);
if ( heigh< low ){ t=heigh;heigh=low;low=t; }
n=fun( s,h,low,heigh );
printf("The student's data between %d--%d :\n",low,heigh);
for(i=0;i<n; i++)
printf("%s %4d\n",h[i].num,h[i].s);
printf("\n");
out = fopen("out.dat","w") ;
n=fun( s,h,80,98 );
fprintf(out,"%d\n",n);
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(h[i].s>h[j].s) {tt=h[i] ;h[i]=h[j]; h[j]=tt;}
for(i=0;i<n; i++)
fprintf(out,"%4d\n",h[i].s);
fprintf(out,"\n");
fclose(out);
}
难度等级:★☆☆☆☆
学点啥
12-9 【教务处】N名学生的成绩已在主函数中放入一个带头结点的链表结构中78.625
#include <stdio.h>
#include <stdlib.h>
#define N 8
struct slist
{ double s;
struct slist *next;
};
typedef struct slist STREC;
double fun( STREC *h )
{
double ave = 0.0;
STREC *p = h->next;
while (p != NULL)
{
ave += p->s;
p = p->next;
}
return ave / N;
}
STREC * creat( double *s)
{ STREC *h,*p,*q; int i=0;
h=p=(STREC*)malloc(sizeof(STREC));p->s=0;
while(i<N)
{ q=(STREC*)malloc(sizeof(STREC));
q->s=s[i]; i++; p->next=q; p=q;
}
p->next=0;
return h;
}
void outlist( STREC *h)
{ STREC *p;
p=h->next; printf("head");
do
{ printf("->%4.1f",p->s);p=p->next;}
while(p!=0);
printf("\n\n");
}
void main()
{ double s[N]={85,76,69,85,91,72,64,87},ave;
void NONO ( );
STREC *h;
h=creat( s ); outlist(h);
ave=fun( h );
printf("ave= %6.3f\n",ave);
NONO();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *in, *out ;
int i,j ; double s[N],ave;
STREC *h ;
in = fopen("in.dat","r") ;
out = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
for(j=0 ; j < N; j++) fscanf(in, "%lf,", &s[j]) ;
h=creat( s );
ave=fun( h );
fprintf(out, "%6.3lf\n", ave) ;
}
fclose(in) ;
fclose(out) ;
}
学点啥
使用循环语句遍历链表,求出求各结点数据域中数值的和。遍历链表定义一个指向结点的指针p,“头结点”无数值,让p指向“头结点”的笑一个结点,使用语句STREC *p=h->next
12-10【教务处】找出成绩最高的学生记录
雕虫小技
正儿八经
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
#define N 10
typedef struct ss /*定义结构体*/
{ char num[10];
int s;
} STU;
void fun(STU a[], STU *s)
{
int i;
*s = a[0];
for (i = 0; i < N; i++)
{
if (s->s < a[i].s)
*s = a[i];
}
}
void main()
{
FILE *wf;
STU a[N]={{ "A01",81},{ "A02",89},{ "A03",66},{ "A04",87},{ "A05",77},
{ "A06",90},{ "A07",79},{ "A08",61},{ "A09",80},{ "A10",71}},m;
int i;
system("CLS");
printf("*****The original data*****");
for(i=0;i<N;i++)
printf("No=%s Mark=%d\n", a[i].num,a[i].s);
fun(a,&m);
printf("*****THE RESULT*****\n");
printf("The top :%s, %d\n",m.num,m.s);
/******************************/
wf=fopen("out.dat","w");
fprintf(wf,"%s,%d",m.num,m.s);
fclose(wf);
/*****************************/
}
难度等级:★★☆☆☆
学点啥
12-11【教务处】学生的平均分78.875
雕虫小技
正儿八经
#include <stdio.h>
#define N 8
typedef struct
{ char num[10];
double s[N];
double ave;
} STREC;
void fun(STREC *a)
{
int i;
a->ave = 0.0;
for (i = 0; i < N; i++)
a->ave += a->s[i];//(*a).ave += (*a).s[i];
a->ave /= N;
}
void main()
{ STREC s={"GA005",85.5,76,69.5,85,91,72,64.5,87.5};
int i;
void NONO ( );
fun( &s );
printf("The %s's student data:\n", s.num);
for(i=0;i<N; i++)
printf("%4.1f\n",s.s[i]);
printf("\nave=%7.3f\n",s.ave);
NONO();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *out ;
int i,j ; STREC s[10] = {
{"GA005",85.5,76,69.5,85,91,72,64.5,87.5},
{"GA001",82.5,66,76.5,76,89,76,46.5,78.5},
{"GA002",72.5,56,66.5,66,79,68,46.5,58.5},
{"GA003",92.5,76,86.5,86,99,86,56.5,88.5},
{"GA004",82,66.5,46.5,56,76,75,76.5,63.5},
{"GA006",75.5,74,71.5,85,81,79,64.5,71.5},
{"GA007",92.5,61,72.5,84,79,75,66.5,72.5},
{"GA008",72.5,86,73.5,80,69,63,76.5,53.5},
{"GA009",66.5,71,74.5,70,61,82,86.5,58.5},
{"GA010",76,66.5,75.5,60,76,71,96.5,93.5},
};
out = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fun(&s[i]) ;
fprintf(out, "%7.3f\n", s[i].ave) ;
}
fclose(out) ;
}
难度等级:★★★★★☆☆☆☆
学点啥
C语言–“.”与“->”有什么区别?
(*a).b 等价于 a->b。
"."一般情况下读作"的”。
“->”一般读作"指向的结构体的"。
12-12 【教务处】n门课程的平均分71.08
雕虫小技
正儿八经
#include <stdio.h>
float fun ( float *a , int n )
{
int i;
double sum = 0.0;
for (i = 0; i < n; i++)
sum += a[i];
return sum / n;
}
void main()
{ float score[30]={90.5, 72, 80, 61.5, 55}, aver;
void NONO ( );
aver = fun( score, 5 );
printf( "\nAverage score is: %5.2f\n", aver);
NONO ( );
}
void NONO ( )
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i, j ;
float aver, score[5] ;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
for(j = 0 ; j < 5 ; j++) fscanf(fp,"%f,",&score[j]) ;
aver = fun(score, 5) ;
fprintf(wf, "%5.2f\n", aver) ;
}
fclose(fp) ;
fclose(wf) ;
}
难度等级:★★★★★☆☆☆☆
学点啥
12-13【教务处】把分数最高的学生数据
雕虫小技
正儿八经
#include <stdio.h>
#define N 16
typedef struct
{ char num[10];
int s;
} STREC;
int fun( STREC *a, STREC *b )
{
int i, j = 0, max = a[0].s;
//find min
for (i = 0; i < N; i++)
{
if (max < a[i].s)
max = a[i].s;
}
for (i = 0; i < N; i++)
{
if (a[i].s == max)
b[j++] = a[i];
}
return j;
}
void main()
{ STREC s[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85},
{"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87},
{"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},
{"GA011",77},{"GA017",64},{"GA018",64},{"GA016",72}};
STREC h[N];
int i,n;FILE *out ;
n=fun( s,h );
printf("The %d highest score :\n",n);
for(i=0;i<n; i++)
printf("%s %4d\n",h[i].num,h[i].s);
printf("\n");
out = fopen("out.dat","w") ;
fprintf(out, "%d\n",n);
for(i=0;i<n; i++)
fprintf(out, "%4d\n",h[i].s);
fclose(out);
}
难度等级:★★★★★☆☆☆☆
学点啥
C语言中的% 2d
是printf()
函数的输bai出格式du中的%a.bf
表示将数字按宽度为2,采用右对齐方式输zhi出,若数据位数不到2位,则左dao边补空格。
12-14 【教务处】分数最低的学生数据
雕虫小技
正儿八经
#include <stdio.h>
#define N 16
typedef struct
{ char num[10];
int s;
} STREC;
int fun( STREC *a, STREC *b )
{
int i,j=0,min=a[0].s;
//find min
for (i = 0; i < N; i++)
{
if (min > a[i].s)
min = a[i].s;
}
for (i = 0; i < N; i++)
{
if (a[i].s == min)
b[j++] = a[i];
}
return j;
}
void main()
{ STREC s[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85},
{"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87},
{"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},
{"GA011",91},{"GA017",64},{"GA018",64},{"GA016",72}};
STREC h[N];
int i,n;FILE *out ;
n=fun( s,h );
printf("The %d lowest score :\n",n);
for(i=0;i<n; i++)
printf("%s %4d\n",h[i].num,h[i].s);
printf("\n");
out = fopen("out.dat","w") ;
fprintf(out, "%d\n",n);
for(i=0;i<n; i++)
fprintf(out, "%4d\n",h[i].s);
fclose(out);
}
难度等级:★★☆☆☆
学点啥
12-15【教务处】链表结构 求出平均分
#include <stdio.h>
#include <stdlib.h>
#define N 8
struct slist
{ double s;
struct slist *next;
};
typedef struct slist STREC;
double fun( STREC *h )
{
double ave = 0.0;
/*定义一个指向结点的指针p。
由于头结点中无数值,
故直接让p指向“头结点”的下一个结点
*/
STREC *p = h->next;
while (p != NULL)
{
ave += p->s;
p = p->next
}
return ave / N;
}
STREC * creat( double *s)
{ STREC *h,*p,*q; int i=0;
h=p=(STREC*)malloc(sizeof(STREC));p->s=0;
while(i<N)
{ q=(STREC*)malloc(sizeof(STREC));
q->s=s[i]; i++; p->next=q; p=q;
}
p->next=0;
return h;
}
void outlist( STREC *h)
{ STREC *p;
p=h->next; printf("head");
do
{ printf("->%4.1f",p->s);p=p->next;}
while(p!=0);
printf("\n\n");
}
void main()
{ double s[N]={85,76,69,85,91,72,64,87},ave;
void NONO ( );
STREC *h;
h=creat( s ); outlist(h);
ave=fun( h );
printf("ave= %6.3f\n",ave);
NONO();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *in, *out ;
int i,j ; double s[N],ave;
STREC *h ;
in = fopen("in.dat","r") ;
out = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
for(j=0 ; j < N; j++) fscanf(in, "%lf,", &s[j]) ;
h=creat( s );
ave=fun( h );
fprintf(out, "%6.3lf\n", ave) ;
}
fclose(in) ;
fclose(out) ;
}
输出结果
难度等级:★★★★☆
学点啥
1、链表详解
2、单链表的几类操作介绍(头结点没有数据)
12-16 【教务处】链表结构 找出学生的最高分
雕虫小技
正儿八经
#include <stdio.h>
#include <stdlib.h>
#define N 8
struct slist
{ double s;
struct slist *next;
};
typedef struct slist STREC;
double fun( STREC *h )
{
double max=h->s;
while (h != NULL)
{
if (max < h->s)
max = h->s;
h = h->next;
}
return max;
}
STREC * creat( double *s)
{ STREC *h,*p,*q; int i=0;
h=p=(STREC*)malloc(sizeof(STREC));p->s=0;
while(i<N)
{ q=(STREC*)malloc(sizeof(STREC));
q->s=s[i]; i++; p->next=q; p=q;
}
p->next=0;
return h;
}
void outlist( STREC *h)
{ STREC *p;
p=h->next; printf("head");
do
{ printf("->%2.0f",p->s);p=p->next;}
while(p!=0);
printf("\n\n");
}
void main()
{ double s[N]={85,76,69,85,91,72,64,87}, max;void NONO ();
STREC *h;
h=creat( s ); outlist(h);
max=fun( h );
printf("max=%6.1f\n",max);
NONO();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *in, *out ;
int i,j ; double s[N],max;
STREC *h ;
in = fopen("in.dat","r") ;
out = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
for(j=0 ; j < N; j++) fscanf(in, "%lf,", &s[j]) ;
h=creat( s );
max=fun( h );
fprintf(out, "%6.1lf\n", max) ;
}
fclose(in) ;
fclose(out) ;
}
难度等级:★★☆☆☆
学点啥
12-17 【教务处】返回该学号的学生数据
雕虫小技
正儿八经
#include <stdio.h>
#include <string.h>
#define N 16
typedef struct
{ char num[10];
int s;
} STREC;
STREC fun( STREC *a, char *b )
{
int i;
/*若无指定学号,学号置空,成绩-1*/
STREC str={ "\0",-1 };
for (i = 0; i < N; i++)
{
if (strcmp(a[i].num,b)==0)
str=a[i];
}
return str;
}
void main()
{ STREC s[N]={{"GA005",85},{"GA003",76},{"GA002",69},{"GA004",85},
{"GA001",91},{"GA007",72},{"GA008",64},{"GA006",87},
{"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},
{"GA011",77},{"GA017",64},{"GA018",64},{"GA016",72}};
STREC h;
char m[10];
int i;FILE *out ;
printf("The original data:\n");
for(i=0; i<N; i++)
{ if(i%4==0) printf("\n");
printf("%s %3d ",s[i].num,s[i].s);
}
printf("\n\nEnter the number: ");gets(m);
h=fun( s,m );
printf("The data : ");
printf("\n%s %4d\n",h.num,h.s);
printf("\n");
out = fopen("out.dat","w") ;
h=fun(s,"GA013");
fprintf(out,"%s %4d\n",h.num,h.s);
fclose(out);
}
难度等级:★★☆☆☆
学点啥
常见的字符串处理函数总结
14【计算】
14-1【计算】并输出如下多项式的值…n输入15,则输出为sn=1.718
雕虫小技
#include <stdio.h>
double fun(int n)
{
int i,j;
double deno = 1.0,sum = 0.0;
/*1+...+1/(j-1)!+1/j!*/
for (j = 1; j <= n; j++)
{
/*j!*/
for (i = 1; i <= j; i++)
deno *= i;
sum +=1.0 / deno;
}
return sum;
}
void main()
{
int n;
double s;
FILE *out;
printf("\nInput n: ");
scanf("%d",&n);
s=fun(n);
printf("s=%f\n",s);
/******************************/
out=fopen("out.dat","w");
fprintf(out,"%f\n",fun(15));
fclose(out);
/******************************/
}
输出结果
难度等级:★★★★★☆☆☆☆
学点啥
14-2【计算】级数和 1.349859
雕虫小技
正儿八经
#include<conio.h>
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
double fun(double x, int n)
{
int i;
double fenzi = 1.0, fenmu = 1.0,sum = 1.0;
for (i = 1; i <= n; i++)
{
fenzi *= x;
fenmu *= i;
sum += (double) (fenzi / fenmu);
}
return sum;
}
void main()
{
FILE *wf;
system("CLS");
printf("%f ",fun(0.3,10));
/******************************/
wf=fopen("out.dat","w");
fprintf(wf,"%f",fun(0.3,10));
fclose(wf);
/*****************************/
}
难度等级:★★★★★☆☆☆☆
学点啥
14-3【计算】log函数 6.506583
雕虫小技
失效拉
void NONO ( )
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i, n ;
double s ;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(fp, "%d", &n) ;
s = fun(n) ;
fprintf(wf, "%f\n", s) ;
}
fclose(fp) ;
fclose(wf) ;
}
正儿八经
#include <math.h>
#include <stdio.h>
double fun( int m )
{
int i;
double sum = 0.0;
for (i=0;i<m;i++)
{
sum += log(i);
}
return sqrt(sum);
}
void main()
{
void NONO ( );
printf("%f\n", fun(20));
NONO();
}
void NONO ( )
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i, n ;
double s ;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(fp, "%d", &n) ;
s = fun(n) ;
fprintf(wf, "%f\n", s) ;
}
fclose(fp) ;
fclose(wf) ;
}
输出结果
错误原因,初值出现了log0
double fun( int m )
{
int i;
double sum = 0.0;
for (i=1;i<=m;i++)
{
sum += log(i);
}
return sqrt(sum);
}
难度等级:★★★★★☆☆☆☆
学点啥
14-4【计算】1+1/(1+2) 1.83333
雕虫小技
正儿八经
#include <stdio.h>
float fun(int n)
{
int i,fenmu = 0;
float sum=0.0;
for (i = 1; i <= n; i++)
{
fenmu += i;
sum += 1.0 / fenmu;
}
return sum;
}
void main()
{ int n; float s;
void NONO ( );
printf("\nPlease enter N:"); scanf("%d", &n);
s = fun(n);
printf("the result is: %f\n", s);
NONO();
}
void NONO ( )
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i, n ;
float s;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(fp, "%d", &n) ;
s = fun(n) ;
fprintf(wf, "%f\n", s) ;
}
fclose(fp) ;
fclose(wf) ;
}
难度等级:★★★★★☆☆☆☆
学点啥
14-5【计算】 m=12,n=8时,运行结果是495.0000
雕虫小技
正儿八经
#include <stdio.h>
float fun(int m, int n)
{
int i;
float fenzi = 1, fenmu1 = 1, fenmu2 = 1;
for (i = 1; i <= m; i++)
fenzi *= i;
for (i = 1; i <= n; i++)
fenmu1 *= i;
for (i = 1; i <= (m-n); i++)
fenmu2 *= i;
return fenzi / (fenmu1*fenmu2);
}
void main() /* 主函数 */
{ void NONO ();
printf("P=%f\n", fun (12,8));
NONO();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i, m, n ;
float s;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(fp, "%d,%d", &m, &n) ;
s = fun(m, n) ;
fprintf(wf, "%f\n", s) ;
}
fclose(fp) ;
fclose(wf) ;
}
难度等级:★★★★★☆☆☆☆
学点啥
14-6【计算】 n个幂数之和 154.0000
雕虫小技
正儿八经
#include <stdio.h>
#pragma warning (disable:4996)
#define N 5
struct mpow
{
double a;
int t;
};
double fun(struct mpow *x,int n)
{
int i, j;
double sum = 0.0;
for (i = 0; i < n; i++)
{
double power = 1.0;
for(j = 0; j < x[i].t; j++)
power *= x[i].a;
sum += power;
}
return sum;
}
void main()
{
void NONO();
struct mpow x[N]={ 12,0,9,2,23,1,7,2 };
double sum;
sum=fun(x,4);
printf("sum=%lf\n",sum);
NONO();
}
void NONO ()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE *in, *out ;
struct mpow x[N];
int i,j ;
double sum;
in = fopen("in.dat","r") ;
out = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
for(j=0 ; j < 4; j++) fscanf(in, "%lf,%d,", &x[j].a,&x[j].t) ;
sum=fun(x,4);
fprintf(out, "sum=%lf\n",sum);
}
fclose(in) ;
fclose(out) ;
}
难度等级:★★★★★☆☆☆☆
学点啥
14-7【计算】 当n=10时,函数值为0.909
雕虫小技
正儿八经
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
double fun(int n)
{
int i;
double sum = 0.0;
for (i = 1; i <= n; i++)
{
sum += 1.0 / (i*(i + 1));
}
return sum;
}
void main()
{
FILE *wf;
system("CLS");
printf("%f\n",fun(10));
/******************************/
wf=fopen("out.dat","w");
fprintf(wf,"%f",fun(10));
fclose(wf);
/*****************************/
}
难度等级:★☆☆☆☆
学点啥
14-8【计算】Fibonacci数列
雕虫小技
失效
正儿八经
#include <math.h>
#include <stdio.h>
int fun( int t)
{
int i, f0 = 0, f1 = 1, f = 0;
while (f < t)
{
f = f0 + f1;
f0 = f1;
f1 = f;
}
return f;
}
void main() /* 主函数 */
{ int n;
void NONO ( );
n=1000;
printf("n = %d, f = %d\n",n, fun(n));
NONO();
}
void NONO ( )
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i, n, s ;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(fp, "%d", &n) ;
s = fun(n) ;
fprintf(wf, "%d\n", s) ;
}
fclose(fp) ;
fclose(wf) ;
}
难度等级:★★★★★☆☆☆☆
学点啥
14-9 【计算】3.140578
雕虫小技
正儿八经
#include <stdio.h>
#include <math.h>
double fun ( double eps)
{
int i=1;
double sum=0.0,s1 = 1.0;
for (; s1 >= eps; i++)
{
sum += s1;
s1 = s1* i / (2 * i + 1);
}
return 2*sum;
}
void main( )
{ double x;void NONO ();
printf("Input eps:") ;
scanf("%lf",&x); printf("\neps = %lf, PI=%lf\n", x, fun(x));
NONO();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i ;
double x ;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(fp, "%lf", &x) ;
fprintf(wf, "%lf\n", fun(x)) ;
}
fclose(fp) ;
fclose(wf) ;
}
难度等级:★★★★★☆☆☆☆
学点啥
14-10【计算】534.188
雕虫小技
正儿八经
#include<math.h>
#include<stdio.h>
double fun(int n)
{
int i;
double s=0.0,sum = 0.0;
for (i = 0; i <= n; i++)
{
s += sqrt(i);
sum += s;
}
return sum;
}
void main()
{
FILE *wf;
int n;
double s;
printf("\n\nInput n: ");
scanf("%d",&n);
s=fun(n);
printf("\n\ns=%f\n\n",s);
/******************************/
wf=fopen("out.dat","w");
fprintf(wf,"%f",fun(20));
fclose(wf);
/*****************************/
}
难度等级:★★★★★☆☆☆☆
学点啥
14-10 【计算】 1.718282
雕虫小技
正儿八经
#include <stdio.h>
double fun(int n)
{
int i,fenmu=1;
double s=0.0, sum = 0.0;
for (i = 1; i <= n; i++)
{
fenmu = fenmu * i;
s = 1.0 / fenmu;
sum += s;
}
return sum;
}
void main()
{
int n;
double s;
FILE *out;
printf("\nInput n: ");
scanf("%d",&n);
s=fun(n);
printf("s=%f\n",s);
/******************************/
out=fopen("out.dat","w");
fprintf(out,"%f\n",fun(15));
fclose(out);
/******************************/
}
难度等级:★★☆☆☆
学点啥
14-11 【计算】 1.10000
雕虫小技
正儿八经
#include <math.h>
#include <stdio.h>
double fun(double x)
{
int i;
double fenzi=1.0, fenmu = 1.0,s0=0.0,s1=1.0,sum=0.0;
for (i = 1; fabs(s1-s0) >= 0.000001; i++)
{
s0 = s1;
sum += s0;
fenmu *= i;
fenzi *= (0.5-i+1)*x;
s1 = fenzi / fenmu;
}
return sum;
}
void main()
{ int i;
double x,s;
FILE *out;
printf("Input x: ");
scanf("%lf",&x);
s=fun(x);
printf("s=%f\n ",s);
/******************************/ /*这里包含输出文件程序*/
out=fopen("out.dat","w");
for(i=20;i<30;i++)
fprintf(out,"%f\n",fun(i/100.0));
fclose(out);
/******************************/
}
难度等级:★★☆☆☆
学点啥
14-12 【计算】 方差11.73
雕虫小技
正儿八经
#include<math.h>
#include<stdio.h>
double fun(double x[10])
{
int i;
double ave = 0.0,s=0.0;
for (i = 0; i < 10; i++)
ave += x[i] / 10;
for (i = 0; i < 10; i++)
s += pow((x[i] - ave), 2) / 10.0;
return sqrt(s);
}
void main()
{
FILE *wf;
double s,x[10]={95.0,89.0,76.0,65.0,88.0,72.0,85.0,81.0,90.0,56.0};
int i;
printf("\nThe original data is:\n");
for(i=0;i<10;i++)
printf("%6.1f ",x[i]);
printf("\n\n ");
s=fun(x);
printf("s=%f\n\n ",s);
/******************************/
wf=fopen("out.dat","w");
fprintf(wf,"%f",s);
fclose(wf);
/*****************************/
}
难度等级:★★☆☆☆
学点啥
14-13【计算】每相邻两个元素的平均值的平方根之和
#include <stdio.h>
#include <math.h>
double fun(double x[9])
{
int i;
double SqrtAve=0.0;
for (i=0;i<8;i++)
{
SqrtAve += sqrt((x[i] + x[i + 1]) / 2);
}
return SqrtAve;
}
void main()
{double s,a[9]={12.0,34.0,4.0,23.0,34.0,45.0,18.0,3.0,11.0};
int i;
FILE *out;
printf("\nThe original data is : ");
for(i=0;i<9;i++)
printf("%6.1f",a[i]);
printf("\n\n");
s=fun(a);
printf("s=%f\n\n",s);
/******************************/
out=fopen("out.dat","w");
fprintf(out,"%f",s);
fclose(out);
/******************************/
}
输出结果
学点啥
14-14 【计算】 0.6628
雕虫小技
正儿八经
#include <stdio.h>
double fun(int n)
{
int i;
double sum = 0.0;
for (i = 1; i <= n; i++)
sum += 1.0 / (2 * i - 1) - 1.0 / (2 * i);
return sum;
}
void main()
{ int n; double s;
void NONO( );
printf("\nInput n: "); scanf("%d",&n);
s=fun(n);
printf("\ns=%f\n",s);
NONO();
}
void NONO()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE *rf, *wf ; int n, i ; double s ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(rf, "%d", &n) ;
s = fun(n) ;
fprintf(wf, "%lf\n", s) ;
}
fclose(rf) ; fclose(wf) ;
}
难度等级:★★☆☆☆
学点啥
14-15 【计算】 1.718282
雕虫小技
正儿八经
#include <stdio.h>
double fun(int n)
{
int i;
double sum = 0.0, fenmu = 1.0;
for (i = 1; i <= n; i++)
{
fenmu = fenmu * i;
sum += 1.0 / fenmu;
}
return sum;
}
void main()
{ int n; double s;
void NONO( );
printf("\nInput n: "); scanf("%d",&n);
s=fun(n);
printf("\n\ns=%f\n\n",s);
NONO();
}
void NONO()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE *rf, *wf ; int n, i ; double s ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(rf, "%d", &n) ;
s = fun(n) ;
fprintf(wf, "%lf\n", s) ;
}
fclose(rf) ; fclose(wf) ;
}
难度等级:★★☆☆☆
学点啥
14-16 【计算】迭代方法
雕虫小技
正儿八经
#include <math.h>
#include <stdio.h>
double fun()
{
double x0, x1=0.0;
x0 = x1;
do
{
x0 = x1;
x1 = cos(x0);
}while (fabs(x0 - x1) >= 1e-6);
return x1;
}
void main()
{
void NONO ( );
printf("Root =%f\n",fun());
NONO();
}
void NONO ( )
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *wf ;
wf = fopen("out.dat","w") ;
fprintf(wf, "%f\n", fun()) ;
fclose(wf) ;
}
难度等级:★★☆☆☆
学点啥
15 【人生能有几回搏】
15-1 长度为2的字符串在另一个字符串中出现的次数
雕虫小技
wf=fopen("out.dat","w");
n=fun("asd asasdfg asd as zx67 asd mklo","as");
fprintf(wf,"%d",n);
fclose(wf);
正儿八经
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int fun(char *str, char *substr)
{
int i,k=0;
for (i = 0; str[i + 1]; i++)
{
//if (str[i] == substr[0] && str[i + 1] == substr[1])
if (*(str+i) == *substr &&*(str+i+1) == *(substr+1))
k++;
}
return k;
}
void main()
{
FILE *wf;
char str[81],substr[3];
int n;
system("CLS");
printf("输入主字符串: ");
gets(str);
printf("输入子字符串: ");
gets(substr);
puts(str);
puts(substr);
n=fun(str,substr);
printf("n=%d\n ",n);
/******************************/
wf=fopen("out.dat","w");
n=fun("asd asasdfg asd as zx67 asd mklo","as");
fprintf(wf,"%d",n);
fclose(wf);
/*****************************/
}
难度等级:★★☆☆☆
学点啥
15-2. 字符串中指定字符的个数
雕虫小技
正儿八经
#include <stdio.h>
#include <string.h>
#define M 81
int fun(char *ss, char c)
{
int i, k=0;
for (i = 0; ss[i] != '\0'; i++)
{
if (ss[i] == c)
k++;
}
return k;
}
void main()
{ char a[M], ch;
void NONO ( );
printf("\nPlease enter a string:"); gets(a);
printf("\nPlease enter a char:"); ch = getchar();
printf("\nThe number of the char is: %d\n", fun(a, ch));
NONO ( );
}
void NONO ( )
{/* 本函数用于打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/
int i ;
FILE *rf, *wf ;
char a[M], b[M], ch ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(rf, "%s", a) ;
fscanf(rf, "%s", b) ;
ch = *b ;
fprintf(wf, "%c=%d\n", ch, fun(a, ch)) ;
}
fclose(rf) ;
fclose(wf) ;
}
难度等级:★☆☆☆☆
int fun(char *ss, char c)
{
int k;
for (; *ss != '\0'; ss++)
if (*ss == c)
k++;
return k;
}
学点啥
15-3 “ea”、 “ou” 、“iu” 出现的次数
正儿八经
#include <stdio.h>
#include <string.h>
#pragma warning (disable:4996)
void fun(char*sp, int *ct)
{
int i;
for (i = 0; i < 3; i++)
ct[i] = 0;
for (i = 0; sp[i] != '\0'; i++)
{
if (sp[i] == 'e'&&sp[i+1] == 'a')
ct[0]++;
else if (sp[i] == 'o'&&sp[i+1] == 'u')
ct[1]++;
else if (sp[i] == 'i'&&sp[i+1] == 'u')
ct[2]++;
}
}
main()
{
void NONO();
char txt[200] = "abeaeafeeaoukgdoouuoiouifwieeotiu";
int c[3];
fun(txt, c);
printf("%d,%d,%d\n", c[0], c[1], c[2]);
NONO();
}
void NONO()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE *rf, *wf;
int i, c[3];
char txt[200], *p;
rf = fopen("in.dat", "r");
wf = fopen("out.dat", "w");
for (i = 0; i < 10; i++) {
fgets(txt, 200, rf);
p = strchr(txt, '\n');
if (p != NULL) *p = 0;
fun(txt, c);
fprintf(wf, "%d,%d,%d\n", c[0], c[1], c[2]);
}
fclose(rf); fclose(wf);
}
难度等级:★★☆☆☆
学点啥
15-4 统计一行字符串中单词的个数
#include<string.h>
#include<stdio.h>
#define N 80
int fun(char *s)
{
int i, num = 0;
for (i = 0; s[i]!='\0'; i++)
{
if (s[i]!=' '&&(s[i+1] == ' '|| s[i + 1] == '\0'))
/*字母的下一个字符为空格或者结束标志,则单词结束;计数++*/
num++;
}
return num;
}
void main()
{
FILE *wf;
char line[N];
int num=0;
printf("Enter a string:\n ");
gets(line);
num=fun(line);
printf("The number of word is:%d\n\n ",num);
/******************************/
wf=fopen("out.dat","w");
fprintf(wf,"%d",fun("a big car"));
fclose(wf);
/*****************************/
}
难度等级:★★☆☆☆
学点啥
关键在于如何识别单词
15-5 小写字母各自出现的次数
难度等级:★★★☆☆
在这里插入代码片
学点啥
16 数组寻寻觅觅
16-1 使数组右上半三角元素中的值乘以m
题目
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 5
void fun(int a[][N], int m)
{
}
void main()
{
int a[N][N],m, i, j;
FILE *out;
printf("*****The array*****\n");
for(i=0;i<N;i++)
{ for(j=0;j<N;j++)
{a[i][j]=rand()%20;
printf("%4d", a[i][j]);
}
printf("\n");
}
m=rand()%4;
printf("m=%4d\n",m);
fun(a,m);
printf("THE RESULT\n");
for(i=0;i<N;i++)
{ for(j=0;j<N;j++)
printf("%4d",a[i][j]);
printf("\n");
}
/******************************/
out=fopen("out.dat","w");
for(i=0;i<N;i++)
for(j=0;j<N;j++)
a[i][j]=i*j;
fun(a,8);
for(i=0;i<N;i++)
{ for(j=0;j<N;j++)
fprintf(out,"%4d",a[i][j]);
fprintf(out,"\n");
}
fclose(out);
/******************************/
}
雕虫小技
正儿八经
解答1:
void fun(int a[][N], int m)
{
int i, j;
for (i = 0; i < N; i++)//控制行坐标
{
for (j = i; j < N; j++)//控制列坐标
a[i][j] *= m;
}
}
思路:
解答2:
void fun(int a[][N], int m)
{
int i, j;
for (i = 0; i < N; i++)//控制列坐标
{
for (j = 0; j <= i; j++)//控制行坐标
a[j][i] *= m;
}
}
思路:
变形:下半三角*m
//下半三角*m 思路1
//void fun(int a[][N], int m)
//{
// int i, j;
// for (i = 0; i < N; i++)//控制列坐标
// {
// for (j = i; j < N; j++)//控制行坐标
// a[j][i] *= m;
// }
//}
//下半三角*m 思路2
void fun(int a[][N], int m)
{
int i, j;
for (i = 0; i < N; i++)//控制行坐标
{
for (j = 0; j <= i; j++)//控制列坐标
a[i][j] *= m;
}
}
难度等级:★★★★★☆☆☆☆
学点啥
16-2 左下半三角元素中的值全部置成0
雕虫小技
正儿八经
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#define N 5
void fun (int a[][N])
{
int i, j;
for (i = 0; i < N; i++)
for (j = 0; j <= i; j++)
a[i][j] = 0;
}
void main()
{
FILE *wf;
int a[N][N],i,j;
int b[N][N]={1,9,7,2,4,2,3,8,1,2,4,5,6,7,5,4,0,6,8,0,2,7,1,6,4};
system("CLS");
printf("*****The array*****\n");
for(i=0;i<N;i++) /*产生一个随机的5*5矩阵*/
{ for(j=0;j<N;j++)
{a[i][j]=rand()%10;
printf("%4d", a[i][j]);
}
printf("\n");
}
fun(a);
printf("THE RESULT\n");
for(i=0;i<N;i++)
{ for(j=0;j<N;j++)
printf("%4d",a[i][j]);
printf("\n");
}
/******************************/
wf=fopen("out.dat","w");
fun(b);
for(i=0;i<N;i++)
{ for(j=0;j<N;j++)
fprintf(wf,"%4d",b[i][j]);
fprintf(wf,"\n");
}
fclose(wf);
/*****************************/
}
难度等级:★★★★★☆☆☆☆
学点啥
1-63 二维数组中每列中最大元素
雕虫小技
正儿八经
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#define M 3
#define N 4
void fun(int tt[M][N],int pp[N])
{
int i, j, max;
for (j = 0; j < N; j++)
{
max = tt[0][j];
for (i = 0; i < M; i++)
if (max < tt[i][j])
max = tt[i][j];
pp[j] = max;
}
}
void main( )
{
void NONO( );
int t[M][N]={{68, 32, 54, 12},{14, 24, 88, 58},{42, 22, 44, 56}};
int p [ N ], i, j, k;
printf ( "The original data is : \n" );
for( i=0; i<M; i++ ){
for( j=0; j<N; j++ )
printf ( "%6d", t[i][j] );
printf("\n");
}
fun ( t, p );
printf( "\nThe result is:\n" );
for ( k = 0; k < N; k++ ) printf ( " %4d ", p[ k ] );
printf("\n");
NONO( );
}
void NONO( )
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
输出数据,关闭文件。 */
int i, j, k, m, t[M][N], p[N] ;
FILE *rf, *wf ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(m = 0 ; m < 10 ; m++) {
for( i=0; i<M; i++ ){
for( j=0; j<N; j++ )
fscanf (rf, "%6d", &t[i][j] );
}
fun ( t, p ) ;
for ( k = 0; k < N; k++ ) fprintf (wf, " %4d ", p[ k ] ) ;
fprintf(wf, "\n") ;
}
fclose(rf) ;
fclose(wf) ;
}
难度等级:★★★★★☆☆☆☆
学点啥
16-4 二维数组中最大元素的值
雕虫小技
正儿八经
#include <stdio.h>
#define M 4
int fun (int a[][M])
{
int max=a[0][0],i,j;
for (i = 0; i < 2; i++)
for (j = 0; j < M; j++)
if (max < a[i][j])
max = a[i][j];
return max;
}
void main( )
{ int arr[2][M]={5,8,3,45,76,-4,12,82} ;void NONO ();
printf("max =%d\n", fun(arr)) ;
NONO( ) ;
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *wf ;
int arr[][M]={5,8,3,90,76,-4,12,82} ;
wf = fopen("out.dat","w") ;
fprintf(wf, "max=%d\n", fun(arr)) ;
fclose(wf) ;
}
难度等级:★★★★★☆☆☆☆
学点啥
16-5 主对角线元素分别乘以2
正儿八经
#include <stdio.h>
#define N 3
#pragma warning(disable:4996)
void NONO( );
void fun( int a[N][N],int *p)
{
int i, j = 0;
for (i = 0; i < N; i++)
p[j++] = a[i][i] * 2;
for (i = 0; i < N; i++)
p[j++] = a[i][N - 1 - i] * 3;
}
main()
{ int a[N][N]={ 1,5,7,2,6,8,3,4,9};
int b[2*N],i;
fun(a,b);
for(i=0;i<2*N;i++)
printf("%d,",b[i]);
NONO();
}
void NONO( )
{ int a[N][N];
int b[2*N],i,j,k;
FILE *rf, *wf;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(k=0; k<9;k++) {
for(i=0;i<N;i++)
for(j=0;j<N;j++)
fscanf(rf,"%d,",&a[i][j]);
fun(a,b);
for(i=0;i<2*N;i++)
fprintf(wf, "%d,",b[i]);
fprintf(wf, "\n");
}
fclose(rf);
fclose(wf);
}
难度等级:☆☆☆☆☆
学点啥
16-6.转置
雕虫小技
正儿八经*
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void fun (int array[3][3])
{
int i, j, temp;
for (i = 0; i < 3; i++)
{
for (j = i+1; j < 3; j++)
{
temp = array[i][j];
array[i][j] = array[j][i];
array[j][i] = temp;
}
}
}
void main()
{
FILE *wf;
int i,j;
int array [3][3]={{100,200,300},{400,500,600},{700,800,900}};
system("CLS");
for (i=0;i<3;i++)
{for (j=0;j<3;j++)
printf("%7d ",array[i][j]);
printf("\n ");
}
fun(array);
printf("Converted array:\n ");
for (i=0;i<3;i++)
{ for (j=0;j<3;j++)
printf("%7d ",array[i][j]);
printf("\n ");
}
/******************************/
wf=fopen("out.dat","w");
for (i=0;i<3;i++)
{ for (j=0;j<3;j++)
fprintf(wf,"%7d ",array[i][j]);
fprintf(wf,"\n");
}
fclose(wf);
/*****************************/
}
输出结果
难度等级:★★☆☆☆
学点啥
16-7. 矩阵A加上A的转置
雕虫小技
正儿八经
#include <stdio.h>
void fun ( int a[3][3], int b[3][3])
{
int i,j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
b[i][j] = a[i][j]+a[j][i];
}
}
}
void main( ) /* 主程序 */
{ int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}, t[3][3] ;
int i, j ;
void NONO ( );
fun(a, t) ;
for (i = 0 ; i < 3 ; i++) {
for (j = 0 ; j < 3 ; j++)
printf("%7d", t[i][j]) ;
printf("\n") ;
}
NONO () ;
}
void NONO ( )
{/* 本函数用于打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/
int i, j, k, a[3][3], t[3][3] ;
FILE *rf, *wf ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(k = 0 ; k < 5 ; k++) {
for(i = 0 ; i < 3 ; i++)
fscanf(rf, "%d %d %d", &a[i][0], &a[i][1], &a[i][2]) ;
fun(a, t) ;
for(i = 0 ; i < 3 ; i++) {
for(j = 0 ; j < 3 ; j++) fprintf(wf, "%7d", t[i][j]) ;
fprintf(wf, "\n") ;
}
}
fclose(rf) ;
fclose(wf) ;
}
难度等级:★★★★★☆☆☆☆
学点啥