C语言练习题目(部分)
VC++6.0操作
shift + f5 : 在调试过程退出调试
C语言字符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zsr7PpAv-1650073101425)(C:\Users\86136\OneDrive\图片\屏幕快照\屏幕截图 2022-04-05 152315.png)]
指针
输出月份英文名称
#include<stdio.h>
int main()
{
char *a[]={"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; //要用*a[]; //不可以是a[12]
int n;
printf("Please input a month number:\n");
scanf("%d",&n);
if(n>12||n<1)
{
printf("Input Error!");
}
else{
printf("This month's English name is %s.\n",a[n-1]);
}
return 0;
}
###提词排序输出(难)
排序??
#include <stdio.h>
#include <string.h>
int GetWords(char *sentence, char *words[]);
void SortStrings(const char *strs[], int count);
int main()
{
char str[200];
int nWords = 0;
char *words[20];
int i;
printf("input a string: ");
gets(str);
nWords = GetWords(str, words);
SortStrings(words, nWords);
puts("output:");
for(i=0; i<nWords; i++)
puts(words[i]);
return 0;
}
int GetWords(char *str, char *words[]) //写一个分词函数,提取出一个英文句子中的所有单词,保存到一个单词数组中
{
/******start******/
int i,cnt =0;
char ch=' ';
for(i=0;str[i]!='\0';i++)
{
if(ch==' '&&str[i]!=' ')
{
words[cnt]=str+i; //存单词
ch=str[i];
cnt++;
}
else if(str[i]==' ')
{
ch=str[i];
str[i]='\0';
}
else if(str[i]=='.')
{
str[i]='\0';
break;
}
}
return cnt;
/******end******/
}
void SortStrings(const char *strs[], int count) //另写一个排序函数对字符串数组进行升序排序。在主函数中调用分词函数得到单词数组,调用排序函数对单词排序,然后在主函数中输出各单词。
{ //count: 单词的数量
/******start******/
int i,j;
const char *tmp;
for(i=0;i<count;i++)
{
for(j=0;j<count-i-1;j++)
{
if (strcmp(strs[j], strs[j+1]) > 0)
{
tmp=strs[j];
strs[j]=strs[j+1];
strs[j+1]=tmp;
}
}
}
/******end******/
}
#include <stdio.h>
#include <string.h>
int GetWords(char *sentence, char *words[]);
void SortStrings(const char *strs[], int count);
int main()
{
char str[200];
int nWords = 0;
char *words[20];
int i;
printf("input a string: ");
gets(str);
nWords = GetWords(str, words);
SortStrings(words, nWords);
puts("output:");
for(i=0; i<nWords; i++)
puts(words[i]);
return 0;
}
//读出单词
int GetWords(char *str, char *words[]) //char *str ;字母总数 char *words[] : 单词个数
{
/******start******/
int i,cnt=0;
char ch=' ';
for(i=0;str[i]!='\n';i++) // str[i]!='\n' 读到结尾
{
if(ch==' '&&str[i]!=' ')
{
words[cnt]=str+i; //单词计数
ch=str[i]; //ch 还是空字符
cnt++;
}
else if (str[i] == ' ')
{
ch = str[i];
str[i] = '\0';
}
else if(str[i]=='.')
{
ch = str[i];
str[i]='\0';
break;
}
}
return cnt; //返回有多少个单词
}
/******end******/
void SortStrings(const char *strs[], int count)
{
/******start******/
int i,j;
const char *tmp; // const 常量
for(i=0;i<count;i++)
{
for(j=0;j<count-i-1;j++)
{
if(strcmp(strs[j],strs[j+i])>0)
{
tmp=strs[j];
strs[j]=strs[j+1];
strs[j+1]=tmp;
}
}
}
/******end******/
}
从小到大排序5个字符串(冒泡)
#include <stdio.h>
#include <string.h>
int main()
{void sort(char *name[ ],int n);
void print(char *name[ ],int n);
char *name[5];
char a[31],b[31],c[31],d[31],e[31];
int n=5,i;
name[0]=a;name[1]=b;name[2]=c;name[3]=d;name[4]=e;
printf("Please input 5 strings:");
for(i=0;i<5;i++) //输入
{
gets(name[i]);
}
printf("Output:\n");
sort(name,n);
printf("After the strings are sorted the result:\n");
print(name,n);
return 0;
}
void sort(char *name[ ],int n)
{
char *temp;
int i,j,k;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(strcmp(name[k],name[j])>0) //比较两个字符串的第一个字母 第n个和第n+1个比较,冒泡排序 ,比较的是第一个字符的ASCII码,越靠后ASCII码越大 ,小写比大写大
{
k=j;
}
}
if(k!=i)
{
temp=name[i]; name[i]=name[k]; name[k]=temp;
}
}
}
void print(char *name[ ],int n)
{int i;
for(i=0;i<n;i++)
printf("%s\n",name[i]);
}
#include <stdio.h>
#include <string.h>
int main()
{void sort(char *name[ ],int n);
void print(char *name[ ],int n);
char *name[5];
char a[31],b[31],c[31],d[31],e[31];
int n=5,i;
name[0]=a;name[1]=b;name[2]=c;name[3]=d;name[4]=e;
printf("Please input 5 strings:");
for(i=0;i<5;i++)
{
gets(name[i]); //输入5个字符串
}
printf("Output:\n");
sort(name,n);
printf("After the strings are sorted the result:\n");
print(name,n);
return 0;
}
void sort(char *name[ ],int n)
{
char *temp;
int i,j,k;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(strcmp(name[k],name[j])>0)
{
k=j;
}
if(k!=i)
{
temp=name[i];
name[i]=name[k];
name[k]=temp;
}
}
}
void print(char *name[ ],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%s\n",name[i]);
}
}
指针数组输出输入的数据
for(i=0,p=a;i<5;p++,i++)
#include <stdio.h>
int main()
{
int a[5];
int *p,i;
printf("please enter 5 integer numbers:");
for(i=0;i<5;i++)
{
scanf("%d",&a[i]);
}
printf("Output:\n");
/******start******/
for(i=0,p=a;i<5;p++,i++)
/******end******/
{
printf("%d ",*p);
}
printf("\n");
return 0;
}
###用指针方法输入输出数组元素——堆区开辟空间(注意)
malloc()是<stdlib.h>库中的函数,作用是分配所需的内存空间,并返回一个指向它的指针。
a=(int*)malloc(5*sizeof(int));
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *a;
int i;
printf("please enter 5 integer numbers:");
/******start******/
a=(int*)malloc(5*sizeof(int));
/******end******/
for(i=0;i<5;i++)
{
/******start******/
scanf("%d",a+i);
/******end******/
}
printf("Output:\n");
for(i=0;i<5;i++)
{
/******start******/
printf("%d",*(a+i));
/******end******/
}
printf("\n");
return 0;
}
结构体
成绩排序 —— 结构体+冒泡
#include<stdio.h>
struct student
{
int number;
int score;
};
int main()
{
int n;
int i;
int j;
struct student st[100];
struct student tmp;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&st[i].number,&st[i].score);
}
//冒泡排序
for(i = 0; i < n - 1; i ++)
{
for(j = 0; j < n - i - 1; j ++)
{
if(st[j].score>st[j+1].score)
{
tmp=st[j];
st[j]=st[j+1];
st[j+1]=tmp;
}
else if(st[j].score==st[j+1].score)
{
if(st[j].number>st[j+1].number)
{
tmp = st[j];
st[j] = st[j+1];
st[j+1] = tmp;
}
}
}
}
printf("Output:\n");
for(i=0;i<n;i++)
{
printf("%d %d\n",st[i].number,st[i].score);
}
return 0;
}
#include<stdio.h>
#include<stdlib.h>
struct student
{
int number;
int score;
};
int main()
{
struct student students[101];
int i,j;
int n;
struct student temp;
scanf("%d",&n);
while(n!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%d%d",&students[i].number,&students[i].score);
}
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(students[j].score>students[j+1].score)
{
temp=students[j];
students[j]=students[j+1];
students[j+1]=temp;
}
else if(students[j].score==students[j+1].score)
{
if(students[j].number>students[j+1].number)
{
temp=students[j];
students[j]=students[j+1];
students[j+1]=temp;
}
}
}
}
printf("Output:\n");
for(i=0;i<n;i++)
{
printf("%d %d\n",students[i].number,students[i].score);
}
}
return 0;
}
输出职员信息
自己写的,没用typedef
#include<stdio.h>
/******start******/
struct num
{
int number;
char name[20];
double prize;
};
int main()
{
int i,n;
struct num em[50];
printf("Input the number(<50):\n"); //(<50)
scanf("%d",&n);
printf("Input the info:\n");
for(i=0;i<n;i++)
{
scanf("%d%s%lf",&em[i].number,em[i].name,&em[i].prize);
}
/******end******/
printf("Output:\n");
printf("number\tname\tprize\n");
for (i = 0; i < n; i++)
{
printf("%d\t", em[i].number);
printf("%s\t", em[i].name);
printf("%.2f\n", em[i].prize);
}
return 0;
}
答案 : typedef
typedef struct _employee
{
int number;
char name[20];
double prize;
} Employee;
int main(void)
{
int i, n;
Employee em[50];
printf("Input the number(<50):\n");
scanf("%d", &n);
printf("Input the info:\n");
for (i = 0; i < n; i++)
{
scanf("%d%s%lf", &em[i].number, em[i].name, &em[i].prize);
}
投票(难)
#include<stdio.h>
#include<string.h>
struct person {
char name[20];
int count;
}leader[3] = {"Li", 0, "Zhang", 0, "Fun", 0};
int main()
{
int i,j;
int n;
char leader_name[20];
printf("Please input total number:\n");
scanf("%d",&n);
printf("Please input the candidate's name:\n");
for(i=0;i<n;i++)
{
scanf("%s",leader_name);
for(j=0;j<3;j++)
{
if(strcmp(leader_name,leader[j].name)==0) //重点
{
leader[j].count++;
//第二重for来匹配投票人与票
}
}
}
printf("Output:\nThe result is:\n");
for (i = 0;i < 3;i++)
{
printf("%s:%d\n", leader[i].name, leader[i].count);
}
return 0;
}
歌咏比赛(难)
#include<stdio.h>
struct singer
{
int n;
int s[6];
double a;
};
int main(void)
{
int i,j,max,min,sum;
int n=10;
struct singer people[10];
struct singer temp;
printf("Please input singer's score:");
for(i=0;i<10;i++)
{
people[i].n=i+1;
}
//输入成绩
for(i=0;i<10;i++)
{
for(j=0;j<6;j++)
{
scanf("%d",&people[i].s[j]);
if(people[i].s[j]>10||people[i].s[j]<0);
{
printf("\n成绩必须为10分制:");
return 0;
}
}
}
//求平均成绩
for(i=0;i<10;i++)
{
sum=0;
min=max=people[i].s[0];
for(j=0;j<6;j++)
{
if(min>people[i].s[j])
{
min=people[i].s[j];
}
if(max<people[i].s[j])
{
max=people[i].s[j];
}
sum+=people[i].s[j];
}
people[i].a=(float)((sum-max-min)/4);
}
//排序
for(i=0;i<10;i++)
{
for(j=0;j<10-i-j;j++)
{
if(people[j].a<people[j+1].a)
{
temp=people[j];
people[j]=people[j+1];
people[j+1]=temp;
}
}
}
//成绩输出
printf("output:\nscores:\n");
for(i=0;i<10;i++)
{
printf("No.%d:%2f\n",people[i].n,people[i].a);
}
return 0;
}
动物信息(简单)
#include<stdio.h>
struct animal
{
/******start******/
int No;
char name[20];
int count;
};
int main()
{
int i;
int n;
struct animal ani[50];
printf("Input the number(<50):\n"); // !!! (<50)
scanf("%d",&n);
printf("Input the info:\n");
for(i=0;i<n;i++)
{
scanf("%d%s%d",&ani[i].No,ani[i].name,&ani[i].count);
//注意 & !!!
}
/******end******/
printf("Output:\n");
printf("No\tname\tnumber\n");
for (i = 0; i < n; i++)
{
printf("%d\t", ani[i].No);
printf("%s\t", ani[i].name);
printf("%d\n", ani[i].count);
}
return 0;
}
输出学生的基本信息(简单)
#include<stdio.h>
/******start******/
struct student
{
int number;
char name[20];
int age;
double score;
};
/******end******/
int main(void)
{
struct student st1;
printf("Input the info:\n");
scanf("%d%s%d%lf", &st1.number, st1.name, &st1.age, &st1.score);
printf("Output:\n");
/******start******/
printf("number:%d\n",st1.number);
printf("name:%s\n",st1.name);
printf("age:%d\n",st1.age);
printf("score:%.2lf\n",st1.score);
/******end******/
return 0;
}
文件
fopen("sp.dat","rb");
fopen(name,"r");
fgetc() : //指定的流 stream 获取下一个字符
fgets(str,11,fp); //指定的流 stream 读取一行
文本
fprintf(fp,"%4d",i)
fscanf(fp,"%d",&a[i]);
二进制
fread(&goods[i],sizeof(struct good),1,fp);
fwrite(&f2,sizeof(int),1,fp);
读取文本文件 fgetc()
fp=fopen(name,"r");
docker=fgetc(fp);
putchar(docker);
fclose(fp);
#include<stdio.h>
int main()
{
int i;
int n;
char name[20];
FILE *fp;
char docker; //用来装读取的字符
printf("Input filename:");
scanf("%s",name);
printf("Input n:");
scanf("%d",&n);
printf("Output:\n");
fp=fopen(name,"r"); //打开文本文件
if(fp==NULL) //注意是 ==
{
printf("Open Error!\n");
return 0;
}
for(i=0;i<n;i++)
{
docker=fgetc(fp);
putchar(docker);
}
fclose(fp);
printf("\n");
return 0;
}
按要求写入文件并且输出(函数+文件)
fp=fopen("lb8204.txt","w"); //"w" 文本文件读取
if(i%7==0||i%10==7||i/100%10==7||i/10%10==7)
// 整除 2位数十位 百位 十位
注意
if(i%7==0||i%10==7||i/100%10==7||i/10%10==7)
// 整除 2位数十位 百位 十位
fprintf() 文本文件输出
“w” 文本文件写入
#include <stdio.h>
#include <stdlib.h>
void save(int n);
void out(void);
int main(void)
{
int n;
printf("Input n:");
scanf("%d", &n);
save(n);
out();
return 0;
}
void save(int n)
{
/******start******/
int i;
int cnt=0; //计数
FILE *fp;
fp=fopen("lb8204.txt","w"); //"w" 文本文件读取
for(i=0;i<1000;i++) // ' / ' 除号 ‘ % ’取余
{
if(i%7==0||i%10==7||i/100%10==7||i/10%10==7)
// 整除 2位数十位 百位 十位
{
fprintf(fp,"%4d",i); //文本文件打印输出 %4d 右靠齐空四位
cnt++;
if(cnt==n) //输出到第n个数截止
{
fclose(fp);
return ; //不是return 0;
}
if(cnt%10==0) //每行10个数字
{
fprintf(fp,"\n");
}
}
}
fclose(fp);
/******end******/
}
void out(void)
{
char str[48];
char *pch = NULL;
FILE *fp;
fp = fopen("lb8204.txt", "r");
if (fp == NULL)
{
exit(0);
}
printf("Output:\n");
while (!feof(fp))
{
pch = fgets(str, 48, fp);
if (pch == NULL)
{
break;
}
printf("%s", str);
}
printf("\n");
fclose(fp);
}
二进制文件查找商品 结构体+文件(难)
fread(&goods[i],sizeof(struct good),1,fp); //将数据读入数组
while(!feof(fp))
#include<stdio.h>
#include<string.h>
struct good
{
char name[20];
char type[12];
int number;
float price; //不能用double
};
int main()
{
int i=0;
int n;
int flag=0;
char str[20];
struct good goods[100];
FILE *fp;
fp=fopen("sp.dat","rb");
while(!feof(fp))
{
fread(&goods[i],sizeof(struct good),1,fp); //将内容读入数组
i++;
}
n=i;
printf("Please input shang pin pin ming:");
scanf("%s",str);
printf("Output:\ncha zhao qing kuang:\n");
for(i=0;i<n;i++)
{
if(strcmp(goods[i].name,str)==0)
{
printf("%s,%s,%d,%.2f\n",goods[i].name,goods[i].type,goods[i].number,goods[i].price);
flag=1;
}
}
if(flag==0)
{
printf("mei you shang pin %s\n",str);
}
return 0;
}
二进制文件+求和
fread(all,sizeof(int),50,fp); //将数据全部读入all数组中
for(i=a-1;i<b;i++) // -1 数组从零开始
for(i=0;i<50;i++)
{
fread(&arr[i],sizeof(int),1,fp);
} //可以一个个的读
#include<stdio.h>
int main()
{
int i;
int all[50];
int a,b;
int n=0;
FILE *fp;
printf("Input start and end:");
scanf("%d%d",&a,&b);
printf("Output:\n");
fp=fopen("lb8104.dat","rb");
if(fp==NULL)
{
printf("FILE Open Error!\n");
return 0;
}
fread(all,sizeof(int),50,fp); //将数据全部读入all数组中
for(i=a-1;i<b;i++) // -1 从零开始
{
n+=all[i];
}
printf("%d\n",n);
return 0;
}
斐波拉契数列 + 二进制写入读取
算法: n= (n-1)+(n-2)
语法: fp=fopen(str,“wb”);
fwrite(&f1,sizeof(int),1,fp); 变量地址 ,变量大小 , 变量个数 , 文件地址
#include <stdio.h>
#include <stdlib.h>
void save(char str[20], int n);
void prnt(char str[20], int n);
int main()
{
int n;
char str[20];
printf("Input filename:");
scanf("%s", str);
printf("Input n:");
scanf("%d", &n);
save(str, n);
prnt(str, n);
return 0;
}
void save(char str[20], int n)
{
/******start******/
int i;
int f1=1;
int f2=1;
FILE *fp;
fp=fopen(str,"wb"); //写文件
fwrite(&f1,sizeof(int),1,fp);
fwrite(&f2,sizeof(int),1,fp); //逐个字符写入
// if(fp==NULL)
// {
// exit;
// } 写文件不需要
for(i=1;i<n/2;i++) // n/2 每次写入两个
{
f1=f1+f2;
f2=f1+f2;
fwrite(&f1,sizeof(int),1,fp);
fwrite(&f2,sizeof(int),1,fp);
}
fclose(fp);
/******end******/
}
void prnt(char str[20], int n)
{
int i, te;
FILE *fp;
fp = fopen(str, "rb");
if (fp == NULL)
{
exit(0);
}
printf("Output:\n");
for (i = 0; i < n; i++)
{
fread(&te, sizeof(int), 1, fp);
printf("%d ", te);
}
printf("\n");
fclose(fp);
}
文本读取数字库
fgets(str,11,fp); //fgets() 读出一行
for(i=0;i<n*8;i++)
{
fgets(str,11,fp);
}
for(i=0;i<8;i++)
{
fgets(str ,11,fp);
printf("%s",str);
}
#include<stdio.h>
int main()
{
int n;
int i;
char str[20]; //用来装读出的数字
FILE *fp;
printf("Input n:");
scanf("%d",&n);
printf("Output:\n");
fp=fopen("lb8102.txt","r");
if(fp==NULL)
{
printf("OPEN error!");
}
//读到第N个数之前
for(i=0;i<n*8;i++) //每个数字站 8 行
{
fgets(str,11,fp); //fgets() 读取一行
}
//读到第N个数并且输出
for(i=0;i<8;i++)
{
fgets(str,11,fp);
printf("%s",str);
}
return 0;
}
文本读取 第n个数后面相加
#include<stdio.h>
int main()
{
int n;
int i;
int sum=0;
int a[50];
FILE *fp;
printf("Input n:");
scanf("%d",&n);
fp=fopen("lb8101.txt","r");
if(fp==NULL)
{
printf("data error!");
return 0;
}
for(i=0;i<50;i++)
{
fscanf(fp,"%d",&a[i]); //文本文件读取一个
}
for(i=50-n;i<50;i++)
{
sum+=a[i];
}
printf("Output:\n%d\n",sum);
return 0;
}
E *fp;
fp = fopen(str, "rb");
if (fp == NULL)
{
exit(0);
}
printf("Output:\n");
for (i = 0; i < n; i++)
{
fread(&te, sizeof(int), 1, fp);
printf("%d ", te);
}
printf("\n");
fclose(fp);
}
### 文本读取数字库
```c
fgets(str,11,fp); //fgets() 读出一行
for(i=0;i<n*8;i++)
{
fgets(str,11,fp);
}
for(i=0;i<8;i++)
{
fgets(str ,11,fp);
printf("%s",str);
}
#include<stdio.h>
int main()
{
int n;
int i;
char str[20]; //用来装读出的数字
FILE *fp;
printf("Input n:");
scanf("%d",&n);
printf("Output:\n");
fp=fopen("lb8102.txt","r");
if(fp==NULL)
{
printf("OPEN error!");
}
//读到第N个数之前
for(i=0;i<n*8;i++) //每个数字站 8 行
{
fgets(str,11,fp); //fgets() 读取一行
}
//读到第N个数并且输出
for(i=0;i<8;i++)
{
fgets(str,11,fp);
printf("%s",str);
}
return 0;
}
文本读取 第n个数后面相加
#include<stdio.h>
int main()
{
int n;
int i;
int sum=0;
int a[50];
FILE *fp;
printf("Input n:");
scanf("%d",&n);
fp=fopen("lb8101.txt","r");
if(fp==NULL)
{
printf("data error!");
return 0;
}
for(i=0;i<50;i++)
{
fscanf(fp,"%d",&a[i]); //文本文件读取一个
}
for(i=50-n;i<50;i++)
{
sum+=a[i];
}
printf("Output:\n%d\n",sum);
return 0;
}