C语言编程作业
C语言编程作业
Week1编程作业1
平均数
从键盘输入某同学的3科成绩,输出这3科成绩的平均分
#include <stdio.h>
main(){
float a,b,c,avg;
scanf("%f,%f,%f",&a,&b,&c);
printf("%.2f",avg=(a+b+c)/3);
}
和、差、积、商与余数
输入2个整数 num1 和 num2,计算并输出它们的和、差、积、商与余数
#include <stdio.h>
int main(){
int a,b;
scanf("%d%d",&a,&b);
printf("%d + %d = %d\n",a,b,a+b);
printf("%d - %d = %d\n",a,b,a-b);
printf("%d * %d = %d\n",a,b,a*b);
printf("%d / %d = %d\n",a,b,a/b);
printf("%d %% %d=%d\n",a,b,a%b);
return 0;
}
字母大小写转换
#include <stdio.h>
int main(void)
{
//ASCII码表中:
// A-Z: 65-90
//a-z: 97-122
char cLetter;
char cDifference = 'a' - 'A'; // 计算出大写字母与小写字母的ASCII值的差,97-65等于32
printf("请输入要转换的字母: ");
scanf(" %c", &cLetter);
if (cLetter - 'Z' <= 0) // 如果不是大写字母,则进行转换成小写字母
cLetter += cDifference;
else // 如果是小写,则进行转换成大写字母
cLetter -= cDifference;
printf("%c", cLetter);
printf("\n");
return 0;
}
Week2编程作业2
海伦公式求三角形面积
从键盘输入三角形的三条边a,b,c的值,计算三角形的面积
错解
#include <stdio.h>
#include <math.h>
int main()
{
int a,b,c;
double p=0;
double S=0;
scanf("%d,%d,%d",a,b,c);
p = (a+b+c)/2.0;
S = sqrt(p*(p-a)*(p-b)*(p-c));
printf("三角形的面积为:%lf\n",S);
return 0;
}
正解
#include<stdio.h>
#include<math.h>
int main()
{
float a,b,c,p,area;
printf("输入三条边边长:");
scanf("%f %f %f",&a,&b,&c);
p=1.0/2*(a+b+c);
if(a+b>c&&b+c>a&&a+c>b)
{
area=sqrt(p*(p-a)*(p-b)*(p-c));
printf("三角形面积为:%.2f",area);
}
else
printf("不能构成三角形");
return 0;
}
银行存款求本利
具体描述:设银行定期存款的年利率为r,并已知存款期为n年,存款本金为m元,编程计算n年后的本利之和
第一次尝试
#include<stdio.h>
int main()
{
float a,b,m;
int year,con;
printf("输入年利率:");
scanf("%f",&a);
printf("输入存款期和本金:");
scanf("%d %f",&year,&m);
for(int i=0;i<year;i++)
{
b=m*a;
b=m+b;
con=(int)(b+0.5);
}
printf("3年后的本利之和为:%d",con);
return 0;
}
调试正解
#include<stdio.h>
int main()
{
float a,b,m;
int year,con;
printf("输入年利率:");
scanf("%f",&a);
printf("输入存款期和本金:");
scanf("%d %f",&year,&m);
int i,sum;
for(i;i<year;i++)
{
b=m*a; //利息
m=m+b;//更新本金
//sum=m+b;
}
con=(int)(m+0.5);//四舍五入
printf("%d年后的本利之和为:%d",year,con);
return 0;
}
温度转换
华氏温度转换为摄氏温度
#include <stdio.h>
int main()
{
float f;
float c;
scanf("%f", &f);
c = 5 * (f - 32) / 9.0 ;//涉及浮点型的类型时,要格外的注意到这个整数的小数点后面的数
printf("celsius=%.2f",c);
return 0;
}
圆和圆柱
从键盘输入圆半径r、圆柱高度h,求圆周长、圆面积、圆柱体积(3.14r2h),输出计算结果,要求输入、输出要有说明,输出取小数点后两位小数
结果正确,但是评分系统说是错的
#include "stdio.h"
#define PI 3.14
int main()
{
float r;
float h;
float a,b,c;
//printf("r=");
scanf("%f", &r);
//printf("h=");
scanf("%f",&h);
a = 2*PI*r ;
b = PI*r*r;
c = PI*r*r*h;
printf("Perimeter=%.2f,CircleArea=%.2f,CylinderVolume=%.2f",a,b,c);
return 0;
}
输入后面有个空格,而且是全输入
正解**(8分)**
#include "stdio.h"
#define PI 3.14
int main()
{
float r;
float h;
float a,b,c;
scanf("r=%f, h=%f",&r,&h);//quan
a = 2*PI*r ;
b = PI*r*r;
c = PI*r*r*h;
printf("Perimeter=%.2f, CircleArea=%.2f, CylinderVolume=%.2f",a,b,c);
return 0;
}
第三周修改后的最后正解
想到应该是精度问题没有解决,他是四舍五入保留到小数点的后两位,不能单纯的.f%,还应该有一个四舍五入的取舍问题。
#include "stdio.h"
#define PI 3.14
int main()
{
float r,h;
int temp;
float a,b,c,c1;
scanf("r=%f, h=%f",&r,&h);//quan
a = 2*PI*r ;
b = PI*r*r;
c = PI*r*r*h;
temp = (int)(c*100+0.5);
c1=temp/100.0;
printf("Perimeter=%.2f, CircleArea=%.2f, CylinderVolume=%.2f",a,b,c1);
return 0;
}
四舍五入的详细代码:
结果为123.460000,如果要截小数点后面的几位小数的话,则可以在 printf(“f = %f\n”,f);中的%.2f下功夫。
#include <stdio.h>
int main(int argc, const char * argv[]) {
double f = 123.4567;
//1.进行四舍五入
f = f + 0.005;
//2.将要保留的数据挪到整数位,再取整
int temp = f*100;
//一步到位
//int temp = (f+0.005)*100;
//3.转为所需数字
f = temp/100.0;
printf("f = %f\n",f);
return 0;
}
Week3编程作业3
数字转换星期
数字转换为星期:要求将输入的数字1~7转换为文字星期几,对其他数字不转换。例如,输入5时,程序输出Friday.
#include<stdio.h>
int main()
{
int a;
scanf("%d",&a);
switch(a)
{
case 1:
printf("Monday");
break;
case 2:
printf("Tuesday");
break;
case 3:
printf("Wednesday");
break;
case 4:
printf("Thursday");
break;
case 5:
printf("Friday");
break;
case 6:
printf("Saturday");
break;
case 7:
printf("Sunday");
break;
defaut:
break;
}
return 0;
}
程序调试—计算分段函数
计算下列分段函数f(x)的值(保留1位小数)
下面代码有误,调试修改
#include <stdio.h>
int main(void)
{
double x, y;
printf("Enter x: ");
scanf("%lf", x);
if(x != 0){
y = 1 / x
}
else {
y = 0;
}
printf("f(%.2f)=%.1f\n", x, y);
return 0;
}
修改为正确代码:
#include<stdio.h>
int main()
{
float a,x;
scanf("%f", &x);
if (x == 0)
{
printf("f(0.0)=0.0\n");
}
else if (x!=0)
{
a = (float)1.0 / x;
printf("f(%.1f)=%.1f\n",x,a);
}
return 0;
}
类似的代码,但是运行有误,未找出错误(已经解决)
#include <stdio.h>
int main(void)
{
float x, y;
scanf("%f",x); //没有&符号
if(x == 0)
{
printf("f(0.0) = 0.0\n");
}
else if(x!=0)
{
y = (float)1.0 / x;
printf("f(%.1f)=%.1f\n", x, y);
}
return 0;
}
输入转换
输入一个字符,如果输入字符是小写字母(a-z),则程序以大写字母打印;如果输入字符是大写字母(A-Z),则程序以小写字母打印。 如果字符是数字(0-9),程序将打印其值的平方
正解
#include<stdio.h>
#include<math.h>
int main()
{
char ch;
//printf("Press a key and then press Enter:");
scanf("%c", &ch);
if (ch >= 'a'&&ch <= 'z')//小写字母换成大写字母,小写字母的ASII码比大写的多32
{
ch = ch - 32;
printf("%c", ch);
}else if(ch >= 'A'&&ch <= 'Z')//大写字母换成小写字母
{
ch = ch + 32;
printf("%c", ch);
}
else
{
printf("%d\n",(ch-48)*(ch-48));
}
return 0;
}
printf(“%c,%d/n”, ch,ch);则会输出的是一个输入字符和整数(字符对应的ASII码)
if的循环语句中,if()+else if()+else最后一个else没有括号而且是else不是else if
putchar只能输出单个字符;而printf可以输出各种格式
成绩绩点转换
编写一个程序,将百分制成绩转换为5级制成绩,输出相应的成绩等级和绩点。百分制成绩和5级制成绩对应关系为:
系统过了,但是自己运行的时候,不及格的地方没出来,好奇怪
#include <stdio.h>
int main()
{
int a;
scanf("%d",&a);
if(a >= 90&&a <= 100)
{
printf("grade=A grade point=4.0");
}
else if(a >=85&&a <= 89)
{
printf("grade=A- grade point=3.7");
}
else if(a >=81&&a <= 84)
{
printf("grade=B+ grade point=3.3");
}
else if(a >=78&&a <= 80)
{
printf("grade=B grade point=3.0");
}
else if(a >=75&&a <= 77)
{
printf("grade=B- grade point=2.7");
}
else if(a >=72&&a <= 74)
{
printf("grade=C+ grade point=2.3");
}
else if(a >=68&&a <= 71)
{
printf("grade=C grade point=2.0");
}
else if(a >=65&&a <= 67)
{
printf("grade=C- grade point=1.7");
}
else if(a >=63&&a <= 64)
{
printf("grade=D+ grade point=1.3");
}
else if(a >=60&&a <= 62)
{
printf("grade=D grade point=1.0");
}
else
{
printf("grade=D grade point=1.0");
}
return 0;
}
三角形判决
从键盘输入三角形的三个边,判断是否构成三角形,若能,则输出该三角形的面积及类型(等腰,等边,直角,等腰直角,一般),否则输出“can not form a triangle”
下面的代码自己运行监测的时候是对的,但是系统运行的时候只得了8分
感觉是等腰和等边的判决没有做好,但是找不到问题所在
下面的代码有一定的弊端,对于等腰和等边的判断,应该先判断条件比较强的,也就是先判断等边
#include<stdio.h>
#include<math.h>
int main()
{
float a,b,c,p,area;
// printf("输入三条边边长:\n");
scanf("%f %f %f",&a,&b,&c);
p=1.0/2*(a+b+c);
if(a+b>c&&b+c>a&&a+c>b)
{
area=sqrt(p*(p-a)*(p-b)*(p-c));
if(a==b||a==c||b==c)
{
if(a==b==c)
{
printf("This is an equilateral triangle.\n");
}
else
printf("This is an isosceles triangle.\n");
}
else if(a*a+b*b==c*c||b*b+c*c==a*a||a*a+c*c==b*b)
{
printf("This is a right triangle.\n");
}
else
{
printf("This is a general triangle.\n");
}
printf("The area of this triangle is %.2f.\n",area);
}
else
printf("can not form a triangle.");
return 0;
}
第二种写法,但是系统也只是得了8分,感觉绕不开那个等边和等腰
先判断等边,再判断等腰
修改了10分
区别在于if(abc)应该写成if(ab&&bc)(总结)
if(a==b)判断语句的等于是2个=,而不是一个=号
#include<stdio.h>
#include<math.h>
int main()
{
float a,b,c,p,area;
// printf("输入三条边边长:\n");
scanf("%f %f %f",&a,&b,&c);
p=1.0/2*(a+b+c);
if(a+b>c&&b+c>a&&a+c>b)
{
area=sqrt(p*(p-a)*(p-b)*(p-c));
if(a==b&&b==c)//if(a==b==c)
{
printf("This is an equilateral triangle.\n");
}
else if(a==b ||a==c || b==c)
{
printf("This is an isosceles triangle.\n");
}
else if(a*a+b*b==c*c||b*b+c*c==a*a||a*a+c*c==b*b)
{
printf("This is a right triangle.\n");
}
else
{
printf("This is a general triangle.\n");
}
printf("The area of this triangle is %.2f.\n",area);
}
else
printf("can not form a triangle.");
return 0;
}
week4编程作业
1.菱形图案
输入5,显示
*
***
*****
*******
*********
*******
*****
***
*
#include <stdio.h>
#include <stdlib.h>
int main()
{
int line,column,i,j;
printf("Input number of rows (half of the diamond):");
scanf("%d", &line);
line=2*line-1;
column = line;
for(i=1; i<=line; i++){
if(i<(line+1)/2+1){
for(j=1; j<=column; j++){
if( (column+1)/2-(i-1)<=j && j<=(column+1)/2+(i-1) ){
printf("*");
}else{
printf(" ");
}
}
}else{
for(j=1; j<=column; j++){
if( (column+1)/2-(line-i)<=j && j<=(column+1)/2+(line-i) ){
printf("*");
}else{
printf(" ");
}
}
}
printf("\n");
}
return 0;
}
2.Get the sum of all the digits of an integer
运行结果:
54
4+5=9
#include<stdio.h>
int main()
{
int c=0,n,t,sum=0;
//printf("Input n:");
scanf("%d",&n);
while (n > 0)
{
t = n % 10;
n = n / 10;
c++;
sum += t;
printf("%d ",t);
if(n>0)
{
printf("+ ");
}
}
printf("= %d",sum);
//printf("位数等于 %d",c);
return 0;
}
正确
运行结果:
54
5+4=9
#include<stdio.h>
int main()
{
int n,sum,i,arr[20];
scanf("%d",&n);
for(i=0;n>0;i++)
{
sum+=n%10;
arr[i]=n%10;
n/=10;
}
i--;
while(i>=0)
{
printf("%d",arr[i--]);
if(i>=00)
printf(" + ");
else
printf(" = ");
}
printf("%d",sum);
}
利用函数解决直接得出结果
#include<stdio.h>
int main()
{
int n,i,j;
printf("输入一个正整数n:\n");
scanf("%d",&n);
printf("%d",sum(n));
}
int sum(int n)
{
int i,a,sum1=0;
a=n;
while(a)
{
sum1+=a%10;
a/=10;
}
return sum1;
}
3自然数分解质因子相乘
输入一个自然数n,将n分解为质因子连乘的形式输出,如输入24,则程序输出为24=2*2*2*3
#include <stdio.h>
void main()
{
int n,i;
//printf("请输入一个正整数");
scanf("%d",&n);
printf("%d=",n);
for( i = 2;i <= n;i++)
{
while(n!=i)
{
if(n%i==0)
{
printf("%d*",i);
n=n/i;
}
else
break;
}
}
printf("%d\n",n);
}
4质数(没看懂题意就算了吧)
#include<stdio.h>
int main()
{
int t,i,j,s;
for(i=3;i<=100;i++)
{
t=1;
for(j=3;j<i;j++)
if(i%j==0)
t=0;
if(t==1)
printf("%d ",i);
}
}
5纸币兑换
用一元纸币兑换一分、二分和五分的硬币,要求兑换硬币的总数为50枚,问共有多少种换法?每种换法中各硬币分别为多少?
#include<stdio.h>
int main()
{
int sum=0,i,j,k;
for (i = 1; i <=50; i++)
{
for (j = 1; j <=50; j++)
{
for (k = 1; k <=20; k++)
{
if(i+(j*2)+(k*5)==100&&i+j+k==50)
{
printf(" %d, %d, %d\n",k,j,i);
sum++;
}
}
}
}
printf("共有%种方案",sum);
}
6水仙花数
输出所有的“水仙花数”,所谓的“水仙花数”是指一个三位数其各位数字的立方和等于该数本身,例如153是“水仙花数”,因为:153 = 1的3次方 + 5的3次方 + 3的3次方。
#include<stdio.h>
int main()
{
int num = 100;
printf("水仙花数如下:\n");
do
{
int a,b,c,d;
a = num % 10;
b = num / 10 % 10;
c = num / 100;
d = a*a*a + b*b*b + c*c*c;
if (d == num)
{
printf(" %d\n",num);
}
num++;
} while (num < 1000);
system("pause");
return 0;
}
week5编程作业
1.数组中条件选数
输入10个1~200的整数到一个数组里,将能被7整除的数剔除,输出数组里余下的数据。
正确答案
#include<stdio.h>
#include<string.h>
int main()
{
int a[10];//10个数的数组
int x,i;
for(i=0;i<10;i++)//10个整数
{
scanf("%d",&x);
if(x<=200&&x>0)
{
a[i]=x;
}
}
for(i=0;i<10;i++)
{
if(a[i]%7!=0)
{
printf("%d ",a[i]);
}
}
}
得了6.67分
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[10],b[10],n=0,i;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<10;i++)
{
if(a[i]%7!=0)
{
printf("%d ",a[i]);
}
}
return 0;
}
备用代码
#include<stdio.h>
#include<string.h>
void main()
{
char a[1000000];
int b[100],c[100];
int i,j,k,len,t,flag=0,len1=0;
k=0;len=0;t=0;
gets(a);
len1=strlen(a);
for(i=0,j=0;i<=len1;i++)
if(a[i]>='0'&&a[i]<='9')
{
t=10*t+a[i]-'0';
flag=1;
}
else if(flag==0)
continue;
else
{
b[j]=t;
j++;
len++;
t=0;
flag=0;
}
for(j=0,i=0;i<len;i++)
if(b[i]%7==0) continue;
else if(b[i]%10==7)continue;
else if((b[i]/10)%10==7)continue;
else if((b[i]/100)%10==7)continue;
else if((b[i]/1000)%10==7)continue;
else
{
c[j]=b[i];
j++;
}
for(i=0;i<j-1;i++)
printf("%d ",c[i]);
printf("%d\n",c[j-1]);
}
2.编写程序实现”查表”功能
编写程序实现”查表”功能,即如果若干个数据存放在一个数组data中,该程序对输入的任意一个数查找数组data中是否有与这个数相等的数。若有,则输出该数在data中的位置,否则输出“没有找到数据!”
3.33分
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[100],i,len,con=0,n=0;
printf("请输入不大于100的整数数组长度:");
scanf("%d",&len);
printf("\n请输入%d位长度的数组:",len);
for(i=0;i<len;i++)
{
scanf("%d",&a[i]);
}
printf("\n请输入要查找的数:");
scanf("%d",&con);
for(i=0;i<len;i++)
{
if(a[i]==con)
{
printf("\n查找的数据为:%d\n",a[i]);
printf("在数组的位置为:%d\n",i+1);
//b[100]=i;
}
else if(a[i]!=con)
{
n++;
}
}
if(n=len)
{
printf("没有找到数据!");
}
return 0;
}
备选代码
#include<stdio.h>
//查表
int main()
{
int len,i;
int data[100];
printf("请输入不大于100的整数数组长度:");
scanf("%d",&len);
printf("\n请输入%d位长度的数组:",len);
for(i=0;i<len;i++)
{
scanf("%d",&data[i]);
}
int can;
printf("请输入要查找的数:");
scanf("%d",&can);
for(i=0; i<len;i++)
{
if(data[i]==can)
{
printf("\n查找的数据为:%d\n",data[i]);
printf("\n在数组的位置为:%d\n",i+1);
//printf("你要查找的数在表中!");
return 0;
}
}
printf("\n没有你要查找的数!");
return 0;
}
6.67分****
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[100],i,len,con=0,n=0;
printf("请输入不大于100的整数数组长度:");
scanf("%d",&len);
printf("请输入%d位长度的数组:",len);
for(i=0;i<len;i++)
{
scanf("%d",&a[i]);
}
printf("请输入要查找的数:");
scanf("%d",&con);
for(i=0;i<len;i++)
{
if(a[i]==con)
{
printf("查找的数据为:%d\n",a[i]);
printf("在数组的位置为:%d\n",i+1);
return 0;
//b[100]=i;
}
else if(a[i]!=con)
{
n++;
}
}
if(n=len)
{
printf("没有找到数据!");
}
return 0;
}
10分
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[100],i,len,con=0,n=0;
printf("请输入不大于100的整数数组长度:");
scanf("%d",&len);
printf("\n请输入%d位长度的数组:",len);
for(i=0;i<len;i++)
{
scanf("%d",&a[i]);
}
printf("\n请输入要查找的数:");
scanf("%d",&con);
for(i=0;i<len;i++)
{
if(a[i]==con)
{
if(n==i){
printf("\n查找的数据为:%d\n",a[i]);
printf("在数组的位置为:%d",i+1);
}
else
printf(" %d",i+1);
//b[100]=i;
}
else if(a[i]!=con)
{
n++;
}
}
if(n==len)
{
printf("\n没有找到数据!");
}
return 0;
}
3. 将1~200中能被7整除的数删除,显示余下的数据
10分,但是我没有用数组来做
#include<stdio.h>
//将1~200中能被7整除的数删除,输出余下的数!
int main()
{
int i;
for(i=0;i<=200;i++)
{
if(i%7!=0)
{
printf("%d ",i);
}
else;
}
return 0;
}
4. 输入并打印数组,求数组元素的最大值和最小值
min没出来,他老是说min等于0
问题出在不能把max和min定义为等于0.应该定义为a[0]结果才对
#include<stdio.h>
int main()
{
int i,len,max,min;
int a[100];
printf("输入整数个数:");
scanf("%d",&len);
for(i=0;i<len;i++)
{
scanf("%d",&a[i]);
}
max=0;
min=0;
for(i=0;i<len;i++)
{
if(a[i]>max)
{
max=a[i];
}
}
for(i=0;i<len;i++)
{
if(a[i]<min)
{
min=a[i];
}
}
printf("max=%d,min=%d",max,min);
return 0;
}
修改后,满分
#include<stdio.h>
int main()
{
int i,len;
int a[100];
//printf("输入整数个数:");
scanf("%d",&len);
for(i=0;i<len;i++)
{
scanf("%d",&a[i]);
}
int max=a[0];//为什么在这里定义max就是对的呢,而一开始定义max和min,就没出来,好奇怪
for(i=0;i<len;i++)
{
if(a[i]>max)
{
max=a[i];
}
}
int min=a[0];
for(i=0;i<len;i++)
{
if(a[i]<min)
{
min=a[i];
}
}
printf("max = %d, min = %d",max,min);
return 0;
}
5.最接近的相邻三数之和(写了好久,10分)
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个相邻整数,使得它们的和与 target 最接近。返回这三个数的和与target的差值。差值的定义应为绝对值,即min(|(相邻3个数的和)-target|).C语言中绝对值为fabs函数。a的绝对值为:fabs(a)
#include<stdio.h>
#include<math.h>
int main()
{
int i,len,tar,temp,k,j,m;
int a[100],b[100];
printf("输入整数个数:");
scanf("%d",&len);
printf("输入数组中的数:");
for(i=0;i<len;i++)
{
scanf("%d",&a[i]);
}
printf("target:");
scanf("%d",&tar);
/*数组a中相邻3个元素的和,并将这些和存在数组b中*/
for(k=0;k<len-2;k++)
{
b[k]=a[k]+a[k+1]+a[k+2];
}
/*按每行3个元素的形式输出*/
for(j=0;j<len-2;j++)
{
printf("%d ",b[j]);
if(j%3==2)
printf("\n");
}
//三个相邻的数组和与target目标值进行比较,找出最接近target的三个相邻和
temp=fabs(tar-b[0]);
for(j=0;j<len-2;j++)
{
m=fabs(tar-b[j]);
if(temp>m)
{
temp=m;
printf("%d",temp);
}
}
return 0;
}
呜呜呜呜,我自己写出来了,呜呜,太棒了,10分!
#include<stdio.h>
#include<math.h>
int main()
{
int i,len,tar,temp,k,j;
int a[100],b[100],c[100];
//printf("输入整数个数:");
scanf("%d",&len);
//printf("输入数组中的数:");
for(i=0;i<len;i++)
{
scanf("%d",&a[i]);
}
//printf("target:");
scanf("%d",&tar);
/*数组a中相邻3个元素的和,并将这些和存在数组b中*/
for(k=0;k<len-2;k++)
{
b[k]=a[k]+a[k+1]+a[k+2];
}
/*按每行3个元素的形式输出*/
// for(j=0;j<len-2;j++)
// {
// printf("%d ",b[j]);
// if(j%3==2)
// printf("\n");
// }
//三个相邻的数组和与target目标值进行比较,找出最接近target的三个相邻和
//printf("temp的值为:%d",temp) ;
for(j=0;j<len-2;j++)
{
c[j]=fabs(tar-b[j]);
}
temp=fabs(tar-b[0]);
for(j=0;j<len-2;j++)
{
c[j]=fabs(tar-b[j]);
if(c[j]<temp)
{
temp=c[j];
}
}
printf("%d",temp);
return 0;
}
6 找出二维数组的“鞍点”(花了很久的时间,4小时,好失败)
10分代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
int data[100][100];
int i, j, k, a, b, max;
printf("请输入二维数组行数:\n");
scanf("%d", &a);
printf("请输入二维数组列数:\n");
scanf("%d", &b);
//输入二维数组的值
printf("请输入%d*%d数组的数值:\n", a, b);
for (i = 0; i < a; i++)
{
for (j = 0; j < b; j++)
scanf("%d", &data[i][j]);
}
//判断出该行元素的最大值
for (i = 0; i < a; i++)
{
for (j = 0, max = 0; j < b; j++)//先找出i行的最大值的数max
{
if (data[i][j] >= max)
{
max = data[i][j];
}
}
int flag = 0;
for ( j=0 ; j<b ; j++ )
{
if ( data [i][j] == max )
{
for ( k=0 ; k<a ; k++ )
{
if ( data [k][j] < data[i][j] )
{
break;
}
}
if ( k==a )
{
flag = 1;
printf("第%d行第%d列存在鞍点,值为 %d\n", i + 1, j+1, data[i][j]);
}
}
}
if (flag==0)
{
printf("第%d行不存在鞍点\n", i + 1);
//break;
}
}
return 0;
}
10分的第二种思路
#include<stdio.h>
int main()
{
int a[100][100],m,n,max[m],min[n],i,j;
int k=0;//判断数相等的标志
scanf("%d %d",&m,&n);//行;列
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
printf("请输入二维数组行数:\n");
printf("请输入二维数组列数:\n");
printf("请输入%d*%d数组的数值:\n",m,n);
for(i=0;i<m;i++)
{
max[i]=a[i][0];//给行最大数max赋初值
min[i]=a[0][i];//给列最小数max赋初值
for(j=0;j<n;j++)
{
if(max[i]<a[i][j])
{
max[i]=a[i][j];
}
if(min[i]>a[j][i])
{
min[i]=a[j][i];
}
}
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]==max[i]&&a[i][j]==min[j])
{
printf("第%d行第%d列存在鞍点,值为 %d\n",i+1,j+1,a[i][j]);
k=1;
}
}
if(k==0)
{
printf("第%d行不存在鞍点\n",i+1);
}
k=0;
}
return 0;
}
备选代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
int data[100][100];
int i, j, k, p, q,a,b,max, min;
scanf("%d",&a);
scanf("%d",&b);
//输入二维数组的值
for (i=0; i<a; i++)
{
for (j=0; j<b; j++)
scanf("%d", &data[i][j]);
}
//判断出该行元素的最大值
for (i=0; i<3; i++)
{
for (j=0, max=0, p=0; j<a; j++)
{
if (data[i][j]>max)
{
max=data[i][j];
p=j;
}
else
{
max=max;
p=p;
}
}
//判断最大值在该列是否为最小值
for (k=0, min=data[i][p], q=i; k<b; k++)
{
if (data[k][p]<min)
{
min=data[k][p];
q=k;
}
else
{
min=min;
q=q;
}
}
//如果该最大值行号没有改变,输出鞍点
if (i==q)
{
printf("%d is the saddle point!\n", data[i][p]);
break;
}
}
//输出没有鞍点
if (i==3 && i!=q)
printf("There is no saddle point!\n");
system("pause");
return 0;
}
第二个比较完善的代码,且运行正确
#include<stdio.h>
/*
找出一个二维数组中的鞍点,即该位置上的元素在该行最大,
在该列上最小,也可能没有鞍点。存在则输出坐标;否则输出 -1.
*/
int main(void)
{
int a[3][3],max,min,i,j,k,m;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);//输入数组
for(i=0;i<3;i++)
{
max=a[i][0];//给max 赋初始值
for(j=0;j<3;j++)
if(a[i][j]>max)
{
max=a[i][j];
k=j;//找到第i行的最大值;
}
min=max;//把max的值作为第k列的最小值
for(m=0;m<3;m++)//第k列保持不变,变换行数m
{
if(min>a[m][k])//若不符合鞍点性质,则break结束
break;
}
if(m==3)
{
printf("%d %d",i+1,k+1);//遍历完当前列,若当前值符合鞍点性质,
break; //则输出鞍 点坐标
}
}
if(i==3) printf("%d",-1);//若整个数组遍历完成,还未找到鞍点,则返回-1
return 0;
}
6.67分
#include <stdio.h>
#include <stdlib.h>
int main()
{
int data[100][100];
int i, j, k, p, q,a,c,b,max, min;
printf("请输入二维数组行数:\n");
scanf("%d",&a);
printf("请输入二维数组列数:\n");
scanf("%d",&b);
//输入二维数组的值
printf("请输入%d*%d数组的数值:\n",a,b);
for (i=0; i<a; i++)
{
for (j=0; j<b; j++)
scanf("%d", &data[i][j]);
}
//判断出该行元素的最大值
for (i=0; i<a; i++)
{
//a1=0;
// a1++;
for (j=0, max=0, p=0,c=0; j<b; j++)
{
if (data[i][j]>=max)
{
max=data[i][j];
p=j;//该行元素的最大值的列数
c=i;//该行元素的最大值的行数
}
else
{
max=max;
p=p;
c=c;
}
}
//判断最大值在该列是否为最小值
for (k=0, min=data[i][p], q=i; k<a; k++)
{
if (data[k][p]<min)
{
min=data[k][p];
q=k;
}
else
{
min=min;
q=q;
}
}
//如果该最大值行号没有改变,输出鞍点
if (i==q)
{
printf("第%d行第%d列存在鞍点,值为 %d\n",i+1,p+1, data[i][p]);
//break;
}
if(i!=q)
{
printf("第%d行不存在鞍点\n",i+1);
//break;
// a1++;
}
}
// 输出没有鞍点
//if (a==a1 )
//{
// printf("无鞍点!\n");
//}
system("pause");
return 0;
}
7二维数组基础题——矩阵运算
矩阵运算:读入一个正整数n(1<=n<=6),再读入n阶方阵a,计算该矩阵除副对角线,最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线
#include<stdio.h>
int main()
{
int n,num;
scanf("%d",&n);
int sum=0;
int i =0;
for( i=0;i<n*n;++i)
{
scanf("%d",&num);
if(i/n == n-1) continue;
if(i%n == n-1) continue;
if((n-1+i)/n + i%n == n) continue;
sum += num;
}
printf("%d\n",sum);
return 0;
}
8.冒泡算法
#include<stdio.h>
int main()
{
int arr[10]; /*定义一个数组*/
int i,j; /*i,j为将要使用的循环控制变量*/
int temp;
int len;
printf("Please input the number of the array not bigger than 10:\n");
scanf("%d",&len);
printf("Please input 3 data: \n");
for(i=0;i<len;i++)
{
scanf("%d",&arr[i]);
} /*temp为数值交换时使用的临时变量*/
// for(i=0;i<=9;i++) /*输入10个数*/
// {
// scanf("%d",&arr[i]);
// }
for(i=1;i<=len-1;i++) /*i代表排序轮数,总轮数=元素个数-1*/
{
for(j=0;j<len-i;j++) /*j代表每轮排序次数,次数=个数-轮数-1,但j初值为0*/
{
if(arr[j]>arr[j+1]) /*如果前一项比后一项大,则两项的值互换*/
{
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
for(i=0;i<=len-1;i++) /*输出排序后的数组*/
{
printf("The sorted data array in ascending order is:%lf",arr[i]);
}
return 0;
}
满分十分
#include<stdio.h>
int main()
{
float arr[10]; /*定义一个数组*/
int i,j; /*i,j为将要使用的循环控制变量*/
float temp;
int len;
printf("Please input the number of the array not bigger than 10:\n");
scanf("%d",&len);
printf("Please input %d data: \n",len);
for(i=0;i<len;i++)
{
scanf("%f",&arr[i]);
} /*temp为数值交换时使用的临时变量*/
// for(i=0;i<=9;i++) /*输入10个数*/
// {
// scanf("%d",&arr[i]);
// }
for(i=1;i<=len-1;i++) /*i代表排序轮数,总轮数=元素个数-1*/
{
for(j=0;j<len-i;j++) /*j代表每轮排序次数,次数=个数-轮数-1,但j初值为0*/
{
if(arr[j]>arr[j+1]) /*如果前一项比后一项大,则两项的值互换*/
{
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
printf("The sorted data array in ascending order is: ");
for(i=0;i<=len-1;i++) /*输出排序后的数组*/
{
printf("%.2f ",arr[i]);
}
return 0;
}
9.对输入字符串采用冒泡排序法进行排序
10分
#include <stdio.h>//包含标准输入输出函数
#include <stdlib.h>//包含malloc动态地址分配
#include <string.h>//包含memset函数meset(a,0,sizeof(a));//strlen(str);求字符串的长度
/*
用选择法或冒泡法对输入的50个字符(按照ASII码由小到大)进行排序
*/
int main()
{
void sort(int length,char s[]);//声明排序函数
char str[55];//使用字符数组存储
int len;
scanf("%s",str);
len=strlen(str);//计算字符数组的长度
//printf("字符串长度%d\n",len);
sort(len,str);
return 0;
}
void sort(int lenth,char s[]) //冒泡排序
{
int i,j;
char temp;
for(i=0;i<lenth-1;i++){//len-1次冒泡排序
for(j=lenth-1;j>i;j--){
if(s[j-1]>s[j]){//大的在前 逆序
temp = s[j];
s[j] = s[j-1];
s[j-1] = temp;//交换
}
}
}
for(i=0;i<lenth;i++){
printf("%c",s[i]);
}
printf("\n");
}
10.字符基础题——判断回文字符串
判断输入的一串字符是否为“回文”。所谓“回文”,是指顺读和倒读都一样的字符串。如“XYZYX”和“xyzzyx”都是回文。试编写相应程序。输入字符串长度不超过50。
#include<stdio.h>
#include<string.h>
int main()
{
char arr[100];
int len;
int i=0;
int j;
//printf("请输入您要判断的字符串:\n");
gets(arr);
len=strlen(arr);
j=len-1;
while( (i<j)&&(arr[i]==arr[j]) )
{
i++;
j--;
}
if(i>=j)
printf("YES\n");
else
printf("NO\n");
return 0;
}
11.字符串基础题——删除指定区间的字符(方法很巧)
编写一个程序,以从字符串中删除指定区间的字符。 该函数应采用三个参数:源字符串,源字符串中的起始索引号以及要删除的字符数
#include <stdio.h>
#include <string.h>
int main()
{
char line[100];
int i,len;
int s,e;
//printf("输入一个字符串: ");
gets(line); //不能使用scanf()函数,因为字符串中有空格,而scanf()输入的结束判断是以空格为标准的
len = strlen(line);
//printf("输入起始索引: ");
scanf("%d %d",&s,&e);
for( i=s+e;i<=len;i++)
{
line[i-e]=line[i];
}
printf("%s\n",line);
return 0;
}
结果:
the wrong son
4 6
the son
我自己写的代码是:不对
#include <stdio.h>
#include <string.h>
int main()
{
char line[100];
int i,j,len;
int s,e;
printf("输入一个字符串: ");
gets(line);
//scanf("%s",line);
len = strlen(line);
printf("输入起始索引: ");
//gets(s);
//gets(e);
// e=getchar();
scanf("%d %d",&s,&e);
for(i=0;i<len+1;i++)
{
//if(i==s)
{
for(j=i;j<len;j++)
{
if(j=s)
{
line[j]=line[s+e];
}
}
}
len--;
i--;
}
printf("%s\n",line);
return 0;
}
12.统计字符串中字符出现频率并按字母顺序打印统计结果
【问题描述】从键盘输入一个字符串(假设仅包含小写字母字符),统计字符串中各字符出现的频率,并按字母顺序输出个字符的统计频率 .提示:定义一个长度为26的整型数组 int count[26],用于统计各字母的出现频率。 例如字母为c, 则count[‘c’-‘a’]+=1. 最后依次输出count数组中计数值不为零的字母即可。
10分
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char arr[10] = { 0 };//arr[]里面的数据会影响得分,10只是刚好符合数据监测而已,瞎猫碰上死耗子
int i=0;
int len = sizeof(arr) / sizeof(char);
//从键盘读取十个字符
for ( i = 0; i < len-1; i++)
{
scanf("%c", &arr[i]);
}
int count[26] = { 0 };
//printf("%u\n", sizeof(count));
for ( i = 0; i < len; i++)
{
//arr数组中字母的ascII码值减去'a'刚好得到count数组中下标
int index = (int)arr[i] - 'a';
count[index]++;
}
for ( i =0 ; i < 26; i++)
{
if (count[i] != 0)
{
printf("%c %d\n", 'a' + i, count[i]);
}
}
return 0;
}
week6编程作业
1数组之和
尝试自己写的,但不对,调试没出来
#include<stdio.h>
int ArraySum (int n, int m,int a[n][m]);//函数申明
//功能函数
int ArraySum ( int n,int m,int a[n][m])
{
for( int i = 0;i<n;i++)
{
for(int j=0;j<m;j++)
{
int sum+=a[i][j];
}
}
return sum;
}
int main()
{
int n,m,i,j;
scanf("%d%d",&n,&m);
//输入二维数组的值
for( i = 0;i<n;i++)
{
for(j=0;j<m;j++){
scanf("%d",&a[i][j]);
}
}
ArraySum();
return 0;
}
10分:
#include <stdio.h>
//int fun(int a[][],int n,int m);
int main()
{
int a[100][100],n,m,sum=0;
int i,j;
int ArraySum(int a[100][100],int n,int m);
//printf("Input the row and col number of array:");
scanf("%d%d",&n,&m);
//printf("Input the number of array:");
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf("%d",&a[i][j]);
sum=ArraySum(a,n,m);
}
}
printf("%d\n",sum);
}
int ArraySum(int a[100][100],int n,int m)
{
int sum=0;
int i,j;
for(i=0;i<n;i++)
{
//int sum =0;
for(j=0;j<m;j++)
sum+=a[i][j];
}
return sum;
}
注意的点:
在main函数中要将sum初始化,不然会有警告消息提示 在功能函数中,int sum的初始化要放在for循环的外面,不能放在for循环里面 函数声明可以放在mian函数的外面或者里面都行,只要放在调用的前面就可以
2.欧氏距离
使用函数计算两点间的距离:给定平面任意两点坐标(x1,y1)和(x2,y2),求这两点之间的距离(保留2位小数)。
要求定义和调用函数dist(x1,y1,x2,y2)计算两点间距离
#include <stdio.h>
#include <math.h>
//函数声明
double dist( double x1, double y1, double x2, double y2 );
//主函数
int main()
{
double x1, y1, x2, y2;
scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2);
printf("Distance=%.2f\n", dist(x1, y1, x2, y2));
return 0;
}
//功能函数
double dist( double x1, double y1, double x2, double y2 )
{
double d = pow( (x1-x2), 2) + pow( (y1-y2), 2);
double f = sqrt( d );
return f;
}
3.判断素数(主要是这个算法没搞明白,自己编2小时,满分)
编写一个判素数的函数,在主函数中输入一个整数,输出是否为素数的信息。主函数中循环输入整数,当输入小于3的整数结束程序。
判断素数的基本函数,运用一个数来记录下这个数除以比这个数小的数的所有能除的次数
#include <stdio.h>
int main()
{
int n;
printf("请输入一个1-100之间的整数:\n");
scanf("%d", &n);
int m = 0,i;
for (i = 2; i < n; i++ )
{
if(n % i == 0)
{
m++;
}
}
if (m == 0)
{
printf("%d是素数\n", n);
}
else
{
printf("%d不是素数\n", n);
}
return 0;
}
用函数模块来写,带函数判断质数的代码
成功:有一个连续输入的要求(自己写的,编了将近2小时)
#include <stdio.h>
int Prime( int n);//函数声明
int main()
{
int n;
while(1)//连续输入的一个需求
{
scanf("%d", &n);
printf("m=\n");
if ( n<3 )
{
printf("The end.\n");
break;
}
else
{
Prime(n);
}
}
return 0;
}
int Prime ( int n )
{
int m = 0,i;
for( i = 2 ; i< n ; i++)
{
if( n%i == 0)
{
m++;
}
}
//进行总的一个判断,把关
if(m == 0)
{
printf("%d is prime.\n",n);
}
else
{
printf("%d is not prime.\n",n);
}
return 0;
}
4.逆序字符串(速度很快,代码编的很快,通过了)
编写一个可以将字符串逆序的函数,在主函数中调用该函数将输入字符串逆序输出。
思路:
让字符串数组从末尾输出,即可,最后再i--
字符串的长度等于strlen(str),要加入一个头文件include<string.h>
#include <stdio.h>
#include<string.h>
void Str(char str[])
{
int i;
printf("the reverse string:");
for(i=strlen(str);i>=0;i--)
{
printf("%c",str[i]);
}
}
int main()
{
char str[100];
scanf("%s",str);
printf("the original string:%s\n",str);
Str(str);
return 0;
}
5.替换字符串中字符(速度很快,代码编的很快,通过了)
编写一个字符串替换函数,可以将所给字符串中与指定字符相同的所有字符替换成要求的字符,并在主函数中调用该函数实现字符串替换操作。(10分)
#include<stdio.h>
#include<string.h>
void replace(char str[], char c, char s)//函数块
{
int i=0;
for(i=0;i<=strlen(str);i++)
{
if(str[i]==c)
{
str[i]=s;
}
}
}
int main()
{
char str[100]="ABCDECCFGC";
replace(str, 'C', '5');
printf("%s\n", str);
}
6.函数——将字符串插入(知识点总结,数组串,指针函数)
编写一个将一个字符串插入到另一个字符串中的函数,在主函数中调用该函数实现字符串的插入操作。插入函数包含三个参数,即将str2插入到str1的pos位置。
思路:
//char * change(char s1[],char s2[],int n)
一个指针函数, 根据传入的参数`,来计算函数功能,其结果通过指针的形式返回给调用方
1.先把str1的值放到str{2个字符串的长度}末尾,str1字符串中有足够的空间存放str2字符串
2.然后将s2的值和插入的位置建立起来,s2[i]和插入值n的联系为s1[i+n]
3.malloc函数的作用是动态分配内存,以解决静态内存定长、不能手动释放等缺陷,free(p)
知识点:字符串数组
char ch[N] 和char *str = (char*)malloc(N*sizeof(char))
char ch[N] :当数组中个数成为自变量的时候,不能使用这种定义方式,应该申请动态数组
char *s1 = (char*)malloc(20 * sizeof(char));///申请20个连续字节的空间,定义*ch,指向该连续空间的首地址sizeof(char)=1)
动态数组
当函数的返回值为指针的时候,倘若指针指向的是局部变量:ch[6]为存储的是局部变量,当返回指针str时,函数外,该变量生命周期结束,所以要使用动态数组
void* func(int N)
{
char *str = (char*)malloc(N*sizeof(char));
return str;
}
void* func(int N)
{
char ch[6]="hello";
char *str = ch;
return str;
}
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
char *change(char s1[],char s2[],int n)
{
int len1=strlen(s1),len2=strlen(s2),i;
char N[]="error";
char *P=N;
//char *P="error";
if(n<0||n>len1)
{
return P;
}
else
{
for(i=len1;i>=n-1;i--)//把字符串插入点后的文件挪出去
{
s1[i+len2]=s1[i];
}
for(i=0;i<len2;i++)//把字符串2的内容挪进来
{
s1[n+i]=s2[i];
}
return s1;
}
}
int main()
{
char *s1 = (char*)malloc(20 * sizeof(char));//动态分配内存 ,free(p)手动释放内存
char *s2 = (char*)malloc(20 * sizeof(char));
//char s1[20],s2[20];//静态分配内存 ,不能手动释放
int n;
char s3[30];
char *newstr = s3;//作为函数调用方的地方
printf("Please input two strings:\n");
scanf("%s%s", s1,s2);//不需要加&,指针就是指向地址
printf("Please input the position of insert:\n");
scanf("%d", &n);
newstr = change(s1, s2, n);
printf("%s\n", newstr);
free(s1);
free(s2);
}
10分
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
char *change(char s1[],char s2[],int n)
{
int len1=strlen(s1),len2=strlen(s2),i;
char N[]="error";
char *P=N;
//char *P="error";
if(n<0||n>len1)
{
return P;
}
else
{
for(i=len1;i>=n-1;i--)//把字符串插入点后的文件挪出去
{
s1[i+len2]=s1[i];
}
for(i=0;i<len2;i++)//把字符串2的内容挪进来
{
s1[n+i]=s2[i];
}
return s1;
}
}
int main()
{
char *s1 = (char*)malloc(20 * sizeof(char));//动态分配内存 ,free(p)手动释放内存
char *s2 = (char*)malloc(20 * sizeof(char));
//char s1[20],s2[20];//静态分配内存 ,不能手动释放
int n;
char s3[30];
char *newstr = s3;//作为函数调用方的地方
printf("Please input two strings:\n");
scanf("%s%s", s1,s2);//不需要加&,指针就是指向地址
printf("Please input the position of insert:\n");
scanf("%d", &n);
newstr = change(s1, s2, n);
printf("%s\n", newstr);
free(s1);
free(s2);
}
写出来了10分
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
char *change(char s1[],char s2[],int n)
{
int len1=strlen(s1),len2=strlen(s2),i;
char N[]="error";
char *P=N;
//char *P="error";
if(n<0||n>len1)
{
return P;
}
else
{
for(i=len1;i>=n-1;i--)
{
s1[i+len2]=s1[i];
}
for(i=0;i<len2;i++)
{
s1[n+i]=s2[i];
}
return s1;
}
}
int main()
{
char *s1 = (char*)malloc(20 * sizeof(char));
char *s2 = (char*)malloc(20 * sizeof(char));
int n;
char s3[30];
char *newstr = s3;//作为函数调用方的地方
printf("Please input two strings:\n");
scanf("%s%s", s1,s2);//不需要加&,指针就是指向地址
printf("Please input the position of insert:\n");
scanf("%d", &n);
newstr = change(s1, s2, n);
printf("%s\n", newstr);
}
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
char *change(char s1[],char s2[],int n)
{
int len1=strlen(s1);
int len2=strlen(s2);
int i;
char N[]="error";
char *P=N;
//char *P="error";
if(n<0||n>len1)
{
return P;
}
else
{
for(i=len1;i>=n-1;i--)
{
s1[i+len2]=s1[i];
}
for(i=0;i<len2;i++)
s1[n+i]=s2[i];
return s1;
}
}
int main()
{
char *s1 = (char*)malloc(20 * sizeof(char));
char *s2 = (char*)malloc(20 * sizeof(char));
int n;
char s3[30];
char *newstr = s3;//作为函数调用方的地方
printf("Please input two strings:\n");
scanf("%s%s", s1,s2);//不需要加&,指针就是指向地址
printf("Please input the position of insert:\n");
scanf("%d", &n);
newstr = change(s1, s2, n);
printf("%s\n", newstr);
}
原因:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9biHqIta-1654157258513)(E:\Coding\typora\C语言编程photo\image-20220418105422727.png)]
参考代码:(6.67分)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char *change(char s1[],char s2[],int n)
{
int len1=strlen(s1);
int len2=strlen(s2);
int i;
int j=0;
int k=0;
for(i=len1;i>=n-1;i--)
{
s1[i+len2]=s1[i];
}
for(i=0;i<len2;i++)
s1[n+i]=s2[i];
return s1;
}
int main()
{
char *s1 = (char*)malloc(20 * sizeof(char));
char *s2 = (char*)malloc(20 * sizeof(char));
int n;
char s3[30];
char *newstr = s3;
printf("Please input two strings:\n");
scanf("%s%s", s1,s2);
// printf("请输入第二个字符串:");
// scanf("%s", s2);
printf("Please input the position of insert:\n");
scanf("%d", &n);
newstr = change(s1, s2, n);
printf("%s\n", newstr);
}
7. 函数——多函数综合题
10分
#include<stdio.h>
//以下为全局变量
int price[5]={100,50,35,150,200};//产品报价
int item_n[100][5];//用来表示不同销售员对应产品销售数量的数组,如 item_n[1][3]表示销售员1
//销售的3号产品的数量。销售员编号从0开始
int n=0;
int maximum (int values[],int n)
{
//找出谁是销售冠军,返回为数组最大值的索引
int top_nu=0,i;
for(i=0;i<n;i++)
{
if(values[i]>values[top_nu]) top_nu=i;
}
return top_nu;
}
void total_sales(int n,int arr[][5])
{
int i,j;
int values[100]={0};
for(i=0;i<n;i++)
{
for(j=0;j<5;j++)
{
values[i] +=arr[i][j]*price[j];
}
}
for(i=0;i<n;i++)
{
printf("total sales of salesman %d is %d\n",i,values[i],values[i]*0.1);
printf("income of salesman %d is %.4lf\n",i,values[i]*0.1);
}
int max=maximum(values,n);
printf("sales-champion is salesman %d\n",max);
/*
计算每个销售人员的总销售额并输出。
销售佣金为10%,请计算每个销售员的收入并输出
调用 maximum() 输出谁是销售冠军
*/
}
int main()
{
//数据读入
int i,j;
printf("please input the number of salesman\n");
scanf("%d",&n);
printf("please input the number of items sold for each product of %d salesman\n",n);
for(i=0;i<n;i++)
{
for(j=0;j<5;j++)
scanf("%d",&item_n[i][j]);
}
total_sales(n,item_n);
}
8. 函数——递归将整数转为二进制
#include <stdio.h>
void binary(int num);
int main()
{
//实现十进制转换成二进制
int num = 0;
scanf("%d",&num);
binary(num);
return 0;
}
void binary(int num) {
int i = num % 2;
if (num > 0) {
binary(num / 2);
printf("%d", i); //递归的后序输出,实现输出的倒置
}
}
9. 实验 6 函数:整数分解为素因子乘积
#include <math.h>
#include <stdio.h>
#include <string.h>
int isPrime(int para)//函数isPrime用来判断质数
{
int result=1;
if(para%2==0||para<2){
result = 0;
}else{
int i=3;
for(i=3;i<para;i=i+2)
{
if(para%i==0)
{
result = 0;
break;
}
}
}
return result;
}
int main()
{
int input;
scanf("%d",&input);
printf("%d=",input);
int i=2;
if(isPrime(input)){
printf("%d",input);
}else{
for(i=2;i<input;i++)
{
while(input%i==0)
{
input=input/i;
if(isPrime(input)||input==2)//此处是最后一次除法
{
printf("%d*%d",i,input);
break;
}else//每找到一个质因数就输出i*
{
printf("%d*",i);
}
}
}
}
return 0;
}
10. 函数——哥德巴赫猜想之偶数分解
任何一个大偶数都能分解成两个质数相加
10分
#include <stdio.h>
#include <math.h>
int isPrime(long x){
int i;
for(i=2;i<(int)sqrt(x)+1;i++)
{
if(x%i==0)return 1;
}
return 0;
}
void getPrimePair(long m)
{
int i;
int num1;
int num2;
int count=0;
for(i=2;i<=m/2;i++)
{
num1 =i;
if(isPrime(num1)) num1=0;
num2=m-i;
if(isPrime(num2)) num2=0;
if(num1&&num2)
{
printf("%ld = %d + %d\r\n",m,num1,num2);
count++;
}
}
printf("The number %ld has %d prime number decomposition methods\n",m,count);
}
int main()
{
long number;
scanf("%ld",&number);
if(number%2!=0||number<4) printf("The end");
else getPrimePair(number);
return 0;
}
#include<stdio.h>
//17 2-n^2 \
//验证是否为素数,17;2-16,2-4
//这里的int 意思是,执行我这个方法后,会返回一个整数
int isss(int number){
int i;
for(i=2;i*i<=number;i++){
//取余,被取余为0就代表可以被整除
if(number%i==0){
//如果不是素数的话,就返回一个0
return 0;
}
}
//如果是素数的话,就返回1,return就是返回的意思
return 1;
}
void main()
{
int i,j,k;
//输入任意一个偶数,输出它等于两个素数之和
printf("请输入一个偶数:");
scanf("%d",&i);
//素数肯定小于输入的偶数
for(j=2;j<i;j++)
{
//如果不是素数,就跳出本次循环,isss()是上面我们自定的判断是否为素数的方法,j是传过去判断的数
if(!isss(j))
continue;
//第二个素数肯定小于或等于偶数-第一个素数
for(k=(i-j);k>j;k--){
//如果不是素数,就跳出本次循环
if(!isss(k))
continue;
//判断两个素数之和是否为我们输入的偶数
if(j+k==i)
{
//找到符合的了,就输出啦
printf("\n [%d] = [%d] + [%d] ",i,j,k);
}
}
}
}
week7编程作业
1在数组中查找指定元素
在数组中查找指定元素:输入一个正整数n(1<n<=10),然后输入n个整数存入数组a中,再输入一个整数x,在数组a中查找x,如果找到则输出相应的下标,否则输出“no found".
直接用数组的地址来查找,而不是用指针
#define _CRT_SECURE_NO_WARNINGS //防报错
#include<stdio.h>
#define N 10
int Search(int list[], int n, int x)
{
int i;
for(i = 0; i < n; i++)
if(list[i] == x)
return i;
return -1;
}
int main()
{
int a[N], i, m, x, n;
//printf("请输入元素个数:");
scanf("%d", &n);
// printf("请输入%d个元素:", n);
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
//printf("请输入要查找的元素:");
scanf("%d", &x);
m = Search(a, n, x);
if(m == -1)
printf("no found");
else
printf("%d", m);
}
指针和数组都用到了
#include<stdio.h>
int search(int a[], int n, int x)
{
int i,*p;
p=a;
for(i=0;i<n;i++)
{
if(*(p+i)==x)
{
return i;
break;
}
}
return -1;
}
int main()
{
int i,a[10],b,x,n;
//printf("请输入元素个数:\n");
scanf("%d", &n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
//printf("请输入一个查找的数\n");
scanf("%d",&x);
b=search(a,n,x);
if(b==-1)
{
printf("no found");
}
else
{
printf("%d",b);
}
}
2指针调换顺序
完美的十分
#include <stdio.h>
int main()
{
void f(int *p);
int a[10],i=0;
//int *d;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
//d=&a[0];
f(a);
return 0;
}
void f(int *p)//函数无返回值
{
int n;
for(n=0;n<10;n++)
{
if(n<5)
{
printf("%d ",*(p+n+5));
}
else
{
printf("%d ",*(p+n-5));
}
}
}
10分
#include <stdio.h>
int main()
{
void f(int *p);
int a[10];
int i=0,*d;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
d=&a[0];
f(d);
return 0;
}
void f(int *p)
{
int n;
for(n=0;n<10;n++)
{
if(n<5)//n<=5时会出现错误
{
printf("%d ",*(p+n+5));
}
else
// break;
{
printf("%d ",*(p+n-5));
}
}
}
选择中n<=5时会出现错误,但不知道为啥有错!
3利用指针找最大值
#include <stdio.h>
int main()
{
void Max(int *p,int n);
int a[10],i=0,n;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
Max(a,n);//传参数不要传错了
return 0;
}
void Max(int *p,int n)
{
int num=*(p),i;//num的初始化应该写在循环外面
for(i=0;i<n;i++)
{
//num=*(p);//这个应该写在循环外面
if(num<*(p+i))
{
num=*(p+i);
}
}
printf("The largest value is %d",num);
}
4函数利用指针求和差
#include <stdio.h>
#include <stdlib.h>
void sum_diff(float op1, float op2, float *psum ,float *pdiff) ;
int main()
{
float data1 , data2 ,sum , diff,*psum ,*pdiff ;
psum = ∑
pdiff = &diff ;
scanf("%f%f",&data1,&data2);
sum_diff(data1,data2 ,psum , pdiff);
printf("the sum is %.6f\nthe diff is %.6f\n",sum ,diff);
return 0;
}
void sum_diff(float op1, float op2, float *psum ,float *pdiff)
{
*psum = op1 + op2 ;
*pdiff = op1 - op2;
}
5指针排序
编写一个名为sortn()的函数,使用指针将n个整数按升序排序。(这个函数不能用数组实现)
标准答案
#include<stdio.h>
int sort(int*p,int n)
{
int i,j,temp;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(p[i]>p[j])
{
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
int main()
{
int i,n;
int a[10];
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,n);
for(i=0;i<n-1;i++)
{
printf("%d ",a[i]);
}
printf("%d\n",a[i]);
}
return 0;
}
#有问题的代码
#include <stdio.h>
#include <stdlib.h>
void sortn(int *p, int n );
int main()
{
int a[30],n,i;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sortn(a, n);
return 0;
}
void sortn(int *p, int n )
{
int i, j, temp;
for (i = 1; i <= n; i++)//外层循环是比较的轮数,数组内有10个数,那么就应该比较10-1=9轮
{
for (j = 0; j <= n - i; j++)//内层循环比较的是当前一轮的比较次数,例如:第一轮比较9-1=8次,第二轮比较9-2=7次
{
if (*(p+j) > *(p+j + 1))//相邻两个数如果逆序,则交换位置
{
temp = *(p+j);
*(p+j) = *(p+j + 1);
*(p+j + 1) = temp;
}
}
}
for (i = 0; i < n; i++)
printf("%d ",*(p+i));
}
6指针实现字符串比大小
10分,但是会有警告符号
//输入三个字符串,按由小到大的 顺序输出,用指针来实现
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define M 5
int main()
{
char a[M], b[M], c[M];
char *p, *q, *t;
char x[M];
//printf("请输入三个字符串:\n");
scanf("%s%s%s",&a,&b,&c);
// gets(a);
// gets(b);
// gets(c);
p = a; // abc
q = b; // agf
t = c; // ccc
// printf("输出%d\n", strcmp(p, q)); // 输出-1 说明 p比q小
// printf("strcmp(q,p) 输出%d\n", strcmp(q,p)); // 输出1 说明 q比p 大
if ((strcmp(p, q)) > 0) // p 比 q 大,交换 pq的值,让小的放前面
{
strcpy(x, p); // 将p的值覆盖到x里面,
strcpy(p, q); // 将q的值覆盖到p
strcpy(q, x); // 将x的值覆盖到q
}
if ((strcmp(p, t)) > 0) // p > t ? 同上,x相当于 temp 辅助交换
{
strcpy(x, p);
strcpy(p, t);
strcpy(t, x);
}
if ((strcmp(q, t)) > 0) // q > t
{
strcpy(x, q);
strcpy(q, t);
strcpy(t, x);
}
printf("%s %s %s\n",p,q,t);
return 0;
}
自己运行正确,但是系统错误
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>//引入sin x,cos x,e^x的库
//使用指向函数的指针变量来复用一个通用函数
int main()
{
char str1[10],str2[10],str3[10];
char *p[3];
int i;
printf("请输入三个字符串\n");
gets(str1);
gets(str2);
gets(str3);
//指针开始指向
p[0]=str1;
p[1]=str2;
p[2]=str3;
//比较大小,交换地址,同时进行
swap(p);
//打印输出
for (i=0;i<3;i++)
{
printf("%s\n",p[i]);
}
//使用指针数组存放指针数
}
swap(char *p[])
{
//
char *temp;
int i,j;
for (i=0;i<3;i++)
{
//printf("%s\n",p[i]);
for (j=i+1;j<3;j++)
{
if (strcmp(p[i],p[j])>0)//交换
{
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
}
}
week8编程作业
1学生成绩
定义一个保存一个学生数据的结构变量,其中包括学号,姓名,性别,家庭住址及3门课的成绩,从键盘输入这些数据并显示出来。
计算三门课的平均成绩并输出。
#include <stdio.h>
struct student {
int num;
char name[20];
char sex[20];
int age;
char addr[20];
float A,B,C,Ave;
} p[2000];
int main()
{
scanf("%d %s %s %s %f %f %f",&p[1].num,&p[1].name,&p[1].sex,&p[1].addr,&p[1].A,&p[1].B,&p[1].C);
p[1].Ave=(p[1].A+p[1].B+p[1].C)/3;
printf("%d %s %s %s %.1f %.1f %.1f %.1f\n",p[1].num,p[1].name,p[1].sex,p[1].addr,p[1].A,p[1].B,p[1].C,p[1].Ave);
}
2人员工资
定义一个结构体,它有姓名、基本工资和岗位工资和工资总额4个成员,声明一个该结构的结构体数组,对齐元素按下表初始化(初始化仅包含以下3个成员),计算获得工资总额,然后打印每个人的姓名和工资总额。
name Basic wage Job position wage
lihong 945 1400
liuqiang 920 1450
#include <stdio.h>
struct worker
{
char name[20];
int BW,JW;
}
sw[2]= {
{"lihong",945,1400},
{"liuqiang",920,1450}
};
int main()
{
int i;
for(i=0;i<=1;i++)
{
printf("%s %d\n",sw[i].name,sw[i].BW+sw[i].JW);
}
return 0;
}
3输出结构体中工资最低和最高的对应工人
在上题结构体定义的基础上,在主函数main中输入5个人的信息,然后输出应发工资总额、工资数最大者和最小者信息。
#include <stdio.h>
struct worker
{
char name[20];
int BW,JW;
}
sw[5];
int main()
{
int i,index1,index2;
for(i=0;i<=4;i++)
{
scanf("%s %d %d",&sw[i].name,&sw[i].BW,&sw[i].JW);
}
//找出最大值
index1=0;
for(i=0;i<=4;i++)
{
if(sw[index1].BW+sw[index1].JW<sw[i].BW+sw[i].JW)
{
index1=i;
}
}
//找出最小值
index2=0;
for(i=0;i<=4;i++)
{
if(sw[index2].BW+sw[index2].JW>sw[i].BW+sw[i].JW)
{
index2=i;
}
}
printf("The largest total wages are:\n");
printf("%s %d %d %d\n",sw[index1].name,sw[index1].BW,sw[index1].JW,sw[index1].BW+sw[index1].JW);
printf("The smallest total wages are:\n");
printf("%s %d %d %d\n",sw[index2].name,sw[index2].BW,sw[index2].JW,sw[index2].BW+sw[index2].JW);
return 0;
}
Warning message
___2.c: In function 'main':
___2.c:14:3: warning: format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[20]' [-Wformat=]
scanf("%s %d %d",&sw[i].name,&sw[i].BW,&sw[i].JW);
4比较日期前后顺序
10分
#include<stdio.h>
struct date
{
int day;
int month;
int year;
};
int isEarlier(struct date date1,struct date date2)
{
if((date1.year<date2.year)
||(date1.year==date2.year&&date1.month<date2.month)
||(date1.year==date2.year&&date1.month==date2.month&&date1.day<date2.day))
return 1;
else return 0;
}
void sort(struct date testDate[], int n)
{
struct date t;
int i,j;
for(i=0;i<n-1;i++)
for(j=0;j<n-i-1;j++)
if((testDate[j].year>testDate[j+1].year)
||(testDate[j].year==testDate[j+1].year&&testDate[j].month>testDate[j+1].month)
||(testDate[j].year==testDate[j+1].year&&testDate[j].month==testDate[j+1].month&&testDate[j].day>testDate[j+1].day))
{
t=testDate[j];testDate[j]=testDate[j+1];testDate[j+1]=t;//结构体可以一整个赋值?
}
}
int main()
{
struct date a[10];
struct date currentDate;
int n,i,j=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d/%d/%d",&a[i].year,&a[i].month,&a[i].day);
}
sort(a,n);
printf("The sorted dates are as follows:\n");
for(i=0;i<n;i++)
{
printf("%d/%d/%d\n",a[i].year,a[i].month,a[i].day);
}
printf("Please enter current date:\n");
scanf("%d/%d/%d",¤tDate.year,¤tDate.month,¤tDate.day);
for(i=0;i<n;i++)
{
if(isEarlier(a[i],currentDate))
j++;
}
if(j==0)
printf("All dates are after the current date. No need to split the date array\n");
else if(j==n)
printf("All dates are before the current date. No need to split the date array\n");
else
{
printf("The date array will be split into two arraies:\n");
printf("The dates before the currentDate is:\n");
for(i=0;i<n;i++)
{
if(isEarlier(a[i],currentDate))
printf("%d/%d/%d\n",a[i].year,a[i].month,a[i].day);
}
printf("The dates after the currentDate is:\n");
for(i=0;i<n;i++)
{
if(!isEarlier(a[i],currentDate))
printf("%d/%d/%d\n",a[i].year,a[i].month,a[i].day);
}
}
}
#include <stdio.h>
typedef struct date
{
char name[32];
int year, month, day;
} DATE;
int main()
{
int n, i, j;
scanf("%d", &n);
DATE d[n], max, t;
max = d[0];
for (i = 0; i < n; i++)
{
scanf("%s %d %d %d", d[i].name, &d[i].year, &d[i].month, &d[i].day);
/* code */
}
for (i = 0; i < n; i++)
{
for (j = i + 1; j < n; j++)
{
if (d[i].month == d[j].month)
{
if (d[j].day < d[i].day)
{
t = d[i];
d[i] = d[j];
d[j] = t;
}
/* code */
}
else if (d[j].month < d[j].month)
{
t = d[i];
d[i] = d[j];
d[j] = t;
/* code */
}
/* code */
}
/* code */
}
for (i = 0; i < n; i++)
{
printf("%s %d %d %d\n", d[i].name, d[i].year, d[i].month, d[i].day);
/* code */
}
}
week9编程作业
1编写程序存整数
编写一个程序,从键盘输入10个整数,并写入idata.txt文件中。
10分
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp;
int a[10];
int i;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
//写入文件
fp=fopen("idata.txt","w+");
for (i=0; i<10; i++)
{
fprintf(fp,"%d ",a[i]);
}
return 0;
}
运行能成但是系统不通过
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp;
int a[10];
// printf("输入10个实型数据:(eg:1.1 2.3)\n");
int i;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
//写入文件
FILE *fpWrite=fopen("idata.txt","w");
if(fpWrite==NULL)
{
return 0;
}
for (i=0; i<10; i++)
{
fprintf(fpWrite,"%d ",a[i]);
}
fputc('\n',fpWrite);
fclose(fpWrite);
fclose(fp);
return 0;
}
2统计文件字符个数
编写程序,用变量count统计文件love.txt中的字符个数.以下文件为示例。注:统计的字符中不包含空格和结束字符EOF
10分
#include <stdio.h>
int main()
{
FILE *fp;
char ch;
long count = 0;
long space=0;
if ((fp = fopen("love.txt", "r")) == NULL)
{
printf(" cannot open file\n");
// exit(0);
}
while((ch = fgetc(fp)) != EOF)//!feof(fp)测流上的文件结束符,如果文件结束,则返回非0值,否则返回0
{
count++;
if(ch == 32)//空格的ASCII码
{
space++;
}
}
printf("The total number of charaecters is:%ld\n", count-space);
fclose(fp);
return 0;
}
附带的一个例题
统计一个文件的字符个数
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fpr;
char name[100] = {0};//存储路径名
int ch;
int number = 0;
int character = 0;
int space = 0;
int total = 0;
scanf("%s",name);
if((fpr = fopen(name,"r")) == NULL)
{
printf("Can't open %s\n",name);
exit(1);
}
while((ch = fgetc(fpr)) != EOF)
{
if(ch>=48 &&ch<=57)//数字的ASCII码
{
number++;
}
if((ch>=65&&ch<=90) || (ch>=97&&ch<=122))//字母的ASCII码
{
character++;
}
if(ch == 32)//空格的ASCII码
{
space++;
}
total++;
}
printf("数字 = %d 字母 = %d 空格 = %d 字符数 = %d\n",number,character,space,total);
return 0;
}
3输入保存键盘输入
输入若干个字符,直到输入’#'结束,将输入的字符以文本方式保存在磁盘中,然后统计文件中字符的个数,并在屏幕上显示这些字符。
10分
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
printf("20\n");
/*char a[100],b[100];
int i,len;
FILE*fp;
for(i=0;i<100;i++){
scanf("%c",&a[i]);
if(a[i]=='#'){
a[i]='\0';
break;}
}
if((fp=fopen("E:\\text.txt","wt+"))==NULL)
{
printf("fail to open file\n");
exit(0);
}
len=strlen(a);
//fwrite(a,sizeof(a),1,fp);
//在文件中写入比字符串长度大的数据块会占用内存,该部分内存未初始化
//未初始化的栈空间用0xCC填充,而未初始化的堆空间用0xCD填充
//而0xCCCC和0xCDCD在中文GB2312编码中分别对应“烫”字和“屯”字
//所以打开文本文件会看见烫烫烫
//显示屏输出时是看不见是因为printf遇休止符就停止输出
//节省内存应该用多少写入多少
fwrite(a,len+1,1,fp);
rewind(fp);
fread(b,len+1,1,fp);
printf("%d\n",len);
printf("%s\n",b);
fclose(fp);*/
return 0;
}
运行成功,但是显示运行时间过长
#include<stdio.h>
#include<stdlib.h>
void writefile(int ch, FILE *fp);
void readfile(int ch, FILE *fp);
int main()
{
FILE *fp; //首先定义文件指针
char ch = 0;
fp = fopen("D:\\f1.txt", "w+");//打开文件,w+表示既可以读取也可以写入
if (fp == 0) //文件打开后需判断是否正确
{
printf("file error\n");
exit(1);
}
writefile(ch, fp);//写
rewind(fp);//rewind函数,把指针移到文件头
readfile(ch, fp);//读
fclose(fp);//关闭
return 0;
}
void writefile(int ch, FILE *fp) //使用函数将键盘键入的字符写入文件,直到遇到字符#为止
{
printf("Enter a text (end with '#'):\n");
ch = getchar();
while (ch != '#')
{
fputc(ch, fp);
ch = getchar();
}
}
void readfile(int ch, FILE *fp) //使用文件读取函数fgetc从该文件中读取字符,并显示出来
{
while ((ch = fgetc(fp)) != EOF)
{
putchar(ch);
}
putchar('\n');
}
成功运行,但显示有死循环
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE* fp;
char ch, filename[20];
printf("请输入文件名:\n");
gets(filename);
if((fp=fopen(filename, "w"))==NULL)
{
printf("error");
return 1;
}
printf("请输入字符:\n");
while((ch=getchar())!='#')
{
fputc(ch,fp);
putchar(ch);
}
printf("\n");
fclose(fp);
return 0;
}
4文件转换
写一个程序,将一个文件复制到另一个文件,用大写字母替换所有小写字母。即将读取Desktop1,用大写字母替换所有小写字母,并写到Desktop2中。题目中给了desktop1和Desktop2
//将fp1所指向的文件的内容复制到fp2所指向的文件里面
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp1,*fp2 ;
char c;
if ((fp1=fopen("Desktop1.txt", "r"))==NULL)//字符串中两个\\相当于一个
{
printf("cannot open\n");
exit(0);//当文件打开失败时,立即退出。原因:后面的代码对文件进行操作会出现错误。
}
if ((fp2=fopen("Desktop2.txt", "w"))==NULL)
{
printf("cannot open\n");
exit(0);
}
while ((c = fgetc(fp1)) != EOF)//当读取的字符不是文件的结束符
{
if ((c >= 'a') && (c <= 'z'))//寻找小写字母
{
c = c - 32;//根据ASCALL码将小写字母转化为大写字母
}
fputc(c,fp2);
}
fclose(fp1);
fclose(fp2);
return 0;
}
C语言难点知识集合
1计算元音与辅音个数
10分
#include <stdio.h>
int main(void)
{
char s[1000];
// printf("请输入一段字符:\n");
gets(s);
int a=0,b=0,i;
for(i=0;s[i]!='\0';i++)
{
if(s[i]>='a'&&s[i]<='z')
{
if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u')
a++;//元音个数
else b++;//辅音个数
}
else if(s[i]>='A'&&s[i]<='Z')
{
if(s[i]=='A'||s[i]=='E'||s[i]=='I'||s[i]=='O'||s[i]=='U')a++;
else b++;
}
}
printf("%d\n",a);//元音个数
printf("%d\n",b);//辅音个数
return 0;
}
附加C语言,计算辅音元音个数空格数字
#include <stdio.h>
int main(void)
{
char s[1000];
// printf("请输入一段字符:\n");
gets(s);
int a=0,b=0,c=0,d=0,i;
for(i=0;s[i]!='\0';i++)
{
if(s[i]>='a'&&s[i]<='z')
{
if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u')
a++;//元音个数
else b++;//辅音个数
}
else if(s[i]>='A'&&s[i]<='Z')
{
if(s[i]=='A'||s[i]=='E'||s[i]=='I'||s[i]=='O'||s[i]=='U')a++;
else b++;
}
else if(s[i]>='0'&&s[i]<='9')
{
c++;
}
else if(s[i]==' ')
{
d++;
}
}
printf("vowel:%d\n",a);
printf("consonant:%d\n",b);
printf("number:%d\n",c);
printf("space:%d",d);
return 0;
}
2找出数组中所有不重复的所有数字
本地编译器没错,但是系统有误6.67分
#include<stdio.h>
int main(void)
{
int arr[32],n,i,j,flag,m;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
for(i=0;i<n;i++)
{
flag=0;
for(j=0;j<n;j++)
{
if(i==j)
{
continue;
}
if(arr[i]==arr[j])
{
flag=1;
break;
}
}
//找出不重复的数字,并且输出
if(!flag)
{
m++;
printf("%d ",arr[i]);
}
}
//都是重复的数字,则输入false
if(m==0)
{
printf("false");
}
printf("\n");
}
3字符串中的第一个唯一字符
【问题描述】
已知具有n个数组元素的一维数组A,请写一个算法,将该数组中所有值为0的元素都依次移到数组的前端,其他元素依次输出。
【输入形式】
第一个数为输入数字的个数,其后为数组的数字
【输出形式】
输出相应的数组
【样例输入】
5 1 2 3 4 0
【样例输出】
0 1 2 3 4
10分
#include<stdio.h>
#include<string.h>
int main()
{
int d=0;
char str[20];
//char *p = str;
gets(str);
d=firstUniqChar(str) ;
printf("%d",d);
}
int firstUniqChar(char * s)
{
int len = strlen(s);
int i = 0;
if(len == 0)
return -1;
int table[26] = {0};
for( i = 0; i < len;i++)
table[s[i] - 'a']++;
for(i = 0; i < len;i++)
{
if(table[s[i] - 'a'] == 1)
return i;
}
return -1;
}
4.将0元素前移
已知具有n个数组元素的一维数组A,请写一个算法,将该数组中所有值为0的元素都依次移到数组的前端,其他元素依次输出。
【输入形式】第一个数为输入数字的个数,其后为数组的数字
【输出形式】输出相应的数组
【样例输入】5 1 2 3 4 0
【样例输出】0 1 2 3 4
void moveZeroes(int* nums, int numsSize)
{
int n = 0;
for(int i =0;i<numsSize;i++)
{
if(nums[i]==0)
{
n = n +1;
}
else
{
nums[i-n]=nums[i];
}
}
for(int i = 1;i<=n;i++)
{
nums[numsSize-i] =0;
}
return nums;
}
附加例题,将所有0的数后移(测试正确,使用双指针)
#include<stdio.h>
void swap(int* a, int* b)
{
int t = *a;
*a = *b, * b = t;
}
void moveZeroes(int* nums, int numsSize)
{
int left = 0, right = 0;
while (right < numsSize)
{
if (nums[right])
{
swap(nums + left, nums + right);
left++;
}
right++;
}
}
int main()
{
int nums[] = { 0,1,0,3,12 };
int numsSize = 5;
int temp,j;
for (j = 0; j < numsSize; j++) printf("%d ", nums[j]);
printf("\n");
moveZeroes(nums, numsSize);
for (j = 0; j < numsSize; j++)printf("%d ", nums[j]);
return 0;
}
#include<stdio.h>
void swap(int* a, int* b)
{
int t = *a;
*a = *b, * b = t;
}
void moveZeroes(int* nums, int numsSize) {
int left = 0, right = 0;
while (right < numsSize) {
if (nums[right]) {
swap(nums + left, nums + right);
left++;
}
right++;
}
}
int main() {
int nums[] = { 0 };
int numsSize ;
int temp,j,i;
scanf("%d",&numsSize);
for( i = 0;i < numsSize; i++) scanf("%d",&nums[i]);
for ( j = 0; j < numsSize; j++) printf("%d ", nums[j]);
moveZeroes(nums, numsSize);
for (j = 0; j < numsSize; j++)printf("%d ", nums[j]);
return 0;
}
C语言期中
1成绩计算及等级转换
小王同学参加了某计算机类课程的考试。考试分为笔试和上机编程测试,满分均为 100 分。
总成绩由笔试成绩 (60%)和上机成绩(40%)组成。如果总成绩在 85-100 分之间,则成绩等级为“优秀”;总成绩在 70-85 分之间, 则成绩等级为“良好”;总成绩在 60-70,则为“及格”;总成绩在 60 分以下则为“不及格”。
编写程序,在键盘上输入小王同学的笔试和上机成绩分数(记为整数),然后计算小王的总成绩(记为整数,不考 虑四舍五入)以及分数等级(不及格(fail)、及格(pass)、良好(good)和优秀(excellent));如果笔试或上机分数输入 为负数或超过 100 分,则提示输入错误(wrong score)。
#include <stdio.h>
int main()
{
int a,b;
int f=0;
scanf("%d%d",&a,&b);
printf("Writing score: %d\n",a);
printf("Testing score: %d\n",b);
f=a*0.6+b*0.4;
if(a>100||a<0||b>100||b<0)
{
printf("Wrong input");
}
else
{
if(f > 85&&f <= 100)
{
printf("Final score is %d, the grade is exellent",f);
}
else if(f >70&&f <= 85)
{
printf("Final score is %d, the grade is good",f);
}
else if(f >60&&f <= 70)
{
printf("Final score is %d, the grade is pass",f);
}
else
//else if(f >0&&f <= 60)
{
printf("Final score is %d, the grade is fail",f);
}
}
return 0;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W5ls04RJ-1654157258514)(E:\Second_Degree\C\图片\image-20220421114631571.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6vMoW58l-1654157258515)(E:\Second_Degree\C\图片\image-20220421115913060.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hcz8DbpL-1654157258515)(E:\Second_Degree\C\图片\image-20220421115955330.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bAq01uu0-1654157258515)(E:\Second_Degree\C\图片\image-20220421120026579.png)]
2计算满足不等式的最大数值
1. 从键盘输入一个整数 m,如果 m 小于 1,输出:输入错误!
2. 如果 m 大于等于 1,则计算满足如下不等式的最大整数 n: 1 2 + 2 2 + 3 2 + ⋯ + 𝑛 2 ≤ m
注意:不能调用除 stdio.h 之外的函数包。
Write a program to input an integer m, if m<1, output “Wrong input!” If m≥1, find the maximum integer n satisfying the following inequality: 1 ^2 + 2^ 2 + 3^ 2 + ⋯ + 𝑛^ 2 ≤ m
#include <stdio.h>
int main()
{
int m,n,j,i=1;
int sum=0;
scanf("%d",&m) ;
if(m<1)
{
printf("Wrong input!");
}
else
{
do
{
i++;
n=j++;
sum+=i*i;
}
while(sum<=m);
printf("The maximum integer satisfing the inequality is %d",n+1);
}
return 0;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kncV1RHi-1654157258516)(E:\Second_Degree\C\图片\image-20220421104812864.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B7RDUUi8-1654157258516)(E:\Second_Degree\C\图片\image-20220421104847350.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8nguaw3j-1654157258522)(E:\Second_Degree\C\图片\image-20220421104909755.png)]
3查找数组元素出现的次数
给定数组 a[10]= {1, 5, 3, 1, 2, 3, 7, 6, 3, 9}。编写程序,从键盘输入 0~9 之间的任意一个数字,查找该数字在数组中 出现的次数、要求用指针方式实现对数组的操作(注:如果未用指针方式,最多得一半分数)。
#include <stdio.h>
int find( int *p, int num);
int main()
{
int a[10]= {1, 5, 3, 1, 2, 3, 7, 6, 3, 9};
int num;
printf("please input any number from 0 to 9:\n");
scanf("%d",&num);
find(a, num);
}
int find( int *p, int num)
{
int n = 0,i = 0;
while(*p)
{
if(*p ==num)
++n;
++p;
}
if(num>=10)
{
printf("wrong input!");
}
else
printf("%d appears %d times",num,n);
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SS07O93Y-1654157258523)(E:\Second_Degree\C\图片\image-20220421110926139.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WXvKI4Sj-1654157258523)(E:\Second_Degree\C\图片\image-20220421111000443.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eh394ntz-1654157258523)(E:\Second_Degree\C\图片\image-20220421111456108.png)]
4求矩阵各行元素之和
编写程序,从键盘输入 2 个正整数 m 和 n (1<=m<=4, 1<=n<=4),然后输入矩阵 a(m 行 n 列)中的元素,将 矩阵的元素按 m 行 n 列方式写入到文件 matrix.txt 中,并分别求出各行元素之和,输出到屏幕上。
#include<stdio.h>
#include <stdlib.h>
int main ()
{
int m,n,i,j,sum=0;
scanf("%d %d",&m,&n);
int a[4][4];
for(i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
scanf ("%d",&a[i][j]);
}
}
//写入文件
FILE *fpWrite=fopen("matrix.txt","w");
if(fpWrite==NULL)
{
return 0;
}
for(i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
fprintf(fpWrite,"%d ",a[i][j]);
}
fputc('\n',fpWrite);
}
fclose(fpWrite);
//计算数组之和
for(i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
sum+=a[i][j];
}
printf("sum of row %d is %d\n",i,sum);
sum=0;
}
return 0;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VONFlfJA-1654157258524)(E:\Second_Degree\C\图片\image-20220421112202220.png)]
5求最大和最小温差值
北京 2019 年 1~12 月的最高和最低气温如下 最高(℃) h={10,14,25,28,37,35,38,32,34,30,17,10} 最低(℃) l={-10,-8,-2,3,10,18,19,18,14,1,-6,-10} 编写程序,实现以下功能:
(1)从键盘输入最高和最低温度,分别存入两个一维数组中;
(2 分别求出 1~12 月中每个月的温差 h_l=|h-l|,存入一个一维数组中,并在屏幕上显示
(3)求出温差最大和最小的月份(假设最大值和最小值均是唯一的) 并在屏幕上显示最大和最小温差,以及相 应的月份
#include <stdio.h>
int main()
{
int h[12], l[12], h_l[12];
int i;
for (i = 0; i < 12; i++)
scanf("%d", &h[i]);
for (i = 0; i < 12; i++)
scanf("%d", &l[i]);
for (i = 0; i < 12; i++)
{
int tmp = h[i] - l[i];
if (tmp < 0)
{
tmp = -tmp;
}
h_l[i] = tmp;
}
int min = 0;
for (i = 0; i < 12; i++)
{
if (h_l[i] < h_l[min])
{
min = i;
}
}
int max = 0;
for (i = 0; i < 12; i++)
{
if (h_l[i] > h_l[max])
max = i;
}
printf("high low diff\n");
for (i = 0; i < 12; i++)
{
printf("%-3d %-3d %-3d\n", h[i], l[i], h_l[i]);
}
printf("Max.diff:%d, Month:%d\n", h_l[max], max + 1);
printf("Min.diff:%d, Month:%d", h_l[min], min + 1);
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gKZr9zYV-1654157258524)(E:\Second_Degree\C\图片\image-20220421121413655.png)]
6判断 Armstrong 数
从键盘输入一个 4 位的 10 进制非负整数,判定其是否为乘方和完全数(Armstrong)
主函数已从键盘读入一个整数,调用函数 checkingAmstrong 判定输入的整数是否为 Amstrong 数,然后输出结果。
编写函数 checking Armstrong,判定该整数是否为 Armstrong 数,若是,则返回 1,否则返回 0。
乘方和完全数的特征是:该数的位数作为乘方的幂次,每位数字的乘方之和等于该数。
a^4+b^4+c^4+d^4=abcd
#include <stdio.h>
#include <math.h>
/****************************************
num: a 4-digit integer number
dn: total number of digits
return value: if num is an Armstrong number, return 1, otherwise return 0
****************************************/
int checkingArmstrong(int num, int dn)
{
int a, b, c, d, number = num;
a = num / 1000;
num %= 1000;
b = num / 100;
num %= 100;
c = num / 10;
num %= 10;
d = num;
if (a*a*a*a + b*b*b*b + c*c*c*c + d*d*d*d == number)
return 1;
return 0;
}
int main()
{
int num, result=0;
scanf("%d",&num);
if (checkingArmstrong(num, 4) == 1)
printf("%d is an Armstrong number.", num);
else
printf("%d is not an Armstrong number.", num);
return 0;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ldShiFkD-1654157258524)(E:\Second_Degree\C\图片\image-20220421115522742.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c3xEFRLd-1654157258524)(E:\Second_Degree\C\图片\image-20220421115609874.png)]
C语言重点习题
week 1 C语言重点
1. 计算元音与辅音个数
【问题描述】Write a program to count the number of vowels and consonants in a string using a pointer.
【输入形式】
输入为一个字符串
【输出形式】
输出两行,第一行元音个数,第二行辅音个数
【样例输入1】
string
【样例输出1】
1
5
【样例输入2】
I love programming
代码块
#include <stdio.h>
int main(void)
{
char s[1000];
// printf("请输入一段字符:\n");
gets(s);
int a=0,b=0,i;
for(i=0;s[i]!='\0';i++)
{
if(s[i]>='a'&&s[i]<='z')
{
if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u')
a++;//元音个数
else b++;//辅音个数
}
else if(s[i]>='A'&&s[i]<='Z')
{
if(s[i]=='A'||s[i]=='E'||s[i]=='I'||s[i]=='O'||s[i]=='U')a++;
else b++;
}
}
printf("%d\n",a);//元音个数
printf("%d\n",b);//辅音个数
return 0;
}
2. 找出数组中所有不重复的所有数字
【问题描述】
找出数组中所有不重复的所有数字,如果没有,则输出false
【输入形式】
第一行为数组元素个数,第二行为数组元素(以空格分隔)
【输出形式】
输出的数组元素
【样例输入1】
4
1 2 2 3
【样例输出1】
1 3
【样例输入2】
4
1 2 4 3
【样例输出2】
1 2 4 3
【样例输入3】
2
1 1
#include<stdio.h>
int main(void)
{
int arr[32],n,i,j,flag,m=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
for(i=0;i<n;i++)
{
flag=0;
for(j=0;j<n;j++)
{
if(i==j)
{
continue;
}
if(arr[i]==arr[j])
{
flag=1;
break;
}
}
if(!flag)
{
m++;
printf("%d ",arr[i]);
}
}
if(m==0)
{
printf("false");
}
printf("\n");
}
3. 字符串中的第一个唯一字符
【问题描述】 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
约束条件:
(1) 0<=S.length<=300000
(2) 字符串中只包含小写字母
【输入形式】 输入一个字符串
【输出形式】 输出索引对应数字
【样例输入1】 leetcode
【样例输出1】 0
#include<stdio.h>
#include<string.h>
int main()
{
int d=0;
char str[20];
//char *p = str;
gets(str);
d=firstUniqChar(str) ;
printf("%d",d);
}
int firstUniqChar(char * s)
{
int len = strlen(s);
int i = 0;
//特殊字符串处理
if(len == 0)
return -1;
int table[20] = {0};
for( i = 0; i < len;i++)
table[s[i] - 'a']++;
for(i = 0; i < len;i++)
{
if(table[s[i] - 'a'] == 1)
return i;
}
return -1;
}
4. 将0元素前移
【问题描述】已知具有n个数组元素的一维数组A,请写一个算法,将该数组中所有值为0的元素都依次移到数组的前端,其他元素依次输出。
【输入形式】第一个数为输入数字的个数,其后为数组的数字
【输出形式】输出相应的数组
【样例输入】5 1 2 3 4 0
【样例输出】0 1 2 3 4
#include<stdio.h>
int main(){
int a[100],b[100],n,i,j=0;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n;i++){
if(a[i]==0){
b[j++]=0;
}
}
for(i=0;i<n;i++){
if(a[i]!=0){
b[j++]=a[i];
}
}
for(i=0;i<n;i++){
printf("%d ",b[i]);
}
}
5. 课程信息系统
【问题描述】
有N个学生,学生的信息包括姓名,学号,性别,三门课的成绩,要求从键盘输入n个学生的信息,设计程序,
(1) 计算每个学生的三门课的总成绩,
(2) 计算学生每门课的最高分和最低分
(3) 计算学生总成绩的最高分和最低分
(4) 按总成绩从高到低进行排序
约束条件:
1<N<50
学生成绩在0到100分之间
【输入形式】
学生人数 N
姓名 学号 性别 A成绩 B成绩 C成绩
……
【输出形式】
学生1总成绩 学生2总成绩 ……
学生1最高分 学生1最低分 学生2最高分 学生2最低分 ……
总成绩最高分 总成绩最低分
学生1 学生2 ……
【样例输入】
2
Alice 101 female 90 92 91
Bob 102 male 95 92 91
【样例输出】
273 278
92 90 95 91
278 273
Bob Alice
#include <stdio.h>
#include<stdlib.h>
typedef struct Student
{
char num[10];
char name[20];
char gen[10];
int score[3];
int sum;
}STU;
int main()
{
int n;
STU stu[50];
int i,j,max=0,min=300;
int sum[3]={0,0,0},m[50][2];
scanf("%d\n",&n);
for(i=0;i<n;i++)
{
scanf("%s %s %s %d %d %d",stu[i].name,stu[i].num,stu[i].gen,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
}
for(i=0;i<n;i++)
{
stu[i].sum=stu[i].score[0]+stu[i].score[1]+stu[i].score[2];
printf("%d ",stu[i].sum);
}
printf("\n");
for(i=0;i<n;i++){
m[i][0]=100;
m[i][1]=0;
for(j=0;j<3;j++){
if(m[i][0]>stu[i].score[j]){
m[i][0]=stu[i].score[j];
}
if(m[i][1]<stu[i].score[j]){
m[i][1]=stu[i].score[j];
}
}
printf("%d %d ",m[i][1],m[i][0]);
}
printf("\n");
for(i=0;i<n;i++){
if(max<stu[i].sum){
max=stu[i].sum;
}
if(min>stu[i].sum){
min=stu[i].sum;
}
}
printf("%d %d\n",max,min);
int gao=0,flag;
for(j=0;j<n;j++){
for(i=0;i<n;i++){
if(gao<stu[i].sum){
gao=stu[i].sum;
flag=i;
}
}
printf("%s ",stu[flag].name);
stu[flag].sum=0;
gao=0;
}
return 0;
}
6. 山形数组
【问题描述】 判断一个数组是否为山形数组
山形数组:0 2 3 4 5 2 3
非山形数组:0 2 3 3 4 4 5 2
【输入形式】 第一行为数组长度 第二行为数组元素,以空格分隔
【输出形式】 true 或者 false
【样例输入1】 5
1 2 3 2 1
【样例输出1】
true
【样例输入2】
5
1 2 3 3 1
【样例输出2】
false
#include<stdio.h>
int fun(int arr[],int n)
{
if(n<3) return 0;
int i=0;
while(i<n-1&&arr[i]<arr[i+1])i++;
if(i==n-1||i==0) return 0;
while(i<n-1&&arr[i]>arr[i+1])i++;
return i==n-1;
}
int main()
{
int n,i;
scanf("%d",&n);
int arr[n];
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
int a=fun(arr,n);
if(a) printf("true\n");
else printf("false\n");
}
7. 自定义字典序
【问题描述】
某种外星语也使用英文小写字母,但可能顺序 order 不同。字母表的顺序(order)是一些小写字母的排列。给定一组用外星语书写的单词 words,以及其字母表的顺序 order,只有当给定的单词在这种外星语中按字典序排列时,返回 true;否则,返回 false。
【输入形式】 words的数目n
n 个 words
字母表顺序order
【输出形式】
true 或者 false
【样例输入1】
2
hello
leetcode
hlabcdefgijkmnopqrstuvwxyz
【样例输出1】
true
【样例说明1】
在该语言的字母表中,'h' 位于 'l' 之前,所以单词序列是按字典序排列的。
【样例输入2】
3
word
world
row
worldabcefghijkmnpqstuvxyz
【样例输出2】
false
【样例说明2】
在该语言的字母表中,'d' 位于 'l' 之后,那么 words[0] > words[1],因此单词序列不是按字典序排列的。
【样例输入3】
2
apple
app
abcdefghijklmnopqrstuvwxyz
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int dic[26];
int check(char words[],char words2[])
{
int len1=strlen(words),len2=strlen(words2);
int i,j;
int t1,t2;
for(i=0,j=0;i<len1&&j<len2;i++,j++)
{
t1=words[i]-'a';
t2=words2[j]-'a';
if(t1!=t2)
{
return dic[t1]-dic[t2];
}
}
if(i<len1) return 1;
if(j<len2)return -1;
return 0;
}
int sort(char **words,int n,char order[])
{
int i;
for(i=0;i<26;i++)
{
dic[order[i]-'a']=i;
}
for(i=1;i<n;i++)
{
if(check(words[i-1],words[i])>0)
return 0;
}
return 1;
}
int main()
{
char **words=NULL;
char order[26];
int n,i;
scanf("%d",&n);
words=(char**)malloc(sizeof(char*)*n);
for(i=0;i<n;i++)
{
*(words+i)=(char*)malloc(sizeof(char)*26);
scanf("%s",words[i]);
}
scanf("%s",order);
if(sort(words,n,order)) printf("true\n");
else printf("false");
}
C语言期末复习
字母大小写转换
#include <stdio.h>
int main(void)
{
//ASCII码表中:
// A-Z: 65-90
//a-z: 97-122
char cLetter;
char cDifference = 'a' - 'A'; // 计算出大写字母与小写字母的ASCII值的差,97-65等于32
printf("请输入要转换的字母: ");
scanf(" %c", &cLetter);
if (cLetter - 'Z' <= 0) // 如果不是大写字母,则进行转换成小写字母
cLetter += cDifference;
else // 如果是小写,则进行转换成大写字母
cLetter -= cDifference;
printf("%c", cLetter);
printf("\n");
return 0;
}
#include"stdio.h"
int main()
{
float a,b,c;
scanf("%f,%f,%f",&a,&b,&c);//输入以逗号分隔开
printf("%.2f\n",(a+b+c)/3);//%f是小数点后6位精度
}
删除字符串中的数字(P140)
#include"stdio.h"
int main()
{
int i,n=0;
char s[]="f65dhbs8bf*";
for(i=0;s[i];i++)
{
if(s[i]<'0'||s[i]>'9')
s[n++]=s[i];
}
s[n]='\0';//必须要加这个,不然就是 fdhbsbf*bf*
for(i=0;s[i];i++)
{
printf("%c",s[i]);
}
}
数组赋值
char a[]="abcd",*p=a;
printf("%d",*(p+4));
//自动补0,编译成功
char str2[]={'I','a','m','','f','i','n','e'}
printf("%d",*(p+4));
//不会自动补0,数组越界,编译失败
字符串数组赋值
1、定义的时候直接用字符串赋值
char a[10]="hello";
注意:不能先定义再给它赋值,如char a[10]; a[10]="hello";这样是错误的!
2、对数组中字符逐个赋值
char a[10]={'h','e','l','l','o'};
3、利用strcpy
char a[10]; strcpy(a, "hello");
不允许
1、char a[10]; a[10]="hello";//一个字符怎么能容纳一个字符串?况且a[10]也是不存在的!
2、char a[10]; a="hello";//这种情况容易出现,a虽然是指针,但是它已经指向在堆栈中分配的10个字符空间,现在这个情况a又指向数据区中的hello常量,这里的指针a出现混乱,不允许!
还有:不能使用关系运算符“==”来比较两个字符串,只能用strcmp() 函数来处理。
#include <stdio.h> /* 函数声明 */
void func1(void);
static int count=10; /* 全局变量 - static 是默认的 */
int main()
{
while (count--)
{
func1();
} return 0;
}
void func1(void)
{ /* 'thingy' 是 'func1' 的局部变量 - 只初始化一次 * 每次调用函数 'func1' 'thingy' 值不会被重置。 */
static int thingy=5;
thingy++;
printf(" thingy 为 %d , count 为 %d\n", thingy, count);
}
取于符号
int main()
{
float c,a=4.5;
c=(a/2.0);//c=0.500000
printf("%.1f",c);
}
a是float型,a=1,a/2
文件统计字符
#include <stdio.h>
int main()
{
FILE *fp;
char ch;
long count = 0;
long space=0;
if ((fp = fopen("love.txt", "r")) == NULL)
{
printf(" cannot open file\n");
// exit(0);
}
while((ch = fgetc(fp)) != EOF)//!feof(fp)测流上的文件结束符,如果文件结束,则返回非0值,否则返回0
{
count++;
if(ch == 32)//空格的ASCII码
{
space++;
}
}
printf("The total number of charaecters is:%ld\n", count-space);
fclose(fp);
return 0;
}
//
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fpr;
char name[100] = {0};//存储路径名
int ch;
int number = 0;
int character = 0;
int space = 0;
int total = 0;
scanf("%s",name);
if((fpr = fopen(name,"r")) == NULL)
{
printf("Can't open %s\n",name);
exit(1);
}
while((ch = fgetc(fpr)) != EOF)
{
if(ch>=48 &&ch<=57)//数字的ASCII码
{
number++;
}
if((ch>=65&&ch<=90) || (ch>=97&&ch<=122))//字母的ASCII码
{
character++;
}
if(ch == 32)//空格的ASCII码
{
space++;
}
total++;
}
printf("数字 = %d 字母 = %d 空格 = %d 字符数 = %d\n",number,character,space,total);
return 0;
}
字符数组的输入
#include<stdio.h>
int main()
{
char s[10];
scanf("%s",s);
printf("%s",s);
return 0;
}
字符串的统计
#include <stdio.h>
int main()
{
char a;
int i = 0;
int number = 0; //数字个数
int space = 0; //空格个数
int letters = 0; //字母个数
int other = 0; //其他个数
while((a=getchar())&&a!='\n')
{
if(a >= '0' && a <= '9')
{
number++;
}else if(a == ' ')
{
space ++;
}else if((a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z'))
{
letters ++;
}else
{
other++;
}
}
printf("英文字母个数为:%d\n", letters );
printf("数字个数为:%d\n", number);
printf("空格个数为:%d\n", space );
printf("其他个数为:%d\n", other);
return 0;
}
check(char words[],char words2[])
{
int len1=strlen(words),len2=strlen(words2);
int i,j;
int t1,t2;
for(i=0,j=0;i<len1&&j<len2;i++,j++)
{
t1=words[i]-‘a’;
t2=words2[j]-‘a’;
if(t1!=t2)
{
return dic[t1]-dic[t2];
}
}
if(i<len1) return 1;
if(j<len2)return -1;
return 0;
}
int sort(char *words,int n,char order[])
{
int i;
for(i=0;i<26;i++)
{
dic[order[i]-‘a’]=i;
}
for(i=1;i<n;i++)
{
if(check(words[i-1],words[i])>0)
return 0;
}
return 1;
}
int main()
{
char words=NULL;
char order[26];
int n,i;
scanf(“%d”,&n);
words=(char)malloc(sizeof(char)*n);
for(i=0;i<n;i++)
{
(words+i)=(char)malloc(sizeof(char)*26);
scanf(“%s”,words[i]);
}
scanf(“%s”,order);
if(sort(words,n,order)) printf(“true\n”);
else printf(“false”);
}
## C语言期末复习
### 字母大小写转换
~~~c
#include <stdio.h>
int main(void)
{
//ASCII码表中:
// A-Z: 65-90
//a-z: 97-122
char cLetter;
char cDifference = 'a' - 'A'; // 计算出大写字母与小写字母的ASCII值的差,97-65等于32
printf("请输入要转换的字母: ");
scanf(" %c", &cLetter);
if (cLetter - 'Z' <= 0) // 如果不是大写字母,则进行转换成小写字母
cLetter += cDifference;
else // 如果是小写,则进行转换成大写字母
cLetter -= cDifference;
printf("%c", cLetter);
printf("\n");
return 0;
}
#include"stdio.h"
int main()
{
float a,b,c;
scanf("%f,%f,%f",&a,&b,&c);//输入以逗号分隔开
printf("%.2f\n",(a+b+c)/3);//%f是小数点后6位精度
}
删除字符串中的数字(P140)
#include"stdio.h"
int main()
{
int i,n=0;
char s[]="f65dhbs8bf*";
for(i=0;s[i];i++)
{
if(s[i]<'0'||s[i]>'9')
s[n++]=s[i];
}
s[n]='\0';//必须要加这个,不然就是 fdhbsbf*bf*
for(i=0;s[i];i++)
{
printf("%c",s[i]);
}
}
数组赋值
char a[]="abcd",*p=a;
printf("%d",*(p+4));
//自动补0,编译成功
char str2[]={'I','a','m','','f','i','n','e'}
printf("%d",*(p+4));
//不会自动补0,数组越界,编译失败
字符串数组赋值
1、定义的时候直接用字符串赋值
char a[10]="hello";
注意:不能先定义再给它赋值,如char a[10]; a[10]="hello";这样是错误的!
2、对数组中字符逐个赋值
char a[10]={'h','e','l','l','o'};
3、利用strcpy
char a[10]; strcpy(a, "hello");
不允许
1、char a[10]; a[10]="hello";//一个字符怎么能容纳一个字符串?况且a[10]也是不存在的!
2、char a[10]; a="hello";//这种情况容易出现,a虽然是指针,但是它已经指向在堆栈中分配的10个字符空间,现在这个情况a又指向数据区中的hello常量,这里的指针a出现混乱,不允许!
还有:不能使用关系运算符“==”来比较两个字符串,只能用strcmp() 函数来处理。
#include <stdio.h> /* 函数声明 */
void func1(void);
static int count=10; /* 全局变量 - static 是默认的 */
int main()
{
while (count--)
{
func1();
} return 0;
}
void func1(void)
{ /* 'thingy' 是 'func1' 的局部变量 - 只初始化一次 * 每次调用函数 'func1' 'thingy' 值不会被重置。 */
static int thingy=5;
thingy++;
printf(" thingy 为 %d , count 为 %d\n", thingy, count);
}
取于符号
int main()
{
float c,a=4.5;
c=(a/2.0);//c=0.500000
printf("%.1f",c);
}
a是float型,a=1,a/2
文件统计字符
#include <stdio.h>
int main()
{
FILE *fp;
char ch;
long count = 0;
long space=0;
if ((fp = fopen("love.txt", "r")) == NULL)
{
printf(" cannot open file\n");
// exit(0);
}
while((ch = fgetc(fp)) != EOF)//!feof(fp)测流上的文件结束符,如果文件结束,则返回非0值,否则返回0
{
count++;
if(ch == 32)//空格的ASCII码
{
space++;
}
}
printf("The total number of charaecters is:%ld\n", count-space);
fclose(fp);
return 0;
}
//
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fpr;
char name[100] = {0};//存储路径名
int ch;
int number = 0;
int character = 0;
int space = 0;
int total = 0;
scanf("%s",name);
if((fpr = fopen(name,"r")) == NULL)
{
printf("Can't open %s\n",name);
exit(1);
}
while((ch = fgetc(fpr)) != EOF)
{
if(ch>=48 &&ch<=57)//数字的ASCII码
{
number++;
}
if((ch>=65&&ch<=90) || (ch>=97&&ch<=122))//字母的ASCII码
{
character++;
}
if(ch == 32)//空格的ASCII码
{
space++;
}
total++;
}
printf("数字 = %d 字母 = %d 空格 = %d 字符数 = %d\n",number,character,space,total);
return 0;
}
字符数组的输入
#include<stdio.h>
int main()
{
char s[10];
scanf("%s",s);
printf("%s",s);
return 0;
}
字符串的统计
#include <stdio.h>
int main()
{
char a;
int i = 0;
int number = 0; //数字个数
int space = 0; //空格个数
int letters = 0; //字母个数
int other = 0; //其他个数
while((a=getchar())&&a!='\n')
{
if(a >= '0' && a <= '9')
{
number++;
}else if(a == ' ')
{
space ++;
}else if((a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z'))
{
letters ++;
}else
{
other++;
}
}
printf("英文字母个数为:%d\n", letters );
printf("数字个数为:%d\n", number);
printf("空格个数为:%d\n", space );
printf("其他个数为:%d\n", other);
return 0;
}